Cuando SpringBoot integra ElasticSearch, los pozos que se encuentran en las consultas de clasificación de paginación solo pueden devolver 10 piezas de datos cada vez

fondo

ElasticSearch se utiliza para consultar la segmentación de palabras y devolver la cantidad especificada de elementos de datos en las páginas. Sin embargo, cuando queremos obtener más de diez elementos de elementos de datos paginados, ElasticSearch siempre puede devolver solo diez elementos. Esto se debe a que ElasticSearch ha configurado los datos de paginación para devolver solo 10 piezas de forma predeterminada para la velocidad de consulta, por lo que debemos cambiar el tamaño de los datos en la consulta de paginación cambiando el tamaño (el tamaño de los datos devueltos). no se establece el tamaño solo puede devolver 10 artículos.

1. La consulta debe incluir desde-tamaño

Si la consulta consulta en es no especifica el valor de tamaño desde, es predeterminado desde = 0, tamaño = 10, y el valor predeterminado es consultar 10 piezas de datos a la vez

La siguiente declaración de consulta, 11 consultas de identificación únicas, si no especifica desde y tamaño, solo se devolverán 10 piezas de datos en lugar de 11 piezas

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "id": [4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200]
          }
        }
      ]
    }
  },
  "sort": [
    {
      "created_time": {
        "order": "desc"
      }
    }
  ]
}

Entonces, la consulta correcta es agregar desde = 0, tamaño = 11, es decir, especificar el tamaño esperado.

La consulta debe especificar el campo de clasificación de clasificación

Si la consulta de consulta en es no especifica el campo de ordenación, la consulta de cambio de página puede causar consultas repetidas y confusión de paginación.

De la siguiente manera, consulta 10 elementos por página, consulta varias páginas y se pueden devolver datos duplicados. En este momento, la consulta debe ordenar los campos de clasificación, que son lo más únicos posible, como la hora de creación o la clave principal, la identificación única campo, etc

{
	"from": 0,
	"size": 10,
	"query": {
		"bool": {
			"must": [{
				"term": {
					"month": "2022-12"
				}
			}]
		}
	}
}

En términos generales, esto se debe al mecanismo de almacenamiento y recuperación de fragmentos de ES. Una razón común es causada por la puntuación _score de ES. La clasificación predeterminada de ES es exactamente el orden inverso de _score. Cuando el _score de todos los documentos es 0, la paginación estará desordenada y, a veces, es probable que los resultados que aparecen en la primera página aparezcan repetidamente en la segunda y tercera páginas (dependiendo del orden de los resultados devueltos por fragmentos en ese momento). ).

3. Paginación desde el tamaño para establecer el tamaño de la ventana

Si lo está utilizando por primera vez y no está familiarizado con es, cuando la consulta de paginación desde + tamaño supere los 10 000, se informará la siguiente excepción:

Result window is too large, from + size must be less than or equal to: [10000] but was [22020]. 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 setting

上边 from+size=(pageNum-1)*size+size=(1101-1)*20+20=22020>10000,抛出了异常

当然10000也可以调整,如最大上限调整为800000

PUT my_index/_settings
 
{"index.max_result_window":"800000"}

之所以es默认设置最大查询量1w,与es的分布式存储和from+size的分页原理有关,可以参考之前的文章

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://www.cnblogs.com/lingyejun/p/17557526.html

Supongo que te gusta

Origin blog.csdn.net/lingyejun/article/details/131778597
Recomendado
Clasificación