Нормализовать оценку Elasticsearch с длиной подполя

#elasticsearch

#elasticsearch

Вопрос:

У меня есть несколько документов в ElasticSearch, и у каждого документа есть одно или несколько приложений. Когда я выполняю поиск по тексту приложений, я часто получаю оценки больше 1. Когда я выполняю поиск по действительно распространенным шаблонам, я понимаю, что чем больше в документе приложений, тем выше его оценка. Итак, я стремлюсь «нормализовать» оценки, разделив оценку каждого документа на количество приложений, которые в нем есть.

Например, для этого запроса:

 "query": {
  "match": {
    "document.appendices.text" = "What is love?"
  }
}
  

Я хотел бы сделать score = score / length(document.appendices) , но я не знаю, как это выразить.

Это возможно, или для достижения этого все приложения должны быть проиндексированы как document?

Большое спасибо сообществу!

Ответ №1:

Используйте function_score запрос, чтобы изменить уже рассчитанную оценку _score

 GET /_search
{
    "query": {
        "function_score": {
            "query": {
                "match": { "document.appendices.text": "What is love?" }
            },
            "script_score" : {
                "script" : {
                  "source": "_score/doc['document.appendices'].length"
                }
            }
        }
    }
}
  

См. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#score-functions

Комментарии:

1. Спасибо за вашу помощь! Это определенно похоже на то, что я ищу. К сожалению, я получил No field found for ['appendices'] in mapping with types [] ошибку. И я также пока не могу перечислить ключи, которые doc принимает.

2. Исправлен ключ для doc длины поиска

3. После дополнительных исследований выяснилось, что к элементам с типом list вообще нельзя получить доступ в скриптах.