Объединить elasticsearch булева запроса с Диапазоном усилениемОбъединить elasticsearch Его запрос с усилением диапазона
У меня есть сложный запрос bool
следующим образом. Я использую фальшивый поисковый запрос dgbdrtgndgfndrtgb
, чтобы скомпоновать мой пример, который не должен соответствовать чему-либо.
{
"from": 0,
"size": 10,
"query": {
"function_score": {
"boost_mode": "replace",
"query": {
"filtered": {
"filter": {
# ...
},
"query": {
"bool": {
"should": [
{
"match": {
"name.suggest_ngrams": {
"query": "dgbdrtgndgfndrtgb",
"fuzziness": "AUTO",
"prefix_length": 1,
"operator": "AND",
"boost": 10
}
}
},
{
"multi_match": {
"query": "dgbdrtgndgfndrtgb",
"fields": [
"name.untouched_lowercase"
],
"boost": 5
}
},
{
"query_string": {
"fields": [
"name.suggest"
],
"query": "dgbdrtgndgfndrtgb*",
"boost": 10
}
},
{
"query_string": {
"fields": [
"name.suggest"
],
"query": "dgbdrtgndgfndrtgb",
"boost": 10
}
},
{
"match": {
"first_word": {
"query": "dgbdrtgndgfndrtgb",
"operator": "AND",
"boost": 10
}
}
},
{
"match": {
"name": {
"query": "dgbdrtgndgfndrtgb",
"operator": "AND",
"boost": 5
}
}
}
]
}
}
}
}
}
}
}
Это хорошо работает. Теперь для любого из этих совпадений я хочу добавить boost
, где поле name
имеет менее 2 слов. Другими словами, увеличивайте однословное совпадение или сортируйте их до вершины набора результатов.
Так что я попытался добавить range
импульс, как это:
{
"from": 0,
"size": 10,
"query": {
"function_score": {
"boost_mode": "replace",
"query": {
"filtered": {
"filter": {
# ...
},
"query": {
"bool": {
"should": [
{
"match": {
"name.suggest_ngrams": {
"query": "dgbdrtgndgfndrtgb",
"fuzziness": "AUTO",
"prefix_length": 1,
"operator": "AND",
"boost": 10
}
}
},
{
"multi_match": {
"query": "dgbdrtgndgfndrtgb",
"fields": [
"name.untouched_lowercase"
],
"boost": 5
}
},
{
"query_string": {
"fields": [
"name.suggest"
],
"query": "dgbdrtgndgfndrtgb*",
"boost": 10
}
},
{
"query_string": {
"fields": [
"name.suggest"
],
"query": "dgbdrtgndgfndrtgb",
"boost": 10
}
},
{
"match": {
"first_word": {
"query": "dgbdrtgndgfndrtgb",
"operator": "AND",
"boost": 10
}
}
},
{
"match": {
"name": {
"query": "dgbdrtgndgfndrtgb",
"operator": "AND",
"boost": 5
}
}
},
{
"range": {
"name.word_count": {
"lt": 2,
"boost": 40
}
}
}
]
}
}
}
}
}
}
}
Это сортирует вещи, как я хочу, но он также возвращает однословные матчи, которые не соответствуют поисковому запросу dgbdrtgndgfndrtgb
.
Есть ли способ повысить только однословные совпадения, которые также соответствуют поисковому запросу? Я попытался понизить значение boost
, которое разбивает желаемую сортировку при использовании действительного (найденного) условия поиска.
Похоже, что должен быть AND
весь запрос bool
с увеличением range
. Я пробовал различные перестановки, чтобы добиться этого, не повезло, и документы менее полезны.
Одно предупреждение: я не могу использовать скрипты, поскольку индекс размещен на AWS, который не поддерживает его.
Любые советы приветствуются.