SpringBoot が ElasticSearch を統合すると、ページング並べ替えクエリで発生する落とし穴により、毎回 10 個のデータしか返せない

バックグラウンド

ElasticSearch は、単語のセグメンテーションをクエリし、ページ内の指定された数のデータ項目を返すために使用されますが、10 項目を超えるページ化されたデータ項目を取得したい場合、ElasticSearch は常に 10 項目のみを返すことができます。これは、ElasticSearch がクエリの速度を考慮してデフォルトでページング データを 10 個のみ返すように設定しているため、サイズ (返されるデータのサイズ) を変更することでページング クエリのデータのサイズを変更する必要があるためです。サイズが設定されていない場合は、10 個のアイテムのみを返すことができます。

1. クエリには from-size を含める必要があります

es のクエリクエリで from-size 値が指定されていない場合、es はデフォルトで from=0、size=10 となり、デフォルトでは一度に 10 個のデータをクエリします。

次のクエリ ステートメント、11 個の一意の ID クエリ、from と size を指定しない場合、11 個ではなく 10 個のデータのみが返されます。

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

したがって、正しいクエリは from=0、size=11 を追加すること、つまり、予想されるサイズを指定することです。

クエリでは並べ替えフィールドを指定する必要があります

es のクエリで並べ替えフィールドが指定されていない場合、ページめくりのクエリによってクエリが繰り返され、ページネーションが混乱する可能性があります。

以下のように、1 ページあたり 10 項目のクエリを実行した場合、複数のページをクエリした場合、重複したデータが返される可能性があります。このとき、クエリは、作成時間や主キー、一意の ID など、可能な限り一意の並べ替えフィールドを並べ替える必要があります。フィールドなど

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

一般に、これは ES のシャード ストレージとシャード取得メカニズムが原因で発生します。一般的な理由は、ES の _score スコアによって引き起こされます。ES のデフォルトの並べ替えは、_score の逆順です。すべてのドキュメントの _score が 0 の場合、ページングが乱れ、最初のページに表示される結果が 2 番目と 3 番目のページに繰り返し表示される可能性があります (その時点でシャードによって返される結果の順序によって異なります)。 )。

3. ウィンドウ サイズを設定するための From-size ページング

初めて使用し、es に慣れていない場合、from + size ページング クエリが 10,000 を超えると、次の例外が報告されます。

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

おすすめ

転載: blog.csdn.net/lingyejun/article/details/131778597