#http #elasticsearch #request
Вопрос:
Допустим, мы делаем следующий поисковый запрос:
GET my-index-000001/_search
{
query: {
multi_match: {
type: "most_fields",
query: "word1 word2",
fields: [
"name",
"name.prefix",
"name.suffix"
]
}
}
}
Таким образом, возвращаемый балл для каждого объекта в индексе Elasticsearch равен сумме баллов поиска по каждому из следующих полей: «имя», «имя.префикс», «имя.суффикс». Как я мог вместо получения суммы всех этих полей получить следующую оценку (результат поиска(поле) означает оценку, полученную из поля, maximum() возвращает максимальную оценку): оценка = результат поиска(«имя») максимум(результат поиска(«имя.префикс»), результат поиска(«имя.суффикс»)) ? Или, другими словами, как я могу получить сумму баллов по одному полю и максимум баллов по двум другим полям?
Ответ №1:
Вы можете использовать запрос dis_max для получения максимального балла
Если возвращаемый документ соответствует нескольким предложениям запроса, запрос dis_max присваивает документу наивысший балл релевантности из любого предложения соответствия, плюс приращение разрыва связи для любых дополнительных соответствующих подзапросов.
{
"query": {
"bool": {
"should": [
{
"dis_max": {
"queries": [
{
"match": {
"name.prefix": "word1 word2"
}
},
{
"match": {
"name.suffix": "word1 word2"
}
}
],
"tie_breaker": 0.7
}
},
{
"match": {
"name.full_name": "word1 word2"
}
}
]
}
}
}
предложение should даст сумму запроса name.full_name и dis_max
Если вы будете запускать с помощью _search?explain=true, вы получите объяснение того, как рассчитываются баллы
"_explanation" : {
"value" : 1.3521059,
"description" : "sum of:",
"details" : [
{
"value" : 0.7767416,
"description" : "max plus 0.7 times others of:",
"details" : [
{
"value" : 0.2876821,
"description" : "sum of:",
"details" :[....]
},
{......}
]
},
{
"value" : 0.5753642,
"description" : "sum of:",
"details" : [
.........
]
}
]
}