Elasticsearch От и Размер по агрегации для нумерации страниц
Прежде всего, я хочу сказать, что требование, которого я хочу достичь, очень хорошо работает на SOLR 5.3.1, но не на ElasticSearch 6.2 как сервисе на AWS.
Мой фактический запрос очень большой и сложный, и он отлично работает на кибане, но не тогда, когда я пересекаю от = 100 и размер = 50, так как он показывает ошибку на консоли кибана,
Что я знаю:
Для обычного поиска максимум от может быть 10000, а для агрегированного поиска максимум от может быть 100
Если я пересекаю этот предел, мне придется изменить максимальный предел, что невозможно, поскольку я использую ES в AWS в качестве службы ИЛИ Я использую API прокрутки с функцией идентификатора прокрутки для получения разбитых на страницы данных.
Scroll API работает хорошо, так как я использовал его для другой части моего проекта, но когда я пытаюсь использовать тот же Scroll с агрегацией, он не работает должным образом.
Здесь с API прокрутки первый поиск получает агрегированные данные, а второй вызов с идентификатором прокрутки не возвращает агрегированные результаты, показывающие только результат попаданий
Запрос по Кибане
GET /properties/_search
{
"size": 10,
"query": {
"bool": {
"must": [
{
"match": {
"published": true
}
},
{
"match": {
"country": "South Africa"
}
}
]
}
},
"aggs": {
"aggs_by_feed": {
"terms": {
"field": "feed",
"order": {
"_key": "desc"
}
},
"aggs": {
"tops": {
"top_hits": {
from: 100,
size: 50,
"_source": [
"id",
"feed_provider_id"
]
}
}
}
}
},
"sort": [
{
"instant_book": {
"order": "desc"
}
}
]
}
С поиском на python: проблема, с которой я сталкиваюсь при этом поиске, при первом поиске агрегированные данные получают вместе с данными хитов, но при следующем вызове с идентификатором прокрутки он не возвращает агрегированные данные, показывающие только данные хитов.
if index_name is not None and doc_type is not None and body is not None:
es = init_es()
page = es.search(index_name,doc_type,scroll = '30s',size = 10, body = body)
sid = page['_scroll_id']
scroll_size = page['hits']['total']
# Start scrolling
while (scroll_size > 0):
print("Scrolling...")
page = es.scroll(scroll_id=sid, scroll='30s')
# Update the scroll ID
sid = page['_scroll_id']
print("scroll id: " + sid)
# Get the number of results that we returned in the last scroll
scroll_size = len(page['hits']['hits'])
print("scroll size: " + str(scroll_size))
print("scrolled data :" )
print(page['aggregations'])
С Elasticsearch-DSL на python: при таком подходе я пытаюсь выбрать _source
имена полей как id
а также feed_provider_id
на втором aggs ig tops->top_hits
es = init_es()
s = Search(using=es, index=index_name,doc_type=doc_type)
s.aggs.bucket('aggs_by_feed', 'terms', field='feed').metric('top','top_hits',field = 'id')
response = s.execute()
print('Hit........')
for hit in response:
print(hit.meta.score, hit.feed)
print(response.aggregations.aggs_by_feed)
print('AGG........')
for tag in response.aggregations.aggs_by_feed:
print(tag)
Итак, мой вопрос
Разве невозможно получить данные, используя поля from и size для агрегированного запроса выше из =100?
если это возможно, тогда, пожалуйста, дайте мне подсказку с помощью обычного способа упругого поиска или пути упругого поиска в Python, так как я не очень хорошо знаком с ведением упругого поиска и ведром эластичного поиска, матрицей и т. д.
В некотором ответе на SO сказано использовать раздел, но я не знаю, как использовать его в моем сценарии. Как управлять результатами агрегирования эластичного поиска с помощью From / Size?
Некоторые другие говорят, что эта функция в настоящее время не поддерживается ES (в настоящее время по запросу функции). Если это невозможно, что еще можно сделать вместо группировки в Solr?