Skip to content

Commit edb61e1

Browse files
committed
image-api: Stop using dynamic mapping
Even though the problems with dynamic mappings are most prevalent in search-api. I see no reason to keep using it in all places when search-api does not.
1 parent bcd7478 commit edb61e1

File tree

5 files changed

+30
-52
lines changed

5 files changed

+30
-52
lines changed

image-api/src/main/scala/no/ndla/imageapi/ComponentRegistry.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import no.ndla.imageapi.service.search.{
2929
}
3030
import no.ndla.network.NdlaClient
3131
import no.ndla.network.tapir.TapirApplication
32-
import no.ndla.search.{BaseIndexService, Elastic4sClient}
32+
import no.ndla.search.{BaseIndexService, Elastic4sClient, SearchLanguage}
3333

3434
class ComponentRegistry(properties: ImageApiProperties)
3535
extends BaseComponentRegistry[ImageApiProperties]
@@ -41,6 +41,7 @@ class ComponentRegistry(properties: ImageApiProperties)
4141
with ImageIndexService
4242
with SearchService
4343
with ImageSearchService
44+
with SearchLanguage
4445
with TagSearchService
4546
with SearchConverterService
4647
with DataSource

image-api/src/main/scala/no/ndla/imageapi/service/search/ImageIndexService.scala

+24-7
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ import com.sksamuel.elastic4s.ElasticDsl.*
1212
import com.sksamuel.elastic4s.fields.{ElasticField, ObjectField}
1313
import com.sksamuel.elastic4s.requests.indexes.IndexRequest
1414
import com.sksamuel.elastic4s.requests.mappings.MappingDefinition
15-
import com.sksamuel.elastic4s.requests.mappings.dynamictemplate.DynamicTemplateRequest
1615
import com.typesafe.scalalogging.StrictLogging
1716
import no.ndla.common.CirceUtil
1817
import no.ndla.imageapi.Props
1918
import no.ndla.imageapi.model.domain.ImageMetaInformation
2019
import no.ndla.imageapi.model.search.SearchableImage
2120
import no.ndla.imageapi.repository.{ImageRepository, Repository}
21+
import no.ndla.search.SearchLanguage
2222

2323
trait ImageIndexService {
24-
this: SearchConverterService with IndexService with ImageRepository with Props =>
24+
this: SearchConverterService & IndexService & ImageRepository & Props & SearchLanguage =>
2525
val imageIndexService: ImageIndexService
2626

2727
class ImageIndexService extends StrictLogging with IndexService[ImageMetaInformation, SearchableImage] {
@@ -36,6 +36,23 @@ trait ImageIndexService {
3636
Seq(indexInto(indexName).doc(source).id(domainModel.id.get.toString))
3737
}
3838

39+
protected def generateLanguageSupportedFieldList(fieldName: String, keepRaw: Boolean = false): Seq[ElasticField] = {
40+
if (keepRaw) {
41+
SearchLanguage.languageAnalyzers.map(langAnalyzer =>
42+
textField(s"$fieldName.${langAnalyzer.languageTag.toString}")
43+
.fielddata(false)
44+
.analyzer(langAnalyzer.analyzer)
45+
.fields(keywordField("raw"))
46+
)
47+
} else {
48+
SearchLanguage.languageAnalyzers.map(langAnalyzer =>
49+
textField(s"$fieldName.${langAnalyzer.languageTag.toString}")
50+
.fielddata(false)
51+
.analyzer(langAnalyzer.analyzer)
52+
)
53+
}
54+
}
55+
3956
def getMapping: MappingDefinition = {
4057
val fields: Seq[ElasticField] = List(
4158
ObjectField("domainObject", enabled = Some(false)),
@@ -60,12 +77,12 @@ trait ImageIndexService {
6077
)
6178
)
6279

63-
val dynamics: Seq[DynamicTemplateRequest] = generateLanguageSupportedDynamicTemplates("titles", keepRaw = true) ++
64-
generateLanguageSupportedDynamicTemplates("alttexts", keepRaw = false) ++
65-
generateLanguageSupportedDynamicTemplates("captions", keepRaw = false) ++
66-
generateLanguageSupportedDynamicTemplates("tags", keepRaw = false)
80+
val dynamics = generateLanguageSupportedFieldList("titles", keepRaw = true) ++
81+
generateLanguageSupportedFieldList("alttexts") ++
82+
generateLanguageSupportedFieldList("captions") ++
83+
generateLanguageSupportedFieldList("tags")
6784

68-
properties(fields).dynamicTemplates(dynamics)
85+
properties(fields ++ dynamics)
6986
}
7087
}
7188

image-api/src/main/scala/no/ndla/imageapi/service/search/IndexService.scala

+1-42
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,13 @@
99
package no.ndla.imageapi.service.search
1010

1111
import cats.implicits.*
12-
import com.sksamuel.elastic4s.ElasticDsl.*
13-
import com.sksamuel.elastic4s.fields.ElasticField
1412
import com.sksamuel.elastic4s.requests.indexes.IndexRequest
15-
import com.sksamuel.elastic4s.requests.mappings.dynamictemplate.DynamicTemplateRequest
1613
import com.typesafe.scalalogging.StrictLogging
1714
import no.ndla.imageapi.Props
1815
import no.ndla.imageapi.repository.{ImageRepository, Repository}
19-
import no.ndla.search.SearchLanguage.languageAnalyzers
2016
import no.ndla.search.model.domain.{BulkIndexResult, ReindexResult}
21-
import no.ndla.search.{BaseIndexService, Elastic4sClient, SearchLanguage}
17+
import no.ndla.search.{BaseIndexService, Elastic4sClient}
2218

23-
import scala.collection.mutable.ListBuffer
2419
import scala.util.{Failure, Success, Try}
2520

2621
trait IndexService {
@@ -82,41 +77,5 @@ trait IndexService {
8277
}
8378
}
8479
}
85-
86-
/** Returns Sequence of DynamicTemplateRequest for a given field.
87-
*
88-
* @param fieldName
89-
* Name of field in mapping.
90-
* @param keepRaw
91-
* Whether to add a keywordField named raw. Usually used for sorting, aggregations or scripts.
92-
* @return
93-
* Sequence of DynamicTemplateRequest for a field.
94-
*/
95-
protected def generateLanguageSupportedDynamicTemplates(
96-
fieldName: String,
97-
keepRaw: Boolean = false
98-
): Seq[DynamicTemplateRequest] = {
99-
val fields = new ListBuffer[ElasticField]()
100-
if (keepRaw) {
101-
fields += keywordField("raw")
102-
}
103-
val languageTemplates = languageAnalyzers.map(languageAnalyzer => {
104-
val name = s"$fieldName.${languageAnalyzer.languageTag.toString()}"
105-
DynamicTemplateRequest(
106-
name = name,
107-
mapping = textField(name).analyzer(languageAnalyzer.analyzer).fields(fields.toList),
108-
matchMappingType = Some("string"),
109-
pathMatch = Some(name)
110-
)
111-
})
112-
val catchAlltemplate = DynamicTemplateRequest(
113-
name = fieldName,
114-
mapping = textField(fieldName).analyzer(SearchLanguage.standardAnalyzer).fields(fields.toList),
115-
matchMappingType = Some("string"),
116-
pathMatch = Some(s"$fieldName.*")
117-
)
118-
languageTemplates ++ Seq(catchAlltemplate)
119-
}
120-
12180
}
12281
}

image-api/src/main/scala/no/ndla/imageapi/service/search/SearchConverterService.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import no.ndla.network.tapir.auth.TokenUser
3030
import scala.util.{Failure, Success, Try}
3131

3232
trait SearchConverterService {
33-
this: ConverterService with Props =>
33+
this: ConverterService & Props & SearchLanguage =>
3434
val searchConverterService: SearchConverterService
3535

3636
class SearchConverterService extends StrictLogging {

image-api/src/test/scala/no/ndla/imageapi/TestEnvironment.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import no.ndla.imageapi.service.search.{
3434
}
3535
import no.ndla.network.NdlaClient
3636
import no.ndla.network.tapir.TapirApplication
37-
import no.ndla.search.{BaseIndexService, Elastic4sClient}
37+
import no.ndla.search.{BaseIndexService, Elastic4sClient, SearchLanguage}
3838
import org.scalatestplus.mockito.MockitoSugar
3939

4040
trait TestEnvironment
@@ -47,6 +47,7 @@ trait TestEnvironment
4747
with ImageSearchService
4848
with TagSearchService
4949
with SearchConverterService
50+
with SearchLanguage
5051
with DataSource
5152
with ConverterService
5253
with ValidationService

0 commit comments

Comments
 (0)