1. 実用上の問題
入力されたIDの順番通りに結果を出力する方法、IDの数は500、ページネーションはありますか?
質問のソース: https://t.zsxq.com/0cdyq7tzr
2. 提案討議
2.1 Elasticsearch のデフォルトのソートメカニズム
Elasticsearch では、ソート規則が指定されていない場合、デフォルトの検索結果のソート方法は、ドキュメントの関連性スコア (_score) に従って降順でソートされます。関連性スコアは、ドキュメントがクエリにどの程度一致しているかを示します。スコアが高いほど、ドキュメントはクエリによく一致します。
場合によっては、クエリ結果のスコアリングが適切でないか、計算されないことがあります。たとえば、Elasticsearch は、フィルター クエリ (terms、terms、ids クエリなど) のコンテキストや、boolean クエリのフィルター、must_not コンテキストではスコアを計算しません。このような場合、ドキュメントは通常、スコア 1.0 またはその他のデフォルト値 (フィルター、must_not スコア 0) でスコア付けされます。
2.2 割り当てに使用された ID に基づいてデータをシーケンシャルに呼び出す方法は?
ネイティブの Elasticsearch 取得メカニズムには、この機能がありません。つまり、自分で実装する必要があります。
どうやって?ユーザーから与えられた数列 (3、1、5、7 など、増加も減少もしない不規則な数列) を 1 次元配列データとして扱います。
それらの配列の添字は、0、1、2、3 のみにすることができます...つまり、添字は順番に並んでいます。
次に、次の質問は、配列の添え字に基づいて昇順にソートする方法の質問に移されますか?
ソートでソートされたスクリプトの足跡をソートすることで実現できます。
3.前提条件
PUT /_cluster/settings
{
"transient": {
"indices.id_field_data.enabled": true
}
}
解釈は次のとおりです。
PUT /_cluster/settings リクエストは、クラスター設定を更新するための Elasticsearch の API です。この特定の要求の意味は、クラスターの一時的な設定を更新したいということです。
{"transient": {"indices.id_field_data.enabled": true}}
このリクエストでは、index.id_field_data.enabled を true に設定します。
この設定は、Elasticsearch が _id フィールドの fielddata アクセスを許可するかどうかを制御します。
デフォルトでは、この設定は無効 (false) になっています。これは、_id フィールドの fielddata にアクセスすると大量のメモリが消費され、パフォーマンスが低下する可能性があるためです。
ここで使用される一時的な属性は、設定の変更が一時的であり、クラスターが再起動されるまで有効になることを意味します。クラスタが再起動すると、この設定はデフォルトにリセットされます。これを永続的に変更したい場合は、persistent 属性を使用できます。
PUT /_cluster/settings
{"persistent": {"indices.id_field_data.enabled": true}}
実際には、パフォーマンスの問題が発生する可能性があるため、_id フィールドのフィールドデータ アクセスを有効にすることはお勧めしません。
4. サンプルデータを与える
後で使用するためにバッチ データを提供します。
PUT test_index/_bulk
{"index":{"_id":1}}
{"title":"001"}
{"index":{"_id":3}}
{"title":"003"}
{"index":{"_id":5}}
{"title":"005"}
{"index":{"_id":7}}
{"title":"007"}
5.実装を与える
POST test_index/_search
{
"query": {
"ids": {
"values": [
"3",
"1",
"5",
"7"
]
}
},
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """
List ids_list = params.ids;
String cur_id = doc['_id'].value;
for(int i = 0; i < ids_list.length; i++)
{
if(cur_id.equals(ids_list[i]))
{
return i;
}
}
return -1;
""",
"params": {
"ids": ["3","1","5","7"]
}
},
"order": "asc"
}
}
]
}
解釈を実現する:
この Elasticsearch クエリは、test_index という名前のインデックスからドキュメントを検索するために使用されます。クエリの主な目的は、指定された ID リストに基づいてドキュメントを取得し、取得したドキュメントを ID リストの順に並べ替えることです。
クエリの各部分の詳細な説明は次のとおりです。
size: 10 に設定すると、クエリが最大 10 個のドキュメントを返すことを意味します。この場合、ID リストには 4 つの ID しか含まれていないため、クエリは最大 4 つのドキュメントを返します。
query: ids クエリを使用して、指定された ID リスト内のドキュメントをフィルタリングします。この例では、ID が「3」、「1」、「5」、および「7」のドキュメントを取得します。
sort: スクリプト ソート (_script) を使用して、返されたドキュメントを指定された ID リストの順に並べ替えます。-- type: "number" に設定します。これは、スクリプトによって返される値が数値として扱われることを示します。
script: 各ドキュメントのランク値を計算する Painless スクリプトを定義します。
lang: スクリプトが Painless 言語で記述されていることを示すには、「painless」に設定します。
source: スクリプトのソース コード。このスクリプトは、指定された ID のリストを繰り返し処理し、現在のドキュメントの _id に一致する ID を探します。一致が見つかった場合、ID リスト内の一致のインデックスが並べ替え値として返されます。一致するものが見つからない場合は、-1 が返されます (この例では、実際には何も起こりません)。
params: 並べ替える ID を含む ids というリストを含む、スクリプトのパラメーター。ここでは、ID のリストをパラメーターとしてスクリプトに渡します。
order: "asc" に設定すると、ドキュメントが昇順で並べ替えられます。これは、クエリ結果が ID リストの順序で返されることを意味します。
このクエリを使用すると、指定された ID を持つドキュメントを test_index インデックスから取得し、結果を指定された ID 順 ("3"、"1"、"5"、"7") で並べ替えることができます。
6. まとめ
ページネーションについては、共通検索の実装を参照してください。
この論文では、スクリプトソートの方法と組み合わせて、結果データはユーザーが指定した順序に基づいて呼び出されます。動画の解釈は以下の通りです。
それを達成するためのより良い方法はありますか?メッセージを残して交換することを歓迎します。
推奨読書
より短い時間でより速く、より多くの乾物を手に入れましょう!
世界中の約 1900 人以上の Elastic 愛好家と一緒に改善しましょう!
ワンランク上の乾物を学ぼう!