Elasticsearch объединяет результаты более сложными способами

#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" : [
        .........
              ]
            }
         ]
  }