Recuperamos información de Elasticsearch 2.1 y permitimos que el usuario revise los resultados. Cuando el usuario solicita un número de página alto, aparece el siguiente mensaje de error:
La ventana de resultado es demasiado grande, desde + el tamaño debe ser menor o igual a: [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:
Los valores más altos pueden consumir porciones significativas de memoria de pila 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
El caso es que no quiero recuperar grandes conjuntos de datos. Solo quiero recuperar una porción del conjunto de datos que está muy arriba en el conjunto de resultados. También el documento de desplazamiento dice:
El desplazamiento no está diseñado para 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) ¿El consumo de memoria sería realmente menor (si es así, por qué) si uso la API de desplazamiento para desplazarme hasta el resultado 10020 (y descarto todo lo que esté por debajo de 10000) en lugar de realizar 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í, pero tengo que aumentar "index.max_result_window". ¿Alguien tiene alguna experiencia con esto?
3) ¿Existen otras opciones para solucionar mi problema?
fuente
'Result window is too large, from + size must be less than or equal to: [10000] but was [47190]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Dijo que tiene 4719 páginas (cada página 10 resultados). y creo que tu sugerencia funciona.{ "max_result_window" : 500000 }
para que esto funcione. Entonces el comando curl se convirtió en -curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "max_result_window" : 500000 }'
La solución correcta sería utilizar el desplazamiento.
Sin embargo, si desea extender los
search
retornos de resultados más allá de 10,000 resultados, puede hacerlo fácilmente con Kibana:Vaya a
Dev Tools
y publique lo siguiente en su índice (your_index_name), especificando cuál sería la nueva ventana de resultado máximoSi todo va bien, debería ver la siguiente respuesta de éxito:
fuente
Las siguientes páginas de la documentación elástica hablan sobre la 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
fuente
Utilice la API de desplazamiento para obtener más de 10000 resultados.
Ejemplo de desplazamiento en ElasticSearch NEST API
Lo he usado así:
fuente
Si desea más de 10000 resultados, en todos los nodos de datos el uso de 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á ineficaz. También almacena en caché el contexto del filtro, por lo tanto, nuevamente, más memoria. Tienes que probar y equivocarte cuánto estás tomando exactamente. Si recibe muchas solicitudes en una ventana pequeña, debe hacer varias consultas por más de 10k y fusionarlas usted mismo en el código, lo que se supone que ocupará menos memoria de la aplicación que si aumenta el tamaño de la ventana.
fuente
2) No parece que la API de desplazamiento sea una opción para mí, pero 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 para los índices nuevos, 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},
fuente
En mi caso, parece que reducir los resultados a través de los prefijos from & size a la consulta eliminará el error ya que no necesitamos todos los resultados:
fuente