Рассмотрим следующий запрос для Elasticsearch 5.6:
{
"size": 0,
"query": {
"match_all": {}
},
"rescore": [
{
"window_size": 10000,
"query": {
"rescore_query": {
"function_score": {
"boost_mode": "replace",
"script_score": {
"script": {
"source": "doc['topic_score'].value"
}
}
}
},
"query_weight": 0,
"rescore_query_weight": 1
}
}
],
"aggs": {
"distinct": {
"terms": {
"field": "identical_id",
"order": {
"top_score": "desc"
}
},
"aggs": {
"best_unique_result": {
"top_hits": {
"size": 1
}
},
"top_score": {
"max": {
"script": {
"inline": "_score"
}
}
}
}
}
}
}
Это упрощенная версия, в которой реальный запрос содержит более сложный основной запрос, а функция восстановления гораздо более интенсивна.
Позвольте мне сначала объяснить его цель, если я собираюсь потратить 1000 часов на разработку ручки, которая пишет в пространстве, когда карандаш действительно решит мою проблему. Я выполняю быстрый начальный запрос, затем восстанавливаю верхние результаты с помощью гораздо более интенсивной функции. Из этих результатов я хочу показать самые верхние значения, т. Е. Два результата не должны иметь одинаковые значения identical_id
. Если есть лучший способ сделать это, я бы тоже счел это ответом.
Я ожидал, что запрос, подобный этому, упорядочит результаты по запросу rescore, сгруппирует все результаты, которые имели одинаковый identical_id
, и отобразит самый высокий рейтинг для каждой такой отдельной группы. Я также предположил, что, поскольку я упорядочиваю эти группы агрегации терминов по максимальному родительскому элементу _score
, они должны будут отображать наилучший результат, который они содержат, как определено из исходного запроса на восстановление.
Реальность такова, что сегменты терминов упорядочены по максимальному количеству запросов, а не по количеству запросов для повторных запросов. Странно, но верхние попадания в ведрах, кажется, используют спасение.
Есть ли лучший способ достичь желаемого конечного результата или каким-то образом можно исправить этот запрос, чтобы он работал так, как я этого ожидаю?