Прежде всего, я хочу сказать, что требование, которое я хочу выполнить, очень хорошо работает на SOLR 5.3.1, но не на ElasticSearch 6.2 в качестве службы на AWS.
Мой фактический запрос очень большойи сложный, и он работает нормально на кибане, но не тогда, когда я пересекаю из = 100 и размер = 50 , так как он показывает ошибку на консоли кибана,
ЧтоЯ знаю:
Для обычного поиска максимум из может составлять 10000 , а для агрегированного поиска максимум из может составлять 100
Если я перейду этот предел, то мне придется изменить максимальный предел , что невозможно, поскольку я использую ES в AWS в качестве службы ИЛИ я использую scroll API с функцией прокрутки для получения разбитых на страницы данных.
Scroll API работает хорошо, так как я использовал его для другой части моего проекта, но когда я пытаюсь использовать тот же Scroll с агрегация работает не так, как ожидалось.
Здесь с Scroll API, первый поискполучает агрегированные данные, но второй вызов с идентификатором прокрутки не возвращает агрегированные результаты, показывающие только хиты результат
запрос на Kibana
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"
}
}
]
}
С Поиском на питоне: Проблема, с которой я сталкиваюсь при этом поиске , при первом поиске вместе с данными Агрегированные Хиты данных, но при следующем вызове с идентификатором прокрутки не возвращаются Агрегированные данные, показывающие только данные Хиты .
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)
Итак, мой вопрос:
Разве невозможно получить данные, используя поля из и size для агрегированного запроса выше из = 100?
если это возможно, тогда, пожалуйста, дайте мне подсказку с обычным эластичным поиском способом или asticsearch-dsl питоном, так как я не очень хорошо знаю сasticsearch-dsl иasticsearchведро, матрица и т. д.
В некоторых ответах по SO сказано использовать раздел , но я не знаю, как использовать его в моем сценарии Как управлять результатами агрегирования эластичного поиска с помощью From/ Размер?
Некоторые другие говорят, что эта функция в настоящее время не поддерживается ES (в настоящее время по запросу функции).Если это невозможно, что еще можно сделать вместо группировки в Solr?