Retriever

この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。GAの前に構文が変更される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。

リトリーバーは、検索から返されるトップドキュメントを記述するための仕様です。リトリーバーは、search APIの他の要素を置き換え、queryknnなどのトップドキュメントを返します。リトリーバーは子リトリーバーを持つことができ、2つ以上の子を持つリトリーバーは複合リトリーバーと見なされます。これにより、検索中に発生する操作の順序を明確にするために、リトリーバーツリーと呼ばれる木構造で複雑な動作を描写できます。

リトリーバーの抽象化の高レベルの概要については、Retrieversを参照してください。

以下のリトリーバーが利用可能です:

Standard Retriever

スタンダードリトリーバーは、伝統的なqueryからトップドキュメントを返します。

Parameters:

  • query
  • (オプション、query object)
    トップドキュメントのセットを取得するためのクエリを定義します。
  • filter
  • (オプション、query objectまたはquery objectのリスト)
    このリトリーバーにboolean query filterを適用し、すべてのドキュメントがこのクエリに一致する必要がありますが、スコアには寄与しません。
  • search_after
  • (オプション、search after object)
    ページネーションに使用されるsearch afterオブジェクトパラメータを定義します。
  • terminate_after
  • (オプション、整数) 各シャードで収集する最大ドキュメント数。クエリがこの制限に達すると、Elasticsearchはクエリを早期に終了します。Elasticsearchはソート前にドキュメントを収集します。
    注意して使用してください。Elasticsearchはこのパラメータをリクエストを処理する各シャードに適用します。可能な場合は、Elasticsearchに自動的に早期終了を行わせてください。このパラメータを、複数のデータティアにわたるバックインデックスを持つデータストリームをターゲットにするリクエストに指定することは避けてください。
  • sort
  • (オプション、sort object) マッチするドキュメントの順序を指定するソートオブジェクト。
  • min_score
  • (オプション、float)
    マッチするドキュメントの最小_score_scoreが低いドキュメントはトップドキュメントに含まれません。
  • collapse
  • (オプション、collapse object)
    指定されたキーによってトップドキュメントを単一のトップドキュメントに圧縮します。

Restrictions

リトリーバーツリーに複合リトリーバー(2つ以上の子リトリーバーを持つリトリーバー)が含まれている場合、クエリエレメントのみが許可されます。

Example

Js

  1. const response = await client.search({
  2. index: "restaurants",
  3. retriever: {
  4. standard: {
  5. query: {
  6. bool: {
  7. should: [
  8. {
  9. match: {
  10. region: "Austria",
  11. },
  12. },
  13. ],
  14. filter: [
  15. {
  16. term: {
  17. year: "2019",
  18. },
  19. },
  20. ],
  21. },
  22. },
  23. },
  24. },
  25. });
  26. console.log(response);

Console

  1. GET /restaurants/_search
  2. {
  3. "retriever": {
  4. "standard": {
  5. "query": {
  6. "bool": {
  7. "should": [
  8. {
  9. "match": {
  10. "region": "Austria"
  11. }
  12. }
  13. ],
  14. "filter": [
  15. {
  16. "term": {
  17. "year": "2019"
  18. }
  19. }
  20. ]
  21. }
  22. }
  23. }
  24. }
  25. }
retrieverオブジェクトを開きます。
standardリトリーバーは、伝統的なElasticsearchクエリを定義するために使用されます。
検索クエリを定義するためのエントリポイントです。
boolオブジェクトは、複数のクエリ句を論理的に組み合わせることを可能にします。
should配列は、ドキュメントが一致する条件を示します。これらの条件に一致するドキュメントは、その関連性スコアを増加させます。
matchオブジェクトは、regionフィールドに「オーストリア」という単語が含まれるドキュメントを見つけます。
filter配列は、満たす必要があるが関連性スコアには寄与しないフィルタリング条件を提供します。
termオブジェクトは、yearフィールドでドキュメントをフィルタリングするために使用されます。
yearフィールドで一致させるための正確な値です。

kNN Retriever

kNNリトリーバーは、k-nearest neighbor search (kNN)からトップドキュメントを返します。

Parameters

  • field
  • (必須、文字列)
    検索対象のベクトルフィールドの名前。インデックスが有効なdense_vectorフィールドである必要があります。
  • query_vector
  • (必須、query_vector_builderが定義されていない場合、floatの配列)
    クエリベクトル。検索対象のベクトルフィールドと同じ次元数を持つ必要があります。浮動小数点数の配列または16進エンコードされたバイトベクトルである必要があります。
  • query_vector_builder
  • (必須、query_vectorが定義されていない場合、クエリベクトルビルダーオブジェクト)
    クエリベクトルを構築するためのモデルを定義します。
  • k
  • (必須、整数)
    トップヒットとして返す最近傍の数。この値はnum_candidates以下でなければなりません。
  • num_candidates
  • (必須、整数)
    各シャードごとに考慮する最近傍候補の数。kまたはsizeが省略されている場合はkより大きく、10,000を超えてはいけません。Elasticsearchは各シャードからnum_candidates結果を収集し、それをマージしてトップk結果を見つけます。num_candidatesを増やすと、最終的なk結果の精度が向上する傾向があります。デフォルトはMath.min(1.5 * k, 10_000)です。
  • filter
  • (オプション、query objectまたはquery objectのリスト)
    マッチ可能なドキュメントをフィルタリングするためのクエリ。kNN検索は、このフィルタにも一致するトップkドキュメントを返します。この値は単一のクエリまたはクエリのリストである可能性があります。filterが提供されていない場合、すべてのドキュメントが一致することが許可されます。
  • similarity
  • (オプション、浮動小数点数)
    ドキュメントが一致と見なされるために必要な最小類似度。この類似度値は、使用される生のsimilarityに関連しています。ドキュメントスコアではありません。マッチしたドキュメントは、similarityに従ってスコア付けされ、提供されたboostが適用されます。
    similarityパラメータは、直接的なベクトル類似度計算です。
    • l2_norm: ユークリッド距離としても知られ、ベクトルがdims次元のハイパースフィア内にあり、半径similarityで原点がquery_vectorにある場合、ドキュメントが含まれます。
    • cosinedot_product、およびmax_inner_product: コサイン類似度または内積が提供されたsimilarity以上であるベクトルのみを返します。
      詳細はこちらを参照してください: knn similarity search

Restrictions

  1. ### Example
  2. #### Js
  3. ``````js
  4. const response = await client.search({
  5. index: "restaurants",
  6. retriever: {
  7. knn: {
  8. field: "vector",
  9. query_vector: [10, 22, 77],
  10. k: 10,
  11. num_candidates: 10,
  12. },
  13. },
  14. });
  15. console.log(response);
  16. `

Console

  1. GET /restaurants/_search
  2. {
  3. "retriever": {
  4. "knn": {
  5. "field": "vector",
  6. "query_vector": [10, 22, 77],
  7. "k": 10,
  8. "num_candidates": 10
  9. }
  10. }
  11. }
k-nearest neighbor (knn)検索の設定。ベクトル類似性に基づいています。
ベクトルを含むフィールド名を指定します。
ドキュメントベクトルと比較されるクエリベクトル。
トップヒットとして返す最近傍の数。この値はnum_candidates以下でなければなりません。
最終的なk最近傍が選択される初期候補セットのサイズ。

RRF Retriever

RRFリトリーバーは、RRF式に基づいてトップドキュメントを返し、2つ以上の子リトリーバーに等しい重みを付けます。逆順位融合(RRF)は、異なる関連性指標を持つ複数の結果セットを単一の結果セットに結合する方法です。

Parameters

  • retrievers
  • (必須、リトリーバーオブジェクトの配列)
    RRF式が適用されるトップドキュメントのセットを指定するための子リトリーバーのリスト。各子リトリーバーはRRF式の一部として等しい重みを持ちます。2つ以上の子リトリーバーが必要です。
  • rank_constant
  • (オプション、整数)
    この値は、各クエリの個々の結果セット内のドキュメントが最終的なランク付けされた結果セットに与える影響を決定します。高い値は、低くランク付けされたドキュメントがより多くの影響を持つことを示します。この値は1以上でなければなりません。デフォルトは60です。
  • rank_window_size
  • (オプション、整数)
    この値は、各クエリの個々の結果セットのサイズを決定します。高い値は、パフォーマンスのコストで結果の関連性を向上させます。最終的なランク付けされた結果セットは、検索リクエストのrank_window_sizeに縮小されます。size1以上でなければならず、size以上でなければなりません。デフォルトはsizeパラメータです。
  • filter
  • (オプション、query objectまたはquery objectのリスト)
    指定されたboolean query filterを、各リトリーバーの仕様に従ってすべての指定されたサブリトリーバーに適用します。

Restrictions

RRFリトリーバーは複合リトリーバーです。子リトリーバーは、リトリーバーツリーの一部として制限されている要素を使用することはできません。

RRFを使用して、standardリトリーバーとknnリトリーバーを組み合わせたシンプルなハイブリッド検索の例です。

Js

  1. const response = await client.search({
  2. index: "restaurants",
  3. retriever: {
  4. rrf: {
  5. retrievers: [
  6. {
  7. standard: {
  8. query: {
  9. multi_match: {
  10. query: "Austria",
  11. fields: ["city", "region"],
  12. },
  13. },
  14. },
  15. },
  16. {
  17. knn: {
  18. field: "vector",
  19. query_vector: [10, 22, 77],
  20. k: 10,
  21. num_candidates: 10,
  22. },
  23. },
  24. ],
  25. rank_constant: 1,
  26. rank_window_size: 50,
  27. },
  28. },
  29. });
  30. console.log(response);

Console

  1. GET /restaurants/_search
  2. {
  3. "retriever": {
  4. "rrf": {
  5. "retrievers": [
  6. {
  7. "standard": {
  8. "query": {
  9. "multi_match": {
  10. "query": "Austria",
  11. "fields": [
  12. "city",
  13. "region"
  14. ]
  15. }
  16. }
  17. }
  18. },
  19. {
  20. "knn": {
  21. "field": "vector",
  22. "query_vector": [10, 22, 77],
  23. "k": 10,
  24. "num_candidates": 10
  25. }
  26. }
  27. ],
  28. "rank_constant": 1,
  29. "rank_window_size": 50
  30. }
  31. }
  32. }
RRFリトリーバーを持つリトリーバーツリーを定義します。
サブリトリーバー配列。
最初のサブリトリーバーはstandardリトリーバーです。
2番目のサブリトリーバーはknnリトリーバーです。
RRFリトリーバーのランク定数。
RRFリトリーバーのランクウィンドウサイズ。

Example: Hybrid search with sparse vectors

RRFを使用した、より複雑なハイブリッド検索の例(レキシカル検索 + ELSERスパースベクトル検索 + 密なベクトル検索)です。

Js

  1. const response = await client.search({
  2. index: "movies",
  3. retriever: {
  4. rrf: {
  5. retrievers: [
  6. {
  7. standard: {
  8. query: {
  9. sparse_vector: {
  10. field: "plot_embedding",
  11. inference_id: "my-elser-model",
  12. query: "films that explore psychological depths",
  13. },
  14. },
  15. },
  16. },
  17. {
  18. standard: {
  19. query: {
  20. multi_match: {
  21. query: "crime",
  22. fields: ["plot", "title"],
  23. },
  24. },
  25. },
  26. },
  27. {
  28. knn: {
  29. field: "vector",
  30. query_vector: [10, 22, 77],
  31. k: 10,
  32. num_candidates: 10,
  33. },
  34. },
  35. ],
  36. },
  37. },
  38. });
  39. console.log(response);

Console

  1. GET movies/_search
  2. {
  3. "retriever": {
  4. "rrf": {
  5. "retrievers": [
  6. {
  7. "standard": {
  8. "query": {
  9. "sparse_vector": {
  10. "field": "plot_embedding",
  11. "inference_id": "my-elser-model",
  12. "query": "films that explore psychological depths"
  13. }
  14. }
  15. }
  16. },
  17. {
  18. "standard": {
  19. "query": {
  20. "multi_match": {
  21. "query": "crime",
  22. "fields": [
  23. "plot",
  24. "title"
  25. ]
  26. }
  27. }
  28. }
  29. },
  30. {
  31. "knn": {
  32. "field": "vector",
  33. "query_vector": [10, 22, 77],
  34. "k": 10,
  35. "num_candidates": 10
  36. }
  37. }
  38. ]
  39. }
  40. }
  41. }
  42. ``````@
  43. ## Text Similarity Re-ranker Retriever
  44. `````text_similarity_reranker`````リトリーバーは、NLPモデルを使用して、クエリに対する意味的類似性に基づいてトップkドキュメントの順序を改善します。
  45. 意味的再ランク付けの高レベルの概要については、[*Semantic re-ranking*](/read/elasticsearch-8-15/5b24498df8041ee4.md)を参照してください。
  46. ### Prerequisites
  47. `````text_similarity_reranker`````を使用するには、まず[Create inference API](/read/elasticsearch-8-15/6b7f8edc0ca95c25.md)を使用して`````rerank`````タスクを設定する必要があります。`````rerank`````タスクは、テキスト類似性を計算できる機械学習モデルで設定する必要があります。Elasticsearchがサポートするサードパーティのテキスト類似性モデルのリストについては、[the Elastic NLP model reference](https://www.elastic.co/guide/en/machine-learning/8.15/ml-nlp-model-ref.html#ml-nlp-model-ref-text-similarity)を参照してください。
  48. 現在、次のことができます:
  49. - [Cohere Rerank inference endpoint](/read/elasticsearch-8-15/16f8f12bf6f9fc29.md)を使用して、`````rerank`````タスクタイプで直接統合する
  50. - [Google Vertex AI inference endpoint](/read/elasticsearch-8-15/12b633eff695789b.md)を使用して、`````rerank`````タスクタイプで直接統合する
  51. - [Eland](https://www.elastic.co/guide/en/elasticsearch/client/eland/current/machine-learning.html#ml-nlp-pytorch)を使用して、`````text_similarity````` NLPタスクタイプでElasticsearchにモデルをアップロードします。
  52. - 次に、`````rerank`````タスクタイプで[Elasticsearch service inference endpoint](157148fb0d88422f.md#inference-example-eland)を設定します
  53. - このページの[例](6b055ad066da78f8.md#text-similarity-reranker-retriever-example-eland)を参照して、ステップバイステップのガイドを確認してください。
  54. ### Parameters
  55. - `````retriever`````
  56. - (必須、[retriever](/read/elasticsearch-8-15/6b055ad066da78f8.md))
  57. 再ランク付けされるトップドキュメントの初期セットを生成する子リトリーバー。
  58. - `````field`````
  59. - (必須、`````string`````)
  60. テキスト類似性比較に使用されるドキュメントフィールド。このフィールドには、`````inferenceText`````に対して評価されるテキストが含まれている必要があります。
  61. - `````inference_id`````
  62. - (必須、`````string`````)
  63. 推論APIを使用して作成された推論エンドポイントの一意の識別子。
  64. - `````inference_text`````
  65. - (必須、`````string`````)
  66. 類似性比較の基準となるテキストスニペット。
  67. - `````rank_window_size`````
  68. - (オプション、`````int`````)
  69. 再ランク付けプロセスで考慮するトップドキュメントの数。デフォルトは`````10`````です。
  70. - `````min_score`````
  71. - (オプション、`````float`````)
  72. 再ランク付けされた結果にドキュメントを含めるための最小スコア閾値を設定します。この閾値未満の類似性スコアを持つドキュメントは除外されます。スコア計算は使用されるモデルによって異なることに注意してください。
  73. - `````filter`````
  74. - (オプション、[query objectまたはquery objectのリスト](/read/elasticsearch-8-15/adeacfff22b20f2c.md))
  75. 子[retriever](/read/elasticsearch-8-15/6b055ad066da78f8.md)に指定された[boolean query filter](/read/elasticsearch-8-15/199b26891e5aa36d.md)を適用します。子リトリーバーがすでにフィルターを指定している場合、このトップレベルのフィルターは子リトリーバーで定義されたフィルターと組み合わせて適用されます。
  76. ### Restrictions
  77. テキスト類似性再ランク付けリトリーバーは複合リトリーバーです。子リトリーバーは、リトリーバーツリーの一部として制限されている要素を使用することはできません。
  78. ### Example: Cohere Rerank
  79. この例では、Cohere Rerank APIを使用してトップドキュメントを再ランク付けすることで、すぐに使える意味的検索を有効にします。このアプローチでは、すべてのインデックスされたドキュメントの埋め込みを生成して保存する必要がなくなります。これは、`````rerank`````タスクタイプを使用した[Cohere Rerank inference endpoint](/read/elasticsearch-8-15/16f8f12bf6f9fc29.md)を必要とします。
  80. #### Js
  81. ``````js
  82. const response = await client.search({
  83. index: "index",
  84. retriever: {
  85. text_similarity_reranker: {
  86. retriever: {
  87. standard: {
  88. query: {
  89. match_phrase: {
  90. text: "landmark in Paris",
  91. },
  92. },
  93. },
  94. },
  95. field: "text",
  96. inference_id: "my-cohere-rerank-model",
  97. inference_text: "Most famous landmark in Paris",
  98. rank_window_size: 100,
  99. min_score: 0.5,
  100. },
  101. },
  102. });
  103. console.log(response);

Console

  1. GET /index/_search
  2. {
  3. "retriever": {
  4. "text_similarity_reranker": {
  5. "retriever": {
  6. "standard": {
  7. "query": {
  8. "match_phrase": {
  9. "text": "landmark in Paris"
  10. }
  11. }
  12. }
  13. },
  14. "field": "text",
  15. "inference_id": "my-cohere-rerank-model",
  16. "inference_text": "Most famous landmark in Paris",
  17. "rank_window_size": 100,
  18. "min_score": 0.5
  19. }
  20. }
  21. }
  22. ``````@
  23. ### Example: Semantic re-ranking with a Hugging Face model
  24. 以下の例では、Hugging Face`````cross-encoder/ms-marco-MiniLM-L-6-v2`````モデルを使用して、意味的類似性に基づいて検索結果を再ランク付けします。このモデルは、[Eland](https://www.elastic.co/guide/en/elasticsearch/client/eland/current/machine-learning.html#ml-nlp-pytorch)を使用してElasticsearchにアップロードする必要があります。
  25. Elasticsearchがサポートするサードパーティのテキスト類似性モデルのリストについては、[the Elastic NLP model reference](https://www.elastic.co/guide/en/machine-learning/8.15/ml-nlp-model-ref.html#ml-nlp-model-ref-text-similarity)を参照してください。
  26. モデルをロードして意味的再ランク付けを作成するには、次の手順に従います。
  27. - 1*.* `````pip`````を使用してElandをインストールします。
  28. ``````sh
  29. python -m pip install eland[pytorch]
  • 2. Elandを使用してモデルをElasticsearchにアップロードします。この例では、Elastic CloudデプロイメントとAPIキーがあると仮定しています。詳細な認証オプションについては、Eland documentationを参照してください。
    1. eland_import_hub_model \
    2. --cloud-id $CLOUD_ID \
    3. --es-api-key $ES_API_KEY \
    4. --hub-model-id cross-encoder/ms-marco-MiniLM-L-6-v2 \
    5. --task-type text_similarity \
    6. --clear-previous \
    7. --start
  • 3. rerankタスクのための推論エンドポイントを作成します。

Js

  1. const response = await client.inference.put({
  2. task_type: "rerank",
  3. inference_id: "my-msmarco-minilm-model",
  4. inference_config: {
  5. service: "elasticsearch",
  6. service_settings: {
  7. num_allocations: 1,
  8. num_threads: 1,
  9. model_id: "cross-encoder__ms-marco-minilm-l-6-v2",
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. PUT _inference/rerank/my-msmarco-minilm-model
  2. {
  3. "service": "elasticsearch",
  4. "service_settings": {
  5. "num_allocations": 1,
  6. "num_threads": 1,
  7. "model_id": "cross-encoder__ms-marco-minilm-l-6-v2"
  8. }
  9. }
  • 4. text_similarity_rerankリトリーバーを定義します。

Js

  1. const response = await client.search({
  2. index: "movies",
  3. retriever: {
  4. text_similarity_reranker: {
  5. retriever: {
  6. standard: {
  7. query: {
  8. match: {
  9. genre: "drama",
  10. },
  11. },
  12. },
  13. },
  14. field: "plot",
  15. inference_id: "my-msmarco-minilm-model",
  16. inference_text: "films that explore psychological depths",
  17. },
  18. },
  19. });
  20. console.log(response);

Console

  1. POST movies/_search
  2. {
  3. "retriever": {
  4. "text_similarity_reranker": {
  5. "retriever": {
  6. "standard": {
  7. "query": {
  8. "match": {
  9. "genre": "drama"
  10. }
  11. }
  12. }
  13. },
  14. "field": "plot",
  15. "inference_id": "my-msmarco-minilm-model",
  16. "inference_text": "films that explore psychological depths"
  17. }
  18. }
  19. }

このリトリーバーは、標準のmatchクエリを使用して、ジャンル「ドラマ」でタグ付けされた映画のmovieインデックスを検索します。その後、Elasticsearchにアップロードしたモデルを使用して、inference_textパラメータ内のテキストに対する意味的類似性に基づいて結果を再ランク付けします。

Using from and size with a retriever tree

fromおよびsizeパラメータは、一般的なsearch APIの一部としてグローバルに提供されます。特定のリトリーバーがsizeパラメータをrank_window_sizeなどの異なるパラメータを使用してオーバーライドしない限り、リトリーバーツリー内のすべてのリトリーバーに適用されます。ただし、最終的な検索ヒットは常にsizeに制限されます。

Using aggregations with a retriever tree

Aggregationsは、検索リクエストの一部としてグローバルに指定されます。集計に使用されるクエリは、boolean queryの[should句]としてすべてのリーフリトリーバーの組み合わせです。

Restrictions on search parameters when specifying a retriever

リトリーバーが検索の一部として指定されるとき、次の要素はトップレベルでは許可されず、特定のリトリーバーの要素としてのみ許可されます: