説明
ステートメントに distinct 句を含めて、ステートメントに基づいて取得されたドキュメントを分散させることができます。これにより、システムが一意の結果を返し、ユーザーエクスペリエンスを向上させることができます。たとえば、クエリで多数のドキュメントが取得されます。ただし、特定のユーザーの複数のドキュメントのスコアが高く、上位にランク付けされます。その結果、同じページに表示される結果のほとんどは同じユーザーからのものです。これは表示効果とユーザーエクスペリエンスに影響します。この場合、ステートメントに distinct 句を含めて、distinct 句で指定したルールに基づいて取得されたドキュメントのセットから特定のドキュメントを抽出できます。これにより、ドキュメントを分散させ、ドキュメントを新しい順序でソートして、各ウェブサイトのドキュメントが表示されるようにすることができます。
構文
distinct=dist_key:field,dist_count:1,dist_times:1,reserved:false
パラメーター:
dist_key: 必須。取得したドキュメントを分散させるための基準となる属性フィールド。
dist_times: オプション。ドキュメント抽出を実行する回数。デフォルト値: 1。
dist_count: オプション。ドキュメント抽出が実行されるたびに抽出するドキュメントの数。デフォルト値: 1。
reserved: オプション。抽出されていない残りのドキュメントを保持するかどうかを指定します。有効な値: true および false。デフォルト値: true。このパラメーターの値を false に設定すると、システムは抽出されていないドキュメントを破棄します。この場合、total_hit レスポンスパラメーターの値が不正確になる可能性があります。
update_total_hit: オプション。デフォルト値: false。reserved パラメーターの値を false に、update_total_hit パラメーターの値を true に設定すると、システムは破棄されたドキュメントの数と total_hit パラメーターの値の差を計算します。total_hit レスポンスパラメーターの値が不正確になる可能性があります。update_total_hit パラメーターの値を false に設定すると、total_hit パラメーターの値には破棄されたドキュメントの数が含まれます。
dist_filter: オプション。フィルター条件。システムは、指定された条件に基づいてフィルタリングされたドキュメントを分散オブジェクトとして使用しません。システムが精密ソートを実行すると、distinct 句で抽出されたドキュメントとフィルタリングされたドキュメントが一緒にソートされます。デフォルトでは、システムは取得されたすべてのドキュメントを分散オブジェクトとして使用します。
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=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 フィールドを一意キーとして指定できます。
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=dist_key:name,dist_count:2,dist_times:1 は、doc 1、doc 2、doc 4、doc 5、doc 6 を順番に返します。
ケース 2:
distinct=dist_key:name,dist_count:1,dist_times:2 は、doc 1、doc 4、doc 5、doc 2、doc 6 を順番に返します。
ケース 3:
distinct=dist_key:name,dist_count:1,dist_times:1 は、doc 1、doc 4、doc 5 を順番に返します。
複数フェーズでのドキュメントの分散
OpenSearch Retrieval Engine Edition インスタンスは、Searcher ノードでの 2 つのフェーズのソート(粗ソートと精密ソート)をサポートしています。システムは、指定したスコアの数を基に、精密ソートを実行する必要がある回数を決定します。distinct 句には、2 つのサブ distinct 句を指定できます。システムは、粗ソート中に最初のサブ distinct 句を実行し、粗ソートと精密ソートの完了後に 2 番目のサブ distinct 句を実行してクエリ結果を分散させます。ドキュメント分散の 2 つのフェーズを、ソート中分散とソート後分散と呼ぶことができます。たとえば、最初のサブ distinct 句に大きな dist_count 値を指定し、2 番目のサブ distinct 句に小さな dist_count 値を指定できます。最初のサブ distinct 句の dist_count パラメーターの大きな値は、粗ソート中にシステムが十分な数のドキュメントを抽出することを保証するために使用されます。粗ソート中にドキュメントを分散させず、粗ソートと精密ソートの完了後にドキュメントを分散させるように指定することもできます。
注
粗ソートと精密ソートの完了後にドキュメントの分散が必要で、start + hit 式に基づいて計算された値がスコアの rank_size パラメーターの値よりも大きい場合、ページネーション機能が不安定になる可能性があります。
構文: distinct = sub_distinct_clause_when_sort;sub_distinct_clause_after_sort。この句では、sub_distinct_clause_when_sort パラメーターは粗ソート中のドキュメント分散に使用されるサブ distinct 句を指定し、sub_distinct_clause_after_sort パラメーターは粗ソートと精密ソートの完了後にドキュメント分散に使用されるサブ distinct 句を指定します。
構文に基づいて、次の形式で distinct 句を指定できます。
distinct = sub_dist_clause;none_sub_dist_clause: 粗ソート中に sub_dist_clause パラメーターの構成に基づいてドキュメントを分散させ、粗ソートと精密ソートの完了後にドキュメントを分散させないことを指定します。例: "distinct=dist_key:company_id,dist_count:1,dist_times:1;none_dist"。
distinct = sub_dist_clause1;sub_dist_clause2: 粗ソート中に sub_dist_clause1 パラメーターの構成に基づいてドキュメントを分散させ、粗ソートと精密ソートの完了後に sub_dist_clause2 パラメーターの構成に基づいてドキュメントを分散させることを指定します。例:
"distinct=dist_key:company_id,dist_count:2,dist_times:1;dist_key:company_id,dist_count:1,dist_times:1"
distinct = none_sub_dist_clause;sub_dist_clause: 粗ソート中にドキュメントを分散させず、粗ソートと精密ソートの完了後に sub_dist_clause パラメーターの構成に基づいてドキュメントを分散させることを指定します。例: "distinct=none_dist;dist_key:company_id,dist_count:1,dist_times:1"。
distinct = sub_dist_clause: 粗ソート中と粗ソートと精密ソートの完了後に、sub_dist_clause パラメーターの構成に基づいてドキュメントを分散させることを指定します。例: "distinct=dist_key:company_id,dist_count:1,dist_times:1"。distinct = none_sub_dist_clause; none_sub_dist_clause 句は無効です。取得したドキュメントを分散させない場合は、ステートメントに distinct 句を含めないでください。
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 句の指定方法については、kvpairs 句を参照してください。例: kvpairs=duniqfield:name
注:
kvpairs 句の duniqfield パラメーターの値は、distinct 句の dist_key パラメーターの値と同じである必要があります。
このプラグインは、dist_times パラメーターが 1 に設定され、dist_count パラメーターが 1 に設定され、reserved パラメーターが false に設定されている場合にのみ機能します。これらのパラメーターの値を他の値に変更すると、このプラグインは機能しません。
パフォーマンス上の理由から、このプラグインはクエリごとに最大 5,000 件のクエリ結果を返すことができます。クエリ結果の数が 5,000 を超える場合、このプラグインは 5,000 件の結果を返します。
例:
distinct=dist_key:company_id,dist_count:1,dist_times:1,reserved:false&&kvpairs=duniqfield:company_id
使用上の注意
distinct 句はオプションです。
distinct 句で指定するフィールドは、schema.json ファイルで指定した属性フィールドである必要があります。
ARRAY 型はサポートされていません。INT 型と LITERAL 型のみがサポートされています。
ドキュメントを分散させるために指定できるフィールドは 1 つだけです。