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