Skip to content

Commit d3ebec5

Browse files
committed
WIP
1 parent 3d0dbca commit d3ebec5

File tree

4 files changed

+78
-26
lines changed

4 files changed

+78
-26
lines changed

search-api/src/main/scala/no/ndla/searchapi/service/search/MultiDraftSearchService.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ trait MultiDraftSearchService {
159159

160160
boolQuery().should(
161161
List(
162-
langQueryFunc("title", 3),
162+
langQueryFunc("title", 20),
163163
langQueryFunc("introduction", 2),
164164
langQueryFunc("metaDescription", 1),
165165
langQueryFunc("content", 1),

search-api/src/main/scala/no/ndla/searchapi/service/search/MultiSearchService.scala

+33-21
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,21 @@ trait MultiSearchService {
7070
boolQuery().must(
7171
boolQuery().should(
7272
List(
73-
langQueryFunc("title", 6),
74-
langQueryFunc("introduction", 2),
75-
langQueryFunc("metaDescription", 1),
76-
langQueryFunc("content", 1),
77-
langQueryFunc("tags", 1),
78-
langQueryFunc("embedAttributes", 1),
79-
simpleStringQuery(q.underlying).field("authors", 1),
80-
simpleStringQuery(q.underlying).field("grepContexts.title", 1),
81-
nestedQuery("contexts", boolQuery().should(termQuery("contexts.contextId", q.underlying))),
82-
termQuery("contextids", q.underlying),
83-
idsQuery(q.underlying)
84-
) ++
73+
buildMatchQueryForField(q, "title", settings.language, settings.fallback, 20)
74+
).flatten ++
75+
List(
76+
langQueryFunc("title", 20),
77+
langQueryFunc("introduction", 2),
78+
langQueryFunc("metaDescription", 1),
79+
langQueryFunc("content", 1),
80+
langQueryFunc("tags", 1),
81+
langQueryFunc("embedAttributes", 1),
82+
simpleStringQuery(q.underlying).field("authors", 1),
83+
simpleStringQuery(q.underlying).field("grepContexts.title", 1),
84+
nestedQuery("contexts", boolQuery().should(termQuery("contexts.contextId", q.underlying))),
85+
termQuery("contextids", q.underlying),
86+
idsQuery(q.underlying)
87+
) ++
8588
buildNestedEmbedField(List(q.underlying), None, settings.language, settings.fallback) ++
8689
buildNestedEmbedField(List.empty, Some(q.underlying), settings.language, settings.fallback)
8790
)
@@ -90,17 +93,26 @@ trait MultiSearchService {
9093

9194
val nodeSearch = settings.query.map { q =>
9295
val langQueryFunc = (fieldName: String, boost: Double) =>
93-
buildSimpleStringQueryForField(
94-
q,
95-
fieldName,
96-
boost,
97-
settings.language,
98-
settings.fallback,
99-
searchDecompounded = true
100-
)
96+
List(
97+
buildSimpleStringQueryForField(
98+
q,
99+
fieldName,
100+
boost,
101+
settings.language,
102+
settings.fallback,
103+
searchDecompounded = true
104+
).some,
105+
buildMatchQueryForField(
106+
q,
107+
fieldName,
108+
settings.language,
109+
settings.fallback,
110+
boost
111+
)
112+
).flatten
101113
boolQuery().must(
102114
boolQuery().should(
103-
langQueryFunc("title", 18)
115+
langQueryFunc("title", 100)
104116
)
105117
)
106118
}

search-api/src/main/scala/no/ndla/searchapi/service/search/SearchService.scala

+42-2
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,48 @@ trait SearchService {
7777
}
7878
}
7979

80-
def languageQuery(query: NonEmptyString, field: String, boost: Double, language: String): SimpleStringQuery =
81-
buildSimpleStringQueryForField(query, field, boost, language, fallback = true, searchDecompounded = true)
80+
def languageQuery(query: NonEmptyString, field: String, boost: Double, language: String): List[Query] =
81+
List(
82+
buildSimpleStringQueryForField(query, field, boost, language, fallback = true, searchDecompounded = true).some,
83+
buildMatchQueryForField(query, field, language, fallback = true, boost)
84+
).flatten
85+
86+
def buildMatchQueryForField(
87+
query: NonEmptyString,
88+
field: String,
89+
language: String,
90+
fallback: Boolean,
91+
boost: Double
92+
): List[Query] = {
93+
val skipChars = List("+", "|", "-", "\"","*", "(", ")", "~")
94+
if(skipChars.exists(query.underlying.contains)) return List.empty
95+
96+
val searchLanguage = language match {
97+
case lang if Iso639.get(lang).isSuccess => lang
98+
case _ => Language.AllLanguages
99+
}
100+
val matchQueries = if (searchLanguage == Language.AllLanguages || fallback) {
101+
SearchLanguage.languageAnalyzers.map{cur =>
102+
matchPhrasePrefixQuery(s"$field.${cur.languageTag.toString}", query.underlying).boost(boost)
103+
}.toList
104+
} else {
105+
List(matchPhrasePrefixQuery(s"$field.$language", query.underlying).boost(boost))
106+
}
107+
108+
val termQueries = if (searchLanguage == Language.AllLanguages || fallback) {
109+
SearchLanguage.languageAnalyzers.map{cur =>
110+
prefixQuery(s"$field.${cur.languageTag.toString}", query.underlying).boost(boost)
111+
}.toList
112+
} else {
113+
List(prefixQuery(s"$field.$language", query.underlying).boost(boost))
114+
}
115+
116+
117+
List(
118+
matchQueries,
119+
termQueries
120+
).flatten
121+
}
82122

83123
def buildSimpleStringQueryForField(
84124
query: NonEmptyString,

search-api/src/test/scala/no/ndla/searchapi/service/search/MultiSearchServiceTest.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -727,16 +727,16 @@ class MultiSearchServiceTest
727727
searchSettings.copy(query = Some(NonEmptyString.fromString("Helse søster").get), language = AllLanguages)
728728
)
729729

730-
search1.totalCount should be(1)
731730
search1.summaryResults.map(_.id) should be(Seq(12))
731+
search1.totalCount should be(1)
732732

733733
val Success(search2) =
734734
multiSearchService.matchingQuery(
735735
searchSettings.copy(query = Some(NonEmptyString.fromString("Helse søster").get), language = "nb")
736736
)
737737

738-
search2.totalCount should be(1)
739738
search2.summaryResults.map(_.id) should be(Seq(12))
739+
search2.totalCount should be(1)
740740
}
741741

742742
test("That filterByNoResourceType works by filtering out every document that does not have resourceTypes") {

0 commit comments

Comments
 (0)