#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"
}
}
}
}
}
Комментарии:
1. Спасибо за вашу помощь! Это определенно похоже на то, что я ищу. К сожалению, я получил
No field found for ['appendices'] in mapping with types []
ошибку. И я также пока не могу перечислить ключи, которыеdoc
принимает.2. Исправлен ключ для
doc
длины поиска3. После дополнительных исследований выяснилось, что к элементам с типом list вообще нельзя получить доступ в скриптах.