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

OpenSearch:distinct 句

最終更新日:Dec 28, 2024

概要

クエリステートメントに distinct 句を含めて、ステートメントに基づいて取得されたドキュメントを分散させることができます。これにより、システムが一意の結果を返すことが保証され、ユーザーエクスペリエンスが向上します。たとえば、クエリで多数のドキュメントが取得されます。ただし、特定のユーザーの複数のドキュメントは高く評価され、高いランクが割り当てられます。その結果、同じページに表示される結果のほとんどは同じユーザーからのものです。これは表示効果とユーザーエクスペリエンスに影響します。この場合、クエリステートメントに distinct 句を含めて、distinct 句で指定したルールに基づいて取得されたドキュメントのセットから特定のドキュメントを抽出できます。これにより、ドキュメントを分散させ、新しい順序でドキュメントをソートして、各ユーザーのドキュメントが表示されるようにすることができます。

構文

"distinct" : {
     "default": {  
      "dist_key" : "field", // 分散キーとなるフィールド
      "dist_count":number, // 抽出するドキュメントの数
      "dist_times" : number, // ドキュメントを抽出する回数
      "dist_filter" : "filter_expression", // フィルター条件
      "reserved" : boolean, // 抽出されなかったドキュメントを保持するかどうか
      "max_item_count" : number, // DISTINCT 計算で保持できるドキュメントの最大数
      "grade" : [] // ドキュメントを等級分けするためのしきい値
    },
    "rank": {  
      "dist_key" : "field", // 分散キーとなるフィールド
      "dist_count":number, // 抽出するドキュメントの数
      "dist_times" : number, // ドキュメントを抽出する回数
      "dist_filter" : "filter_expression", // フィルター条件
      "reserved" : boolean, // 抽出されなかったドキュメントを保持するかどうか
      "max_item_count" : number, // DISTINCT 計算で保持できるドキュメントの最大数
      "grade" : [] // ドキュメントを等級分けするためのしきい値
    },
    "rerank": {
      "dist_key" : "field", // 分散キーとなるフィールド
      "dist_count":number, // 抽出するドキュメントの数
      "dist_times" : number, // ドキュメントを抽出する回数
      "dist_filter" : "filter_expression", // フィルター条件
      "reserved" : boolean, // 抽出されなかったドキュメントを保持するかどうか
      "max_item_count" : number, // DISTINCT 計算で保持できるドキュメントの最大数
      "grade" : [] // ドキュメントを等級分けするためのしきい値
    }
  }
}

分散効果を確保するために、OpenSearch Retrieval Engine Edition は、粗ソートフェーズと精密ソートフェーズでドキュメントをソートするときにドキュメントを分散させます。粗ソートフェーズと精密ソートフェーズに同じまたは異なる分散ルールを指定できます。異なるフェーズで使用されるドキュメント分散ルールは、指定したルールによって異なります。次の項目に注意してください。

  • default ルールのみを指定した場合、粗ソートフェーズと精密ソートフェーズの両方でドキュメントを分散させるために default ルールが使用されます。

  • rank ルールのみを指定した場合、粗ソートフェーズでドキュメントを分散させるために rank ルールが使用されます。

  • rerank ルールのみを指定した場合、精密ソートフェーズでドキュメントを分散させるために rerank ルールが使用されます。

  • default ルールと rank ルールの両方を指定した場合、粗ソートフェーズでドキュメントを分散させるために rank ルールが使用され、精密ソートフェーズでドキュメントを分散させるために default ルールが使用されます。

  • default ルールと rerank ルールの両方を指定した場合、粗ソートフェーズでドキュメントを分散させるために default ルールが使用され、精密ソートフェーズでドキュメントを分散させるために rerank ルールが使用されます。

  • rank ルールと rerank ルールの両方を指定した場合、粗ソートフェーズでドキュメントを分散させるために rank ルールが使用され、精密ソートフェーズでドキュメントを分散させるために rerank ルールが使用されます。

  • default、rank、および rerank ルールを同時に指定した場合、粗ソートフェーズでドキュメントを分散させるために rank ルールが使用され、精密ソートフェーズでドキュメントを分散させるために rerank ルールが使用されます。

  • default、rank、および rerank ルールのいずれかを指定する必要があります。

パラメーター

  • dist_key: 必須。取得したドキュメントを分散させるための基準となる属性フィールド。

  • dist_count: オプション。抽出するドキュメントの数。デフォルト値: 1。

  • dist_times: オプション。ドキュメントを抽出する回数。デフォルト値: 1。

  • dist_filter: オプション。フィルター条件。システムは、指定された条件に基づいてフィルタリングされたドキュメントを分散オブジェクトとして使用しません。精密ソートフェーズでは、システムは distinct 句を使用して抽出したドキュメントを、フィルタリングされたドキュメントと一緒にソートします。デフォルトでは、システムは取得したすべてのドキュメントを分散オブジェクトとして使用します。

  • reserved: オプション。抽出されなかった残りのドキュメントを保持するかどうかを指定します。有効な値: true および false。デフォルト値: true。このパラメーターを false に設定すると、システムは抽出されなかったドキュメントを破棄します。この場合、一致する結果の合計数が不正確になる可能性があります。

  • max_item_count: オプション。DISTINCT 計算で保持できるドキュメントの最大数。保持できるドキュメントの最大数は、max(max_item_count, hit) 関数を使用して計算されます。

    • 最終結果がページごとに正しく返されるようにするには、このパラメーターをクエリできるドキュメントの最大数に設定します。たとえば、1 ページあたり 10 件の結果が返され、最大 100 ページが返される場合、このパラメーターを 1000 に設定できます。

  • grade: オプション。システムがドキュメントを異なる等級に分類するためのしきい値。システムは、指定した等級のしきい値に基づいて、各等級からドキュメントを抽出します。このパラメーターを distinct 句に含めない場合、システムはデフォルトですべてのドキュメントを 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 番目の等級に分類されます。異なる等級のドキュメントは、粗ソートフェーズのドキュメントと同じ順序でソートする必要があります。ドキュメントが粗ソートフェーズで降順にソートされている場合、異なる等級のドキュメントも降順にソートされます。ドキュメントが粗ソートフェーズで昇順にソートされている場合、異なる等級のドキュメントも昇順にソートされます。

例:

"distinct" : {
     "default": {  
      "dist_key" : "company_id", // 企業IDに基づいて分散
      "dist_count":2, // 各ラウンドで2つのドキュメントを抽出
      "dist_times" : 10 // 抽出を10回繰り返す
    }
}
この例では、システムは company_id フィールドに基づいて 10 回のドキュメント抽出を実行し、ドキュメント抽出の各ラウンドで 2 つのドキュメントを抽出します。システムは、抽出されないドキュメントにより低いランクを割り当てます。

dist_count と dist_times

次の例は、distinct 句で dist_count パラメーターと dist_times パラメーターを指定する方法と、システムがこれらのパラメーターの値に基づいて一意の結果を取得する方法を示しています。

たとえば、システムはクエリに対して 6 つのドキュメントを取得します。ドキュメントには、id と name という属性フィールドが含まれています。id フィールドは主キーフィールドです。name フィールドを distinct キーとして指定できます。

doc 1:  id:1  name:a

doc 2:  id:2  name:a

doc 3:  id:3  name:a

doc 4:  id:4  name:b

doc 5:  id:5  name:c

doc 6:  id:6  name:c

ケース 1:

"distinct" : {
     "default": {  
      "dist_key" : "name", // 名前に基づいて分散
      "dist_count":2, // 各名前に対して2つのドキュメントを抽出
      "dist_times" : 1 // 1回の抽出を実行
    }
}
次の結果が順番に返されます: doc1、doc2、doc4、doc5、および doc6。

ケース 2:

"distinct" : {
     "default": {  
      "dist_key" : "name", // 名前に基づいて分散
      "dist_count":1, // 各名前に対して1つのドキュメントを抽出
      "dist_times" : 2 // 2回の抽出を実行
    }
}
次の結果が順番に返されます: doc1、doc4、doc5、doc2、および doc6。

ケース 3:

"distinct" : {
     "default": {  
      "dist_key" : "name", // 名前に基づいて分散
      "dist_count":1, // 各名前に対して1つのドキュメントを抽出
      "dist_times" : 1 // 1回の抽出を実行
    }
}
次の結果が順番に返されます: doc1、doc4、および doc5。

distinct uniq プラグイン

reserved パラメーターを false に設定すると、返された結果の total パラメーターと viewtotal パラメーターの値が不正確になる可能性があります。これらのパラメーターの値に基づいて結果をページごとに表示したり、他の操作を実行したりすると、エラーが発生する可能性があります。この問題を解決するために、OpenSearch は distinct uniq プラグインを提供して、dist_times、dist_count、および reserved パラメーターが 1、1、および false に設定されている場合に total パラメーターと viewtotal パラメーターの値が正確になるようにします。

distinct uniq プラグインを使用するには、kvpairs 句に duniqfield:field を含めます。

注:

  • kvpairs 句の duniqfield パラメーターの値は、distinct 句の dist_key パラメーターの値と同じである必要があります。

  • このプラグインは、dist_times パラメーターが 1 に設定され、dist_count パラメーターが 1 に設定され、reserved パラメーターが false に設定されている場合にのみ機能します。これらのパラメーターの値を他の値に変更すると、このプラグインは機能しません。

  • パフォーマンス上の理由から、このプラグインはクエリごとに最大 5,000 件のクエリ結果を返すことができます。クエリ結果の数が 5,000 を超える場合、このプラグインは 5,000 件の結果を返します。

例:

{
  "distinct" : {
    "default": {  
      "dist_key" : "company_id", // 企業IDに基づいて分散
      "dist_count":1, // 各企業IDに対して1つのドキュメントを抽出
      "dist_times" : 1, // 1回の抽出を実行
      "reserved" : false // 抽出されなかったドキュメントを破棄
    }
  },
  "kvpairs" : {
    "duniqfield":"company_id" // distinct uniq プラグインを使用するために、duniqfieldパラメーターを指定
  }
}

使用上の注意

  • distinct 句で指定するフィールドは、schema.json ファイルで指定する属性フィールドである必要があります。

  • ARRAY 型はサポートされていません。INT 型と LITERAL 型のみがサポートされています。