バックグラウンド
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的分页原理有关,可以参考之前的文章
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。