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 パラメーターの値が正確であることを保証します。 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