distinct句を使用すると、多様な検索結果を得ることができます。これにより、ユーザーエクスペリエンスが向上します。たとえば、クエリで多数のドキュメントが取得されたとします。特定のユーザーの複数のドキュメントのスコアが高く、上位にランク付けされている場合、同じページに表示される結果のほとんどが同じユーザーからのものになります。これは表示効果とユーザーエクスペリエンスに影響します。この場合、distinct句を使用して各ユーザーからドキュメントを抽出することで、各ユーザーのドキュメントを表示できます。
構文
dist_key:field,dist_count:1,dist_times:1,reserved:false.
パラメーター | タイプ | 必須 | 有効な値 | デフォルト値 | 説明 |
dist_key | string | はい | 分散対象のフィールド。 | ||
dist_times | int | いいえ | 1 | 抽出回数。 | |
dist_count | int | いいえ | 1 | 1回の抽出で抽出するドキュメントの数。 | |
reserved | true/false | いいえ | true/false | true | 抽出後に残りのドキュメントを保持するかどうかを指定します。このパラメーターをfalseに設定すると、残りのドキュメントは破棄されます。その結果、一致する結果の総数は不正確になります。 |
update_total_hit | true/false | いいえ | true/false | false | reservedパラメーターの値をfalseに設定し、update_total_hitパラメーターの値をtrueに設定すると、システムは破棄されたドキュメントの数とtotal_hitパラメーターの値の差を計算します。total_hitレスポンスパラメーターの値は不正確になる可能性があります。update_total_hitパラメーターの値をfalseに設定すると、total_hitパラメーターの値には破棄されたドキュメントの数が含まれます。 |
dist_filter | string | いいえ | フィルター条件。除外されたドキュメントは分散されませんが、分散されたドキュメントの最初のグループと一緒にソートされます。デフォルトでは、すべてのドキュメントが分散されます。 | ||
grade | float | いいえ | ドキュメントを異なるカテゴリに分類するためのしきい値。すべてのドキュメントは、指定されたしきい値に基づいて異なるカテゴリに分類されます。各カテゴリのドキュメントは、distinct句のパラメーターに基づいて分散されます。gradeパラメーターはオプションです。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番目のカテゴリに分類されます。カテゴリは、最初のカテゴリのドキュメントのソートに使用されるのと同じ順序でソートされます。最初のカテゴリのドキュメントが降順でソートされている場合、カテゴリは降順でソートされます。これは逆の場合も同様です。 |
dist_countパラメーターとdist_timesパラメーターの説明
次の例では、dist_countパラメーターとdist_timesパラメーターの使用方法と意味について説明します。6つのドキュメントが提供されています。idは主キーフィールド、nameは分散対象のフィールドです。
doc1: id:11 name:a
doc2: id:22 name:a
doc3: id:33 name:a
doc4: id:44 name:b
doc5: id:55 name:c
doc6: id:66 name:c
例1: distinct=dist_key:name,dist_count:2,dist_times:1,reserved:false
。この例では、1回の抽出が実行され、2つのドキュメントが抽出されます。分散後の結果は、doc1、doc2、doc4、doc5、doc6です。
例2: distinct=dist_key:name,dist_count:1,dist_times:2,reserved:false
。この例では、2回の抽出が実行されます。各抽出で1つのドキュメントが抽出されます。分散後の結果は、doc1、doc4、doc5、doc2、doc6です。
例3: distinct=dist_key:name,dist_count:1,dist_times:1,reserved:false
。この例では、1回の抽出が実行され、1つのドキュメントが抽出されます。分散後の結果は、doc1、doc4、doc5です。
使用上の注意
distinct句はオプションです。
distinct句で参照されるフィールドは、アプリケーションスキーマを定義するときに属性フィールドとして設定する必要があります。
distinct句ではARRAY型のフィールドを指定できません。INT型とLITERAL型のフィールドのみがサポートされています。
分散対象のフィールドは1つだけ指定できます。
ソート機能は重複を自動的に削除できません。ただし、distinct句を使用して重複を削除できます。たとえば、同じタイトルのドキュメントを重複排除する場合、タイトルを分散対象のフィールドとして指定し、1回の抽出を実行できます。抽出では、1つのドキュメントが抽出されます。
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:name
。
注記
fieldパラメーターの値は、distinct句のdist_keyパラメーターの値と同じにする必要があります。
このプラグインは、dist_times、dist_count、reservedパラメーターが1、1、falseに設定されている場合にのみ機能します。これらのパラメーターの値が変更された場合、このプラグインは機能しません。
パフォーマンス上の理由から、このプラグインは、5,000を超える検索結果が取得された場合でも、各クエリで最大5,000の検索結果を返します。
このプラグインを数百万のデータレコードにヒットするクエリで使用すると、タイムアウトが発生する可能性があります。
例
create_timeパラメーターの値が1402301230より大きく、「浙江大学」が含まれているドキュメントを検索します。取得されたドキュメントは、company_idフィールドに基づいて分散されます。合計10回の抽出が実行されます。各抽出で2つのドキュメントが抽出されます。抽出されたドキュメントは最後にランク付けされます。
query=default:'浙江大学'&&filter=create_time>1402301230&&distinct=dist_key:company_id,dist_count:2,dist_times:10
「浙江大学」を含むドキュメントを検索します。取得されたドキュメントは、company_idフィールドに基づいて分散されます。1回の抽出が実行され、1つのドキュメントが抽出されます。抽出後の残りのドキュメントは破棄され、抽出されたドキュメントのみが返されます。
query=default:'浙江大学'&&distinct=dist_key:company_id,dist_count:1,dist_times:1,reserved:false&&kvpairs=duniqfield:company_id