すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:結果の多様化:distinct 句

最終更新日:Jun 23, 2026

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

各ラウンドにおいて、dist_key で指定されたフィールドのユニークな値ごとにサンプリングするドキュメントの数です。

reserved

true/false

いいえ

true/false

true

サンプリング後に残りのドキュメントを保持するかどうかを指定します。false に設定すると、残りのドキュメントは破棄され、一致した結果の total カウントが不正確になります。

update_total_hit

true/false

いいえ

true/false

false

reservedfalse の場合、update_total_hittrue に設定すると、最終的な total_hitdistinct によって破棄されたドキュメントの数だけ減少します。この数は正確ではない場合があります。false の場合、数は減少しません。

dist_filter

文字列

いいえ

フィルター条件です。フィルターで除外されたドキュメントは、distinct 操作に参加せず、distinct によって返される最初のグループの結果と一緒にソートされます。デフォルトでは、すべてのドキュメントが distinct 操作に参加します。

grade

浮動小数点

いいえ

ドキュメントをグレードに分けるためのしきい値を指定します。その後、各グレード内のドキュメントに対して distinct 操作が実行されます。このパラメーターが指定されていない場合、すべてのドキュメントは単一のグレードとして扱われます。ドキュメントは、第 1 次元のソート基準からのスコアに基づいてグレード分けされます。複数のしきい値を区切るには、パイプ (|) を使用します。グレードの数に制限はありません。例:1. grade:3.0:第 1 次元のソートスコアに基づいて、ドキュメントを 2 つのグレードに分けます。スコアが 3.0 未満のドキュメントは第 1 グレードです。スコアが 3.0 以上のドキュメントは第 2 グレードです。2. grade:3.0|5.0:ドキュメントを 3 つのグレードに分けます。第 1 グレードはスコアが 3.0 未満、第 2 グレードは 3.0 以上 5.0 未満、第 3 グレードは 5.0 以上となります。グレードの順序は、第 1 次元基準のソート順に従います。たとえば、ソート順が降順の場合、グレードも最高から最低の順に並べられます。

dist_count と dist_times の説明

次の例は、dist_countdist_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。

注意事項

  1. distinct 句はオプションです。

  2. distinct 句で使用されるフィールドは、アプリケーションスキーマでプロパティフィールドとして設定する必要があります。

  3. サポートされているのは、整数型およびリテラルフィールド型のみです。配列型はサポートされていません。

  4. 複数の dist_key パラメーターを指定することはできません。

  5. ソートでは重複は自動的に削除されません。ただし、distinct 句を使用して結果を重複排除できます。たとえば、同じタイトルを持つ重複記事を削除するには、dist_keytitledist_times1dist_count1 に設定します。

distinct uniq プラグイン

reservedfalse の場合、total および viewtotal の値が不正確になり、ページネーションやその他の操作で問題が発生する可能性があります。 distinct uniq プラグインは、dist_times1dist_count1、および reservedfalse の場合にこれらの値を修正します。 プラグインを使用するには、kvpair 句に duniqfield:field を追加します。 詳細については、「kvpair 句」をご参照ください。 例: kvpairs=duniqfield:name

注:

  • field は、distinct 句の dist_key と同じにする必要があります。

  • このプラグインは、dist_times1dist_count1reservedfalse のクエリに対してのみ有効です。

  • パフォーマンス上の理由から、このプラグインが返す total の値は最大で 5,000 です。検索結果の実際の数が 5,000 を超える場合でも、total 値は 5,000 として返されます。

  • total 値の 5,000 の制限は、distinct uniq プラグインを使用した場合にのみ適用されます。プラグインを使用しない場合、total 値は 5,000 に制限されません。

  • このプラグインを使用し、クエリが数百万件のレコードなど大量のデータにヒットした場合、クエリがタイムアウトする可能性があります。

  1. 「浙江大学」を含み、タイムスタンプ 1402301230 以降に作成されたドキュメントを検索します。company_id フィールドに基づいて結果を多様化します。10 回のサンプリングラウンドを実行し、ラウンドごとに 2 つの結果をサンプリングします。

    query=default:'Zhejiang University'&&filter=create_time>1402301230&&distinct=dist_key:company_id,dist_count:2,dist_times:10
  2. 「浙江大学」を含むドキュメントを検索します。company_id フィールドを使用して結果を重複排除し、会社ごとに 1 つのドキュメントのみを保持します。残りのドキュメントを破棄し、合計ヒット数を更新します。

    query=default:'Zhejiang University'&&distinct=dist_key:company_id,dist_count:1,dist_times:1,reserved:false&&kvpairs=duniqfield:company_id