Elasticsearch 2.1: Janela de resultado é muito grande (index.max_result_window)

Recuperamos as informações do Elasticsearch 2.1 e permitimos que o usuário pague os resultados. Quando o usuário solicita um número de página alto, recebemos a seguinte mensagem de erro:

A janela do resultado é muito grande, a partir do tamanho + deve ser menor ou igual a: [10000] mas foi [10020]. Veja a API de rolagem para obter uma maneira mais eficiente de solicitar grandes conjuntos de dados. Esse limite pode ser definido alterando o parâmetro do nível de índice [index.max_result_window]

O elástico docu diz que isso é devido ao alto consumo de memory e ao uso da API de rolagem:

Valores mais altos do que podem consumir partes significativas da memory heap por pesquisa e por shard executando a pesquisa. É mais seguro deixar esse valor, pois é uma utilização da API de rolagem para qualquer rolagem profunda https://www.elastic.co/guide/en/elasticsearch/reference/2.x/breaking_21_search_changes.html#_from_size_limits

O problema é que não quero recuperar grandes conjuntos de dados. Eu só quero recuperar uma fatia do dataset que é muito alto no conjunto de resultados. Além disso, o documento de rolagem diz:

A rolagem não se destina a solicitações de usuários em tempo real https://www.elastic.co/guide/en/elasticsearch/reference/2.2/search-request-scroll.html

Isso me deixa com algumas perguntas:

1) O consumo de memory seria realmente menor (qualquer se assim por que) se eu usar a API de rolagem para rolar até o resultado 10020 (e desconsiderar tudo abaixo de 10000) em vez de fazer uma solicitação de busca “normal” para o resultado 10000-10020?

2) Não parece que a API de rolagem é uma opção para mim, mas que eu tenho que aumentar “index.max_result_window”. Alguém tem alguma experiência com isto?

3) Existem outras opções para resolver o meu problema?

Se você precisar de paginação profunda grande, acho que apenas uma variante da solução é aumentar o valor max_result_window

curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "index" : { "max_result_window" : 500000 } }' 

O aumento no uso de memory, eu não é encontrado para valores de ~ 100k

As seguintes páginas da documentação elástica falam sobre paginação profunda:

https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

Dependendo do tamanho de seus documentos, o número de fragments e o hardware que você está usando, paginando 10.000 a 50.000 resultados (1.000 a 5.000 páginas), deve ser perfeitamente factível. Mas, com valores suficientemente grandes, o processo de sorting pode se tornar muito pesado, usando grandes quantidades de CPU, memory e largura de banda. Por esse motivo, desaconselhamos fortemente a paginação profunda.

A solução certa seria usar a rolagem.
No entanto, se você quiser estender a search resultados, ele retornará além de 10.000 resultados. Você pode fazer isso facilmente com o Kibana:

Vá para Dev Tools e publique o seguinte no seu índice (your_index_name), especificando qual seria a nova janela de resultados máximos.

insira a descrição da imagem aqui

 PUT your_index_name/_settings { "max_result_window" : 500000 } 

Se tudo correr bem, você deverá ver a seguinte resposta de sucesso:

 { "acknowledged": true } 

Use a API de rolagem para obter mais de 10000 resultados.

Exemplo de rolagem na API NEST do ElasticSearch

Eu usei assim:

 private static Customer[] GetCustomers(IElasticClient elasticClient) { var customers = new List(); var searchResult = elasticClient.Search(s => s.Index(IndexAlias.ForCustomers()) .Size(10000).SearchType(SearchType.Scan).Scroll("1m")); do { var result = searchResult; searchResult = elasticClient.Scroll("1m", result.ScrollId); customers.AddRange(searchResult.Documents); } while (searchResult.IsValid && searchResult.Documents.Any()); return customers.ToArray(); } 

Se você quiser mais de 10000 resultados, então, em todos os nós de dados, o uso de memory será muito alto, pois ele deve retornar mais resultados em cada solicitação de consulta. Então, se você tiver mais dados e mais fragments, a mesclagem desses resultados será ineficiente. Também armazena em cache o contexto do filtro, portanto, mais memory. Você tem que tentativa e erro quanto exatamente você está tomando. Se você está recebendo muitas requisições em uma pequena janela, você deve fazer várias consultas por mais de 10k e mesclá-las por si mesmo no código, o que supostamente leva menos memory do aplicativo, se você aumentar o tamanho da janela.

2) Não parece que a API de rolagem é uma opção para mim, mas que eu tenho que aumentar “index.max_result_window”. Alguém tem alguma experiência com isto?

-> Você pode definir este valor em modelos de índice, o modelo será aplicável apenas para novos índices, portanto você terá que excluir índices antigos depois de criar um modelo ou esperar que novos dados sejam processados ​​no elasticsearch.

{“ordem”: 1, “modelo”: “index_template *”, “configurações”: {“index.number_of_replicas”: “0”, “index.number_of_shards”: “1”, “index.max_result_window”: 2147483647},