概要
ステートメントに distinct 句を含めて、ステートメントに基づいて取得されたドキュメントを分散させることができます。これにより、システムが一意の結果を返すことが保証され、ユーザーエクスペリエンスが向上します。たとえば、クエリで多数のドキュメントが取得されたが、特定のユーザーの複数のドキュメントのスコアが高く、上位にランク付けされている場合、同じページに表示される結果のほとんどが同じユーザーからのものになります。これは表示効果とユーザーエクスペリエンスに影響します。この場合、ステートメントに distinct 句を含めて、distinct 句で指定したルールに基づいて取得されたドキュメントのセットから特定のドキュメントを抽出できます。これにより、ドキュメントを分散させ、新しい順序でドキュメントをソートして、各 Web サイトのドキュメントが表示されるようにすることができます。
構文
"distinct" : {
"default": {
"dist_key" : "field",
"dist_count":number,
"dist_times" : number,
"dist_filter" : "filter_expression",
"reserved" : boolean,
"max_item_count" : number,
"grade" : []
},
"rank": {
"dist_key" : "field",
"dist_count":number,
"dist_times" : number,
"dist_filter" : "filter_expression",
"reserved" : boolean,
"max_item_count" : number,
"grade" : []
},
"rerank": {
"dist_key" : "field",
"dist_count":number,
"dist_times" : number,
"dist_filter" : "filter_expression",
"reserved" : boolean,
"max_item_count" : number,
"grade" : []
}
}
}デフォルトでは、ドキュメントは粗ソートフェーズと精密ソートフェーズの両方で分散されます。これにより、分散効果が保証されます。同じ分散ルールを使用することも、異なる分散ルールを指定することもできます。分散ルールは、次のように異なるフェーズで有効になります。
default ルールのみを指定した場合、ドキュメントは粗ソートフェーズと精密ソートフェーズの両方で default ルールを使用して分散されます。
rank ルールのみを指定した場合、ドキュメントは粗ソートフェーズでのみ rank ルールを使用して分散されます。
rerank ルールのみを指定した場合、ドキュメントは精密ソートフェーズでのみ rerank ルールを使用して分散されます。
default ルールと rank ルールの両方を指定した場合、ドキュメントは粗ソートフェーズで rank ルールを使用して、精密ソートフェーズで default ルールを使用して分散されます。
default ルールと rerank ルールの両方を指定した場合、ドキュメントは粗ソートフェーズで default ルールを使用して、精密ソートフェーズで rerank ルールを使用して分散されます。
rank ルールと rerank ルールの両方を指定した場合、ドキュメントは粗ソートフェーズで rank ルールを使用して、精密ソートフェーズで rerank ルールを使用して分散されます。
default ルール、rank ルール、rerank ルールのすべてを同時に指定した場合、ドキュメントは粗ソートフェーズで rank ルールを使用して、精密ソートフェーズで rerank ルールを使用して分散されます。
default、rank、rerank ルールの少なくとも 1 つを指定する必要があります。
パラメーター
dist_key: 必須。取得したドキュメントを分散させるための基準となる属性フィールド。
dist_count: オプション。ドキュメント抽出を実行するたびに抽出するドキュメントの数。デフォルト値: 1。
dist_times: オプション。ドキュメント抽出を実行する回数。デフォルト値: 1。
dist_filter: オプション。フィルター条件。システムは、指定された条件に基づいて除外されたドキュメントを分散オブジェクトとして使用しません。システムが精密ソートを実行するとき、distinct 句を使用して抽出されたドキュメントと除外されたドキュメントを一緒にソートします。デフォルトでは、システムは取得されたすべてのドキュメントを分散オブジェクトとして使用します。
reserved: オプション。このパラメーターは、抽出されていない残りのドキュメントを保持するかどうかを指定します。有効な値: true および false。デフォルト値: true。このパラメーターの値を false に設定すると、システムは抽出されていないドキュメントを破棄します。この場合、total_hit レスポンスパラメーターの値が不正確になる可能性があります。
max_item_count: オプション。分散中に保持できるドキュメントの最大数。保持されるドキュメントの最大数は max(max_item_count, hit) です。
ページめくりで最終結果が安定するように、このパラメーターをクエリできるドキュメントの最大数に設定できます。たとえば、ページごとに 10 件の結果が返され、最大 100 ページが返される場合、このパラメーターを 1000 (10 × 100) に設定できます。
grade: オプション。システムがドキュメントを異なるグレードに分類するためのしきい値。システムは、グレードに指定したしきい値に基づいて、各グレードからドキュメントを抽出します。distinct 句に grade パラメーターを含めない場合、システムはデフォルトですべてのドキュメントを 1 つのグレードに分類します。システムは、粗ソート用に計算された関連性スコアに基づいてドキュメントをグレードに分類します。複数のグレードを指定する場合は、しきい値を縦棒 (|) で区切ります。指定できるグレードの数に制限はありません。例 1: grade:3.0。この場合、ドキュメントは指定されたしきい値に基づいて 2 つのカテゴリに分類されます。スコアが 3.0 未満のドキュメントは最初のカテゴリに分類されます。スコアが 3.0 以上のドキュメントは 2 番目のカテゴリに分類されます。例 2: grade:3.0|5.0。この場合、ドキュメントは 3 つのカテゴリに分類されます。スコアが 3.0 未満のドキュメントは最初のカテゴリに分類されます。スコアが 3.0 以上 5.0 未満のドキュメントは 2 番目のカテゴリに分類されます。スコアが 5.0 以上のドキュメントは 3 番目のカテゴリに分類されます。グレードに使用するソート方法は、粗ソート中にドキュメントに使用するソート方法と同じである必要があります。粗ソート中にドキュメントが降順でソートされる場合、グレードも降順でソートされます。粗ソート中にドキュメントが昇順でソートされる場合、グレードも昇順でソートされます。
例:
"distinct" : {
"default": {
"dist_key" : "company_id",
"dist_count":2,
"dist_times" : 10
}
}
この例では、システムは company_id フィールドに基づいて 10 回のドキュメント抽出を実行し、ドキュメント抽出のたびに 2 つのドキュメントを抽出します。システムは、抽出されていないドキュメントにより低いランクを割り当てます。dist_count パラメーターと dist_times パラメーターの説明
次の例は、distinct 句で dist_count パラメーターと dist_times パラメーターを指定する方法と、システムがこれらのパラメーターの値に基づいて一意の結果を取得する方法を示しています。
たとえば、システムはクエリに対して 6 つのドキュメントを取得します。ドキュメントには、id と name という属性が含まれています。id フィールドは主キーフィールドです。name フィールドを distinct キーとして指定できます。
doc 1: id:1 name:a
doc 2: id:2 name:a
doc 3: id:3 name:a
doc 4: id:4 name:b
doc 5: id:5 name:c
doc 6: id:6 name:c
ケース 1:
"distinct" : {
"default": {
"dist_key" : "name",
"dist_count":2,
"dist_times" : 1
}
}
# 分散後の結果は次のとおりです: doc1、doc2、doc4、doc5、doc6。ケース 2:
"distinct" : {
"default": {
"dist_key" : "name",
"dist_count":1,
"dist_times" : 2
}
}
# 分散後の結果は次のとおりです: doc1、doc4、doc5、doc2、doc6。ケース 3:
"distinct" : {
"default": {
"dist_key" : "name",
"dist_count":1,
"dist_times" : 1
}
}
# 分散後の結果は次のとおりです: doc1、doc4、doc5。distinct uniq プラグイン
上記のように、reserved パラメーターを false に設定すると、検索結果に関連する total パラメーターと viewtotal パラメーターの値が不正確になります。この場合、これらの値に基づいてページングを実装したり、その他の処理を実行したりすると、エラーが発生する可能性があります。このため、OpenSearch は distinct uniq プラグインを提供して、dist_times、dist_count、reserved パラメーターが 1、1、false に設定されている場合に total パラメーターと viewtotal パラメーターの値が正確になるようにします。
distinct uniq プラグインを使用するには、kvpairs 句に duniqfield:field を含めます。
次の点に注意してください。
kvpairs 句の duniqfield パラメーターの値は、distinct 句の dist_key パラメーターの値と同じである必要があります。
このプラグインは、dist_times パラメーターが 1、dist_count パラメーターが 1、reserved パラメーターが false に設定されている場合にのみ機能します。これらのパラメーターの値を他の値に変更すると、このプラグインは機能しません。
パフォーマンス上の理由から、このプラグインは、クエリ結果の数が 5,000 を超える場合でも、クエリごとに最大 5,000 件のクエリ結果を返すことができます。
例:
{
"distinct" : {
"default": {
"dist_key" : "company_id",
"dist_count":1,
"dist_times" : 1,
"reserved" : false
}
},
"kvpairs" : {
"duniqfield":"company_id"
}
}使用上の注意
distinct 句で指定するフィールドは、schema.json ファイルで指定する属性フィールドである必要があります。
ARRAY 型はサポートされていません。INT 型と LITERAL 型のみがサポートされています。