Retriever
この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。GAの前に構文が変更される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。
リトリーバーは、検索から返されるトップドキュメントを記述するための仕様です。リトリーバーは、search APIの他の要素を置き換え、query
やknn
などのトップドキュメントを返します。リトリーバーは子リトリーバーを持つことができ、2つ以上の子を持つリトリーバーは複合リトリーバーと見なされます。これにより、検索中に発生する操作の順序を明確にするために、リトリーバーツリーと呼ばれる木構造で複雑な動作を描写できます。
リトリーバーの抽象化の高レベルの概要については、Retrieversを参照してください。
以下のリトリーバーが利用可能です:
standard
- 伝統的なqueryの機能を置き換えるリトリーバー。
knn
- knn searchの機能を置き換えるリトリーバー。
rrf
- reciprocal rank fusion (RRF)からトップドキュメントを生成するリトリーバー。
text_similarity_reranker
- 指定された推論テキストに対する意味的類似性に基づいてドキュメントを再ランク付けすることにより、検索結果を強化するリトリーバー。
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
const response = await client.search({
index: "restaurants",
retriever: {
standard: {
query: {
bool: {
should: [
{
match: {
region: "Austria",
},
},
],
filter: [
{
term: {
year: "2019",
},
},
],
},
},
},
},
});
console.log(response);
Console
GET /restaurants/_search
{
"retriever": {
"standard": {
"query": {
"bool": {
"should": [
{
"match": {
"region": "Austria"
}
}
],
"filter": [
{
"term": {
"year": "2019"
}
}
]
}
}
}
}
}
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
にある場合、ドキュメントが含まれます。cosine
、dot_product
、およびmax_inner_product
: コサイン類似度または内積が提供されたsimilarity
以上であるベクトルのみを返します。
詳細はこちらを参照してください: knn similarity search
Restrictions
### Example
#### Js
``````js
const response = await client.search({
index: "restaurants",
retriever: {
knn: {
field: "vector",
query_vector: [10, 22, 77],
k: 10,
num_candidates: 10,
},
},
});
console.log(response);
`
Console
GET /restaurants/_search
{
"retriever": {
"knn": {
"field": "vector",
"query_vector": [10, 22, 77],
"k": 10,
"num_candidates": 10
}
}
}
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
に縮小されます。size
は1
以上でなければならず、size
以上でなければなりません。デフォルトはsize
パラメータです。 filter
- (オプション、query objectまたはquery objectのリスト)
指定されたboolean query filterを、各リトリーバーの仕様に従ってすべての指定されたサブリトリーバーに適用します。
Restrictions
RRFリトリーバーは複合リトリーバーです。子リトリーバーは、リトリーバーツリーの一部として制限されている要素を使用することはできません。
Example: Hybrid search
RRFを使用して、standard
リトリーバーとknn
リトリーバーを組み合わせたシンプルなハイブリッド検索の例です。
Js
const response = await client.search({
index: "restaurants",
retriever: {
rrf: {
retrievers: [
{
standard: {
query: {
multi_match: {
query: "Austria",
fields: ["city", "region"],
},
},
},
},
{
knn: {
field: "vector",
query_vector: [10, 22, 77],
k: 10,
num_candidates: 10,
},
},
],
rank_constant: 1,
rank_window_size: 50,
},
},
});
console.log(response);
Console
GET /restaurants/_search
{
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": {
"multi_match": {
"query": "Austria",
"fields": [
"city",
"region"
]
}
}
}
},
{
"knn": {
"field": "vector",
"query_vector": [10, 22, 77],
"k": 10,
"num_candidates": 10
}
}
],
"rank_constant": 1,
"rank_window_size": 50
}
}
}
RRFリトリーバーを持つリトリーバーツリーを定義します。 | |
サブリトリーバー配列。 | |
最初のサブリトリーバーはstandard リトリーバーです。 |
|
2番目のサブリトリーバーはknn リトリーバーです。 |
|
RRFリトリーバーのランク定数。 | |
RRFリトリーバーのランクウィンドウサイズ。 |
Example: Hybrid search with sparse vectors
RRFを使用した、より複雑なハイブリッド検索の例(レキシカル検索 + ELSERスパースベクトル検索 + 密なベクトル検索)です。
Js
const response = await client.search({
index: "movies",
retriever: {
rrf: {
retrievers: [
{
standard: {
query: {
sparse_vector: {
field: "plot_embedding",
inference_id: "my-elser-model",
query: "films that explore psychological depths",
},
},
},
},
{
standard: {
query: {
multi_match: {
query: "crime",
fields: ["plot", "title"],
},
},
},
},
{
knn: {
field: "vector",
query_vector: [10, 22, 77],
k: 10,
num_candidates: 10,
},
},
],
},
},
});
console.log(response);
Console
GET movies/_search
{
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": {
"sparse_vector": {
"field": "plot_embedding",
"inference_id": "my-elser-model",
"query": "films that explore psychological depths"
}
}
}
},
{
"standard": {
"query": {
"multi_match": {
"query": "crime",
"fields": [
"plot",
"title"
]
}
}
}
},
{
"knn": {
"field": "vector",
"query_vector": [10, 22, 77],
"k": 10,
"num_candidates": 10
}
}
]
}
}
}
``````@
## Text Similarity Re-ranker Retriever
`````text_similarity_reranker`````リトリーバーは、NLPモデルを使用して、クエリに対する意味的類似性に基づいてトップkドキュメントの順序を改善します。
意味的再ランク付けの高レベルの概要については、[*Semantic re-ranking*](/read/elasticsearch-8-15/5b24498df8041ee4.md)を参照してください。
### Prerequisites
`````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)を参照してください。
現在、次のことができます:
- [Cohere Rerank inference endpoint](/read/elasticsearch-8-15/16f8f12bf6f9fc29.md)を使用して、`````rerank`````タスクタイプで直接統合する
- [Google Vertex AI inference endpoint](/read/elasticsearch-8-15/12b633eff695789b.md)を使用して、`````rerank`````タスクタイプで直接統合する
- [Eland](https://www.elastic.co/guide/en/elasticsearch/client/eland/current/machine-learning.html#ml-nlp-pytorch)を使用して、`````text_similarity````` NLPタスクタイプでElasticsearchにモデルをアップロードします。
- 次に、`````rerank`````タスクタイプで[Elasticsearch service inference endpoint](157148fb0d88422f.md#inference-example-eland)を設定します
- このページの[例](6b055ad066da78f8.md#text-similarity-reranker-retriever-example-eland)を参照して、ステップバイステップのガイドを確認してください。
### Parameters
- `````retriever`````
- (必須、[retriever](/read/elasticsearch-8-15/6b055ad066da78f8.md))
再ランク付けされるトップドキュメントの初期セットを生成する子リトリーバー。
- `````field`````
- (必須、`````string`````)
テキスト類似性比較に使用されるドキュメントフィールド。このフィールドには、`````inferenceText`````に対して評価されるテキストが含まれている必要があります。
- `````inference_id`````
- (必須、`````string`````)
推論APIを使用して作成された推論エンドポイントの一意の識別子。
- `````inference_text`````
- (必須、`````string`````)
類似性比較の基準となるテキストスニペット。
- `````rank_window_size`````
- (オプション、`````int`````)
再ランク付けプロセスで考慮するトップドキュメントの数。デフォルトは`````10`````です。
- `````min_score`````
- (オプション、`````float`````)
再ランク付けされた結果にドキュメントを含めるための最小スコア閾値を設定します。この閾値未満の類似性スコアを持つドキュメントは除外されます。スコア計算は使用されるモデルによって異なることに注意してください。
- `````filter`````
- (オプション、[query objectまたはquery objectのリスト](/read/elasticsearch-8-15/adeacfff22b20f2c.md))
子[retriever](/read/elasticsearch-8-15/6b055ad066da78f8.md)に指定された[boolean query filter](/read/elasticsearch-8-15/199b26891e5aa36d.md)を適用します。子リトリーバーがすでにフィルターを指定している場合、このトップレベルのフィルターは子リトリーバーで定義されたフィルターと組み合わせて適用されます。
### Restrictions
テキスト類似性再ランク付けリトリーバーは複合リトリーバーです。子リトリーバーは、リトリーバーツリーの一部として制限されている要素を使用することはできません。
### Example: Cohere Rerank
この例では、Cohere Rerank APIを使用してトップドキュメントを再ランク付けすることで、すぐに使える意味的検索を有効にします。このアプローチでは、すべてのインデックスされたドキュメントの埋め込みを生成して保存する必要がなくなります。これは、`````rerank`````タスクタイプを使用した[Cohere Rerank inference endpoint](/read/elasticsearch-8-15/16f8f12bf6f9fc29.md)を必要とします。
#### Js
``````js
const response = await client.search({
index: "index",
retriever: {
text_similarity_reranker: {
retriever: {
standard: {
query: {
match_phrase: {
text: "landmark in Paris",
},
},
},
},
field: "text",
inference_id: "my-cohere-rerank-model",
inference_text: "Most famous landmark in Paris",
rank_window_size: 100,
min_score: 0.5,
},
},
});
console.log(response);
Console
GET /index/_search
{
"retriever": {
"text_similarity_reranker": {
"retriever": {
"standard": {
"query": {
"match_phrase": {
"text": "landmark in Paris"
}
}
}
},
"field": "text",
"inference_id": "my-cohere-rerank-model",
"inference_text": "Most famous landmark in Paris",
"rank_window_size": 100,
"min_score": 0.5
}
}
}
``````@
### Example: Semantic re-ranking with a Hugging Face model
以下の例では、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にアップロードする必要があります。
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)を参照してください。
モデルをロードして意味的再ランク付けを作成するには、次の手順に従います。
- 1*.* `````pip`````を使用してElandをインストールします。
``````sh
python -m pip install eland[pytorch]
- 2. Elandを使用してモデルをElasticsearchにアップロードします。この例では、Elastic CloudデプロイメントとAPIキーがあると仮定しています。詳細な認証オプションについては、Eland documentationを参照してください。
eland_import_hub_model \
--cloud-id $CLOUD_ID \
--es-api-key $ES_API_KEY \
--hub-model-id cross-encoder/ms-marco-MiniLM-L-6-v2 \
--task-type text_similarity \
--clear-previous \
--start
- 3.
rerank
タスクのための推論エンドポイントを作成します。
Js
const response = await client.inference.put({
task_type: "rerank",
inference_id: "my-msmarco-minilm-model",
inference_config: {
service: "elasticsearch",
service_settings: {
num_allocations: 1,
num_threads: 1,
model_id: "cross-encoder__ms-marco-minilm-l-6-v2",
},
},
});
console.log(response);
Console
PUT _inference/rerank/my-msmarco-minilm-model
{
"service": "elasticsearch",
"service_settings": {
"num_allocations": 1,
"num_threads": 1,
"model_id": "cross-encoder__ms-marco-minilm-l-6-v2"
}
}
- 4.
text_similarity_rerank
リトリーバーを定義します。
Js
const response = await client.search({
index: "movies",
retriever: {
text_similarity_reranker: {
retriever: {
standard: {
query: {
match: {
genre: "drama",
},
},
},
},
field: "plot",
inference_id: "my-msmarco-minilm-model",
inference_text: "films that explore psychological depths",
},
},
});
console.log(response);
Console
POST movies/_search
{
"retriever": {
"text_similarity_reranker": {
"retriever": {
"standard": {
"query": {
"match": {
"genre": "drama"
}
}
}
},
"field": "plot",
"inference_id": "my-msmarco-minilm-model",
"inference_text": "films that explore psychological depths"
}
}
}
このリトリーバーは、標準の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
リトリーバーが検索の一部として指定されるとき、次の要素はトップレベルでは許可されず、特定のリトリーバーの要素としてのみ許可されます: