Я хотел бы объединить рейтинги, полученные из запросов к отдельным полям индекса Elasticsearch, чтобы получить «составной» рейтинг.
В качестве (глупого) примера «подбора соответствия», предположим, что я хотел получитьнаилучшие результаты поиска по индексу людей, в которых содержится их любимая музыка, еда, спорт.
Отдельные запросы могут быть, например,
"query": { "match" : { "music" : "indie classical metal" } }
, которые приведут меня к ранжированным результатам:
- Алиса, 2. Боб, 3. Чарли;
"query": { "match" : { "foods" : "falafel strawberries coffee" } }
, уступающий
- Алиса, 2. Чарли,3. Боб;
и
"query": { "match" : { "sports" : "basketball ski" } }
, уступающий
- Чарли, 2. Алиса, 3. Боб.
Теперь я хотел бы получить «совокупный» рейтинг на основе приведенных выше рейтингов, например, используя методы голосования, перечисленные в Как объединить коллекцию упорядоченных предпочтений .
ПокаЧтобы добиться чего-то в этом направлении, я использовал синтаксис для составных запросов, таких как
"query": {
"bool": {
"should": [
{ "match" : { "music" : "indie classical metal" } },
{ "match" : { "foods" : "falafel strawberries coffee" } },
{ "match" : { "sports" : "basketball ski" } },
]
}
}
или
"query": {
"dis_max": {
"queries": [
{ "match" : { "music" : "indie classical metal" } },
{ "match" : { "foods" : "falafel strawberries coffee" } },
{ "match" : { "sports" : "basketball ski" } },
]
}
}
buт (AFAIK) они не делают то, что я ищу (который не использует оценки, но ранги).Я понимаю, что довольно просто пост-обработать ранжирование (например, используяasticsearch-py и затем несколько строк Python), но возможно ли сделать вышеперечисленное непосредственно с помощью запроса Elasticsearch?
(бонусный вопрос:Не могли бы вы предложить альтернативные стратегии для объединения рейтингов из нескольких полей, помимо bool
+ should
и dis_max
, которые я мог бы попробовать?)