distinct 句は、同一のフィールド値を持つドキュメントが結果セットに表示される数を制限し、検索結果を分散させます。これにより、特定の値が結果ページを独占することを防ぎます。
一般的なユースケース:
重複排除:タイトル、会社、または製品 SKU ごとに 1 件の結果のみを返します。
dist_count:1とdist_times:1を設定して、フィールド値ごとにドキュメントを 1 件だけ保持します。偏りの是正:特定の販売者または作成者が上位の結果を独占している場合は、
dist_countとdist_timesを使用してその割合に上限を設け、他の値のドキュメントを表示します。
構文
distinct=dist_key:<field>,dist_count:<n>,dist_times:<n>,reserved:<true|false>パラメーター
| パラメーター | タイプ | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
dist_key | 文字列 | はい | — | 結果を分散させる基準となるフィールドです。INT 型または LITERAL 型の属性フィールドである必要があります。 |
dist_count | int | いいえ | 1 | 分散操作ごとに抽出するドキュメント数です。 |
dist_times | int | いいえ | 1 | 実行する分散操作の回数です。 |
reserved | true/false | いいえ | true | 抽出されなかったドキュメントを保持するかどうかを指定します。破棄する場合は false に設定します。 |
update_total_hit | true/false | いいえ | false | reserved が false の場合にのみ適用されます。 true の場合、 total_hit の値は、破棄されたドキュメント数を差し引いて調整されますが、不正確な場合があります。 false の場合、 total_hit には破棄されたドキュメントが含まれます。 |
dist_filter | 文字列 | いいえ | — | 分散の対象から除外するドキュメントを指定するフィルター条件です。除外されたドキュメントは、分散されたドキュメントの最初のグループと並んでソートされます。デフォルトでは、すべてのドキュメントが分散の対象になります。 |
grade | 浮動小数点 | いいえ | — | 分散の前にドキュメントをカテゴリに分割するための、1 つ以上のスコアのしきい値です (| で区切ります) 。各カテゴリは、同じ dist_count と dist_times の値を使用して個別に分散されます。カテゴリは、最初のカテゴリと同じ順序でソートされます。省略した場合、すべてのドキュメントは 1 つのカテゴリとして扱われます。 |
reserved を false に設定すると、レスポンスに含まれる total と viewtotal の値が不正確になります。アプリケーションでこれらの値をページネーションまたは表示に使用している場合は、distinct uniq プラグインを参照してください。
dist_count と dist_times の仕組み
dist_count は、1 回の操作あたりに抽出するドキュメント数を制御します。 dist_times は、実行する操作の回数を制御します。抽出されたドキュメントは、各操作の順序に従って結果セットの先頭に配置されます。
テストデータ:
| ドキュメント | id | name |
|---|---|---|
| doc1 | 11 | a |
| doc2 | 22 | a |
| doc3 | 33 | a |
| doc4 | 44 | b |
| doc5 | 55 | c |
| doc6 | 66 | c |
例1:1 回の操作で 2 件のドキュメントを抽出し、操作を 1 回実行
distinct=dist_key:name,dist_count:2,dist_times:1,reserved:false結果:doc1, doc2, doc4, doc5, doc6
各 name の値から、最大 2 件のドキュメントが抽出されます。 name:a からは doc1 と doc2、 name:b からは doc4、 name:c からは doc5 と doc6 が抽出されます。 name:a を持つ 3 件目のドキュメントである doc3 は破棄されます。
例2:1 回の操作で 1 件のドキュメントを抽出し、操作を 2 回実行
distinct=dist_key:name,dist_count:1,dist_times:2,reserved:false結果:doc1, doc4, doc5, doc2, doc6
操作 1 では、各値の先頭ドキュメントを取得します:doc1 (a)、doc4 (b)、doc5 (c)。操作 2 では、各値の次のドキュメントを取得します:doc2 (a)、doc6 (c)。doc3 は破棄されます。
例3:1 回の操作で 1 件のドキュメントを抽出し、操作を 1 回実行
distinct=dist_key:name,dist_count:1,dist_times:1,reserved:false結果:doc1, doc4, doc5
値ごとに 1 件のドキュメントが保持されます。残りのドキュメントはすべて破棄されます。
grade パラメーター
grade を使用すると、分散の前にドキュメントをスコアに基づくカテゴリに分類できます。各カテゴリは、同じ dist_count と dist_times の値を使用して個別に分散されます。カテゴリは、最初のカテゴリと同じ順序でソートされます。
単一のしきい値:grade:3.0 は 2 つのカテゴリを作成します:
| カテゴリ | スコアの範囲 |
|---|---|
| 最初 | score < 3.0 |
| 2番目 | score >= 3.0 |
2つのしきい値:grade:3.0|5.0 は 3 つのカテゴリを作成します:
| カテゴリ | スコアの範囲 |
|---|---|
| 最初 | score < 3.0 |
| 2番目 | 3.0 <= score < 5.0 |
| 3番目 | score >= 5.0 |
しきい値の数に制限はありません。
注意事項
distinct 句はオプションです。
dist_keyで参照するフィールドは、アプリケーションスキーマで属性フィールドとして設定されている必要があります。dist_keyがサポートするフィールドタイプは INT 型と LITERAL 型のみです。配列フィールドはサポートされません。distinct 句あたり 1 つのフィールドのみを指定してください。
ソート機能では重複は除去されません。フィールド (例:
title) で重複排除するには、dist_count:1とdist_times:1を指定した distinct 句を使用します。
distinct uniq プラグイン
reserved が false の場合、レスポンスに含まれる total と viewtotal の値は不正確です。distinct uniq プラグインは、 dist_times、 dist_count、 reserved をそれぞれ 1、 1、 false に設定した場合に、これらの値を補正します。
プラグインを有効にするには、duniqfield:<field> を kvpairs 句に追加します:
kvpairs=duniqfield:<field><field> の値は dist_key と一致している必要があります。
制限事項:
dist_times=1、dist_count=1、reserved=falseの場合にのみ動作します。これらの値のいずれかを変更すると、プラグインは無効になります。一致する結果がそれ以上ある場合でも、クエリあたり最大 5,000 件の結果を返します。
数百万件のレコードにヒットするクエリでは、タイムアウトする場合があります。
例
会社ごとに結果を分散し、すべてのドキュメントを保持:
"Zhejiang University" を含むドキュメントを、create_time > 1402301230 の条件で検索し、 company_id で分散します。2 件ずつのドキュメントを 10 回の操作で抽出します。抽出されなかったドキュメントは保持され、後方にランク付けされます。
query=default:'Zhejiang University'&&filter=create_time>1402301230&&distinct=dist_key:company_id,dist_count:2,dist_times:10会社ごとに重複排除し、正確な結果数を取得:
"Zhejiang University" を含むドキュメントを検索し、 company_id ごとに 1 件のドキュメントのみを保持します。また、distinct uniq プラグインを使用して、正確な total と viewtotal の値を取得します。
query=default:'Zhejiang University'&&distinct=dist_key:company_id,dist_count:1,dist_times:1,reserved:false&&kvpairs=duniqfield:company_id