distinct 句は、同じフィールド値を持つドキュメントの表示数を制限することで、検索結果を多様化します。このトピックでは、句の構文、dist_count および dist_times パラメーター、distinct uniq プラグインについて説明します。
機能概要
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 |
true |
サンプリング後に残りのドキュメントを保持するかどうかを指定します。 |
|
update_total_hit |
true/false |
いいえ |
true/false |
false |
|
|
dist_filter |
文字列 |
いいえ |
フィルター条件です。フィルターで除外されたドキュメントは、 |
||
|
grade |
浮動小数点 |
いいえ |
ドキュメントをグレードに分けるためのしきい値を指定します。その後、各グレード内のドキュメントに対して |
dist_count と dist_times の説明
次の例は、dist_count と dist_times の動作を示しています。id がプライマリキーで、name が多様化フィールドである 6 つのドキュメントがあるとします。
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句で使用されるフィールドは、アプリケーションスキーマでプロパティフィールドとして設定する必要があります。 -
サポートされているのは、整数型およびリテラルフィールド型のみです。配列型はサポートされていません。
-
複数の
dist_keyパラメーターを指定することはできません。 -
ソートでは重複は自動的に削除されません。ただし、
distinct句を使用して結果を重複排除できます。たとえば、同じタイトルを持つ重複記事を削除するには、dist_keyをtitle、dist_timesを1、dist_countを1に設定します。
distinct uniq プラグイン
reserved が false の場合、total および viewtotal の値が不正確になり、ページネーションやその他の操作で問題が発生する可能性があります。 distinct uniq プラグインは、dist_times が 1、dist_count が 1、および reserved が false の場合にこれらの値を修正します。 プラグインを使用するには、kvpair 句に duniqfield:field を追加します。 詳細については、「kvpair 句」をご参照ください。 例: kvpairs=duniqfield:name
注:
-
fieldは、distinct句のdist_keyと同じにする必要があります。 -
このプラグインは、
dist_timesが1、dist_countが1、reservedがfalseのクエリに対してのみ有効です。 -
パフォーマンス上の理由から、このプラグインが返す
totalの値は最大で 5,000 です。検索結果の実際の数が 5,000 を超える場合でも、total値は 5,000 として返されます。 -
total値の 5,000 の制限は、distinct uniqプラグインを使用した場合にのみ適用されます。プラグインを使用しない場合、total値は 5,000 に制限されません。 -
このプラグインを使用し、クエリが数百万件のレコードなど大量のデータにヒットした場合、クエリがタイムアウトする可能性があります。
例
-
「浙江大学」を含み、タイムスタンプ 1402301230 以降に作成されたドキュメントを検索します。
company_idフィールドに基づいて結果を多様化します。10 回のサンプリングラウンドを実行し、ラウンドごとに 2 つの結果をサンプリングします。query=default:'Zhejiang University'&&filter=create_time>1402301230&&distinct=dist_key:company_id,dist_count:2,dist_times:10 -
「浙江大学」を含むドキュメントを検索します。
company_idフィールドを使用して結果を重複排除し、会社ごとに 1 つのドキュメントのみを保持します。残りのドキュメントを破棄し、合計ヒット数を更新します。query=default:'Zhejiang University'&&distinct=dist_key:company_id,dist_count:1,dist_times:1,reserved:false&&kvpairs=duniqfield:company_id