Как запустить агрегацию терминов для первых результатов `n`
Я выполняю агрегирование терминов для документов, хранящихся в индексе. Мои документы - это продукты, и я собираю название продукта.
# GET /products/_search/
{
"query": {
"match": { "name": "iphone 5" }
},
"aggs": {
"brands_name": {
"terms": {
"field": "brand",
"size": 10
}
}
}
}
Как и ожидалось, результаты - это ведро брендов и ихdoc_counts
.
{
"aggregations": {
"brands_name": {
"doc_count_error_upper_bound": 577,
"sum_other_doc_count": 239924,
"buckets": [
{
"key": "Irrelevant Brand 1",
"doc_count": 8539
},
{
"key": "Irrelevant Brand 2",
"doc_count": 7616
},
...
]
}
}
}
Количество совпадений может быть довольно высоким для общих поисков. В моем случае, только первые результаты с высокой оценкой являются релевантными. Поскольку агрегация выполняется по всем хитам (даже по тем, у которых низкие оценки), обычные бренды имеют тенденцию всегда присутствовать в списке сегментов (ихdoc_count
является высоким), хотя они могут не соответствовать соответствующему результату.
Я хочу подтолкнуть к тому, что я считаю соответствующими брендами.
Моя идея состоит в том, чтобы охватить агрегаты только первымn
документы (это может бытьn
по результатам или по осколкам, это не имеет значения). Мне пока не удалось это сделать.
Я пробовал разные подходы, которые не работают для меня:
используя отфильтрованный запрос спредельный фильтр, Это не работает, так как это может исключить документы с высокой оценкойиспользованиеmin_score, Хотя это позволяет запускать агрегирование в области, содержащей только высокие оценки, это на самом деле не является гибким.агрегация top_hits, Он не допускает подзапросов, что делает невозможным выполнение агрегирования терминов для самых популярных запросов.агрегировать результаты по баллу сфильтр гистограммы: это может сработать, разделив результаты по небольшим интервалам, а затем уменьшив результаты до достижения приблизительноn
документы. Но он чувствует себя немного грязным и упругимкажется, еще не поддерживает десятичные интервалы