aws - Elasticsearch 2.1: la ventana de resultados es demasiado grande(index.max_result_window)
elasticsearch tutorial (6)
2) No parece que la API de desplazamiento sea una opción para mí, sino que tengo que aumentar "index.max_result_window". ¿Alguien tiene alguna experiencia con esto?
-> Puede definir este valor en las plantillas de índice; la plantilla es aplicable solo a los nuevos índices, por lo que debe eliminar los índices antiguos después de crear la plantilla o esperar a que se ingieran nuevos datos en Elasticsearch.
{"order": 1, "template": "index_template *", "settings": {"index.number_of_replicas": "0", "index.number_of_shards": "1", "index.max_result_window": 2147483647},
Recuperamos información de Elasticsearch 2.1 y permitimos que el usuario pase por los resultados. Cuando el usuario solicita un número de página alto, recibimos el siguiente mensaje de error:
La ventana de resultados es demasiado grande, desde + tamaño debe ser menor o igual que: [10000] pero era [10020]. Consulte la API de desplazamiento para obtener una forma más eficiente de solicitar grandes conjuntos de datos. Este límite se puede establecer cambiando el parámetro de nivel de índice [index.max_result_window]
El documento elástico dice que esto se debe al alto consumo de memoria y al uso de la API de desplazamiento:
Valores superiores a los que pueden consumir grandes cantidades de memoria de almacenamiento dinámico por búsqueda y por fragmento que ejecuta la búsqueda. Es más seguro dejar este valor, ya que es un uso de la API de desplazamiento para cualquier desplazamiento profundo https://www.elastic.co/guide/en/elasticsearch/reference/2.x/breaking_21_search_changes.html#_from_size_limits
Lo que pasa es que no quiero recuperar grandes conjuntos de datos. Solo quiero recuperar un segmento del conjunto de datos que está muy arriba en el conjunto de resultados. También el documento de desplazamiento dice:
El desplazamiento no está destinado a solicitudes de usuarios en tiempo real https://www.elastic.co/guide/en/elasticsearch/reference/2.2/search-request-scroll.html
Esto me deja con algunas preguntas:
1) ¿Sería realmente menor el consumo de memoria (en caso afirmativo, por qué) si uso la API de desplazamiento para desplazarme hacia arriba hasta el resultado 10020 (e ignorar todo por debajo de 10000) en lugar de hacer una solicitud de búsqueda "normal" para el resultado 10000-10020?
2) No parece que la API de desplazamiento sea una opción para mí, sino que tengo que aumentar "index.max_result_window". ¿Alguien tiene alguna experiencia con esto?
3) ¿Hay alguna otra opción para resolver mi problema?
La solución correcta sería utilizar el desplazamiento.
Sin embargo, si desea extender los resultados de
search
resultados más allá de 10,000 resultados, puede hacerlo fácilmente con Kibana:
Vaya a
Dev Tools
y simplemente publique lo siguiente en su índice (your_index_name), especificando cuál sería la nueva ventana de resultados máximos
PUT your_index_name/_settings
{
"max_result_window" : 500000
}
Si todo va bien, debería ver la siguiente respuesta de éxito:
{
"acknowledged": true
}
Las siguientes páginas de la documentación elástica hablan sobre paginación profunda:
https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html
Dependiendo del tamaño de sus documentos, el número de fragmentos y el hardware que está utilizando, la paginación de 10,000 a 50,000 resultados (1,000 a 5,000 páginas) de profundidad debería ser perfectamente factible. Pero con un valor lo suficientemente grande, el proceso de clasificación puede llegar a ser muy pesado, utilizando grandes cantidades de CPU, memoria y ancho de banda. Por esta razón, recomendamos encarecidamente contra la paginación profunda.
Si desea obtener más de 10000 resultados, entonces, en todos los nodos de datos, el uso de la memoria será muy alto porque tiene que devolver más resultados en cada solicitud de consulta. Entonces, si tiene más datos y más fragmentos, fusionar esos resultados será ineficiente. También es el caché del contexto del filtro, por lo tanto, de nuevo más memoria. Tienes que probar y error cuánto estás tomando exactamente. Si recibe muchas solicitudes en una ventana pequeña, debe realizar varias consultas durante más de 10k y fusionarlas usted mismo en el código, que se supone que ocupa menos memoria de la aplicación que si aumenta el tamaño de la ventana.
Si necesita una gran paginación profunda, creo que solo una variante de solución es aumentar el valor max_result_window
curl -XPUT "http://localhost:9200/my_index/_settings" -d ''{ "index" : { "max_result_window" : 500000 } }''
El aumento en el uso de memoria, no se encuentra para valores de ~ 100k
Use la API de desplazamiento para obtener más de 10000 resultados.
Ejemplo de desplazamiento en ElasticSearch NEST API
Lo he usado así:
private static Customer[] GetCustomers(IElasticClient elasticClient)
{
var customers = new List<Customer>();
var searchResult = elasticClient.Search<Customer>(s => s.Index(IndexAlias.ForCustomers())
.Size(10000).SearchType(SearchType.Scan).Scroll("1m"));
do
{
var result = searchResult;
searchResult = elasticClient.Scroll<Customer>("1m", result.ScrollId);
customers.AddRange(searchResult.Documents);
} while (searchResult.IsValid && searchResult.Documents.Any());
return customers.ToArray();
}