Агрегация Elasticsearch с использованием поля top_hits с упорядочением скриптов
У меня есть набор документов с src
, txt
а также flt
поля. Я хочу запросить по txt
поле следующим образом:
- Группировать (вешать) по
src
; - В каждом ведре рассчитывают 1 верхний наиболее актуальный документ;
- Заказать каждое ведро по
_score * doc.flt
значение.
До сих пор я реализовал 1 и 2, но не 3. Даже если 3 может быть не очень эффективным, я все еще хочу иметь такую опцию. Мой запрос выглядит так:
{
"query" : {
'match' : {
'text' : {
'query' : <some text>,
'fuzziness' : 'AUTO',
'operator' : 'and'
}
}
},
"aggs": {
"by_src": {
"terms": {
"field": "src",
"size" : 10,
"order" : {"top_score" : "desc"}
},
"aggs": {
"top_hits" : {
"top_hits" : {
"sort": { "_score": { "order": "desc" } },
"size" : 1
}
},
"top_score": {
"max" : {
"script" : "_score",
}
}
}
}
}
}
1 ответ
Я считаю, что это не помогает, потому что вам не нужно использовать _source
поле, чтобы применить сортировку к каждому сегменту, просто примените сортировку по имени поля:
{
"query" : {
'match' : {
'text' : {
'query' : <some text>,
'fuzziness' : 'AUTO',
'operator' : 'and'
}
}
},
"aggs": {
"by_src": {
"terms": {
"field": "src",
"size" : 10,
"order" : {"top_score" : "desc"}
},
"aggs": {
"top_hits" : {
"top_hits" : {
"sort":[{
"flt": {"order": "desc"}
}],
"size" : 1
}
},
"top_score": {
"max" : {
"script" : "_score",
}
}
}
}
}
}
Я предполагаю, что в вашем документе есть поле с именем
flt
что вы хотите использовать для сортировки. Естественно, вы также можете изменить сортировку наasc
если это то, что вам нужно.