Эластичный поиск не дает данных с большим числом для размера страницы

Размер данных для получения: 20000 ок

Проблема: поиск в индексированных данных Elastic Search с использованием приведенной ниже команды в python

но не получая никаких результатов обратно.

from pyelasticsearch import ElasticSearch
es_repo = ElasticSearch(settings.ES_INDEX_URL)
search_results = es_repo.search(
            query, index=advertiser_name, es_from=_from, size=_size)

Если я даю размер меньше или равный 10 000, он работает нормально, но не с 20 000. Пожалуйста, помогите мне найти оптимальное решение для этого.

PS: При копании, Медведица в ES обнаружил это сообщение об ошибке:

Окно результатов слишком велико, значение + должно быть меньше или равно: [10000], но было [19999]. Смотрите API прокрутки для более эффективного способа запроса больших наборов данных.

2 ответа

Решение

Для реального времени используйте лучшее решение, чтобы использовать поиск после запроса. Вам нужно только поле даты и другое поле, однозначно идентифицирующее документ - достаточно _id поле или _uid поле. Попробуйте что-то вроде этого, в моем примере я хотел бы извлечь все документы, принадлежащие одному пользователю - в моем примере поле пользователя имеет keyword datatype:

from elasticsearch import Elasticsearch


es = Elasticsearch()
es_index = "your_index_name"
documento = "your_doc_type"

user = "Francesco Totti"

body2 = {
        "query": {
        "term" : { "user" : user } 
            }
        }

res = es.count(index=es_index, doc_type=documento, body= body2)
size = res['count']


body = { "size": 10,
            "query": {
                "term" : {
                    "user" : user
                }
            },
            "sort": [
                {"date": "asc"},
                {"_uid": "desc"}
            ]
        }

result = es.search(index=es_index, doc_type=documento, body= body)
bookmark = [result['hits']['hits'][-1]['sort'][0], str(result['hits']['hits'][-1]['sort'][1]) ]

body1 = {"size": 10,
            "query": {
                "term" : {
                    "user" : user
                }
            },
            "search_after": bookmark,
            "sort": [
                {"date": "asc"},
                {"_uid": "desc"}
            ]
        }




while len(result['hits']['hits']) < size:
    res =es.search(index=es_index, doc_type=documento, body= body1)
    for el in res['hits']['hits']:
        result['hits']['hits'].append( el )
    bookmark = [res['hits']['hits'][-1]['sort'][0], str(result['hits']['hits'][-1]['sort'][1]) ]
    body1 = {"size": 10,
            "query": {
                "term" : {
                    "user" : user
                }
            },
            "search_after": bookmark,
            "sort": [
                {"date": "asc"},
                {"_uid": "desc"}
            ]
        }

Тогда вы найдете все документы, приложенные к result вар

Если вы хотите использовать scroll query - Док здесь:

from elasticsearch import Elasticsearch, helpers

es = Elasticsearch()
es_index = "your_index_name"
documento = "your_doc_type"

user = "Francesco Totti"

body = {
        "query": {
        "term" : { "user" : user } 
             }
        }

res = helpers.scan(
                client = es,
                scroll = '2m',
                query = body, 
                index = es_index)

for i in res:
    print(i)

Вероятно, его ограничения ElasticSearch.

index.max_result_window index setting which defaults to 10,000
Другие вопросы по тегам