検索アプリケーションの検索APIとテンプレート
あなたの検索アプリケーションは、検索テンプレートを使用して検索を実行します。テンプレートは、テンプレートパラメータのみを公開することで複雑さを軽減し、ElasticsearchのクエリDSLの全機能を使用してクエリを構築します。テンプレートは、検索アプリケーションを作成または更新する際に設定でき、カスタマイズ可能です。このテンプレートは、Put Search Application API APIコールを使用して、いつでも編集または更新できます。
要するに、特定のハードコーディングされた検索値の代わりにパラメータを使用して検索テンプレートを作成します。検索時には、これらのパラメータの実際の値を渡すことで、クエリ全体の構造を書き換えることなくカスタマイズされた検索を可能にします。検索アプリケーションテンプレート:
- クエリリクエストを簡素化
- リクエストサイズを削減
- クエリが事前定義されており、恣意的に変更できないため、セキュリティとパフォーマンスを確保
この文書は、追加のユースケースで検索アプリケーションを使用するための情報とサンプルテンプレートを提供します。これらのテンプレートは、ニーズに合わせて簡単に変更できるように設計されています。テンプレートを使用して検索アプリケーションを作成したら、このテンプレートを使用して検索アプリケーションを検索できます。
検索テンプレートは、Mustacheテンプレート言語を使用します。Mustache変数は通常、次のように二重波括弧で囲まれます: {{my-var}}
.
検索テンプレートについての詳細を学びましょう。
デフォルトテンプレートの例
検索アプリケーションにテンプレートが保存されていない場合、最小限のデフォルト検索テンプレートが検索時に適用されます。デフォルトテンプレートは、シンプルな検索ユースケースを実装します。
デフォルトテンプレートで検索アプリケーションを作成するには、テンプレートを指定せずに検索アプリケーションの作成または更新リクエストを発行します:
Python
resp = client.search_application.put(
name="my_search_application",
search_application={
"indices": [
"index1",
"index2"
]
},
)
print(resp)
Js
const response = await client.searchApplication.put({
name: "my_search_application",
search_application: {
indices: ["index1", "index2"],
},
});
console.log(response);
コンソール
PUT _application/search_application/my_search_application
{
"indices": ["index1", "index2"]
}
次に、get search application APIコールを使用して、新しく作成した検索アプリケーションを表示できます。これには、あなたのために作成されたデフォルトテンプレートも含まれます:
Python
resp = client.search_application.get(
name="my_search_application",
)
print(resp)
Js
const response = await client.searchApplication.get({
name: "my_search_application",
});
console.log(response);
コンソール
GET _application/search_application/my_search_application
コンソール-結果
{
"name": "my_search_application",
"indices": [
"index1",
"index2"
],
"updated_at_millis": 1715802354482,
"template": {
"script": {
"source": """{
"query": {
"query_string": {
"query": "{{query_string}}",
"default_field": "{{default_field}}"
}
}
}
""",
"lang": "mustache",
"params": {
"default_field": "*",
"query_string": "*"
}
}
}
}
コンソール-結果
{
"template": {
"script": {
"source": {
"query": {
"query_string": {
"query": "{{query_string}}",
"default_field": "{{default_field}}"
}
}
},
"params": {
"query_string": "*",
"default_field": "*"
}
}
}
}
これは、検索テンプレートの初期探索に役立つかもしれませんが、更新したいと思うでしょう。
このテンプレートは、from
、size
、またはboost
を含む追加のパラメータをサポートしていません。これらを使用する必要がある場合は、検索アプリケーションに関連付けられたテンプレートをカスタマイズして、パラメータとして含めることができます。
テンプレートを表示することで、パラメータとそのデフォルト値を確認できますが、さまざまなパラメータで検索アプリケーションを検索した場合に生成されるクエリを表示することも価値があります。
render search application queryを使用して、このテンプレートが生成するクエリを表示できます。デフォルトパラメータを含む場合もあります。たとえば、パラメータなしで検索アプリケーションを検索すると:
Python
resp = client.search_application.render_query(
name="my_search_application",
body=None,
)
print(resp)
Js
const response = await client.searchApplication.renderQuery({
name: "my_search_application",
body: null,
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_render_query
コンソール-結果
{
"query": {
"query_string": {
"query": "*",
"default_field": "*",
"fields": []
}
}
}
これは、テンプレートで定義されたデフォルトパラメータを使用しています。レンダリングコールに1つ以上のパラメータを指定することもできます。たとえば:
Python
resp = client.search_application.render_query(
name="my_search_application",
body={
"params": {
"query_string": "rock climbing"
}
},
)
print(resp)
Js
const response = await client.searchApplication.renderQuery({
name: "my_search_application",
body: {
params: {
query_string: "rock climbing",
},
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_render_query
{
"params": {
"query_string": "rock climbing"
}
}
コンソール-結果
{
"query": {
"query_string": {
"query": "rock climbing",
"default_field": "*",
"fields": []
}
}
}
この場合、{{query_string}}
パラメータはrock climbing
の値に置き換えられ、{{default_field}}
パラメータは指定されていないため、*
のデフォルト値が使用されます。
実際にパラメータなしで検索を実行すると、レンダリングコールが返した基礎となるクエリが実行されます。この場合、パラメータなしの検索はすべての結果を返し、/_search
へのパラメータなしの呼び出しと同様の方法で行われます。
Python
resp = client.search_application.search(
name="my_search_application",
)
print(resp)
Js
const response = await client.searchApplication.search({
name: "my_search_application",
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
デフォルトテンプレートは、今後の検索アプリケーション機能のバージョンで変更される可能性があります。
この文書の他の例を試して、特定のユースケースを実験するか、自分自身のものを作成してみてください!
## 検索アプリケーションの検索
### テンプレート検索
検索アプリケーションと対話する最も簡単な方法は、それに関連付けられた検索テンプレートを使用することです。各検索アプリケーションには、検索基準、パラメータ、およびデフォルトを定義する単一のテンプレートが関連付けられています。
[Search Application Search API](/read/elasticsearch-8-15/e5fa8e999386c615.md)を使用して、検索アプリケーションに検索リクエストを送信します。
デフォルトテンプレートを使用すると、検索は次のようになります:
#### Python
``````python
resp = client.search_application.search(
name="my_search_application",
params={
"query_string": "kayaking"
},
)
print(resp)
`
Js
const response = await client.searchApplication.search({
name: "my_search_application",
params: {
query_string: "kayaking",
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
{
"params": {
"query_string": "kayaking"
}
}
この例では、query_string
パラメータのデフォルト値*
をオーバーライドしました。default_field
を指定しなかったため、このパラメータの値は*
のままです。
エイリアス検索
検索アプリケーションの検索テンプレートを設定したくない場合、検索アプリケーションと同じ名前のエイリアスが作成されます。これは、検索アプリケーションの検索テンプレートを構築する際に使用したい特定の検索クエリを実験する際に役立ちます。
検索アプリケーションの名前がmy_search_application
の場合、エイリアスはmy_search_application
になります。これをsearch APIを使用して検索できます。
クロスクラスタ検索
検索アプリケーションは現在、クロスクラスタ検索をサポートしていません。リモートクラスタのインデックスやインデックスパターンをインデックスエイリアスに追加することはできません。
検索アプリケーションを更新するには、Search Applications管理APIを使用し、エイリアスAPIなどのElasticsearch APIを直接使用しないでください。たとえば、indices
パラメータを使用してPUT Search Applicationを使用します。これにより、関連付けられたエイリアスが自動的に最新の状態に保たれ、インデックスが検索アプリケーションに正しく追加されることが保証されます。
検索テンプレートの例
特定のユースケースを探求するために、いくつかの例を作成しました。これらを自分の検索テンプレートを作成するための出発点として使用してください。
テキスト検索の例
次のテンプレートは、指定されたフィールドに対するmulti_match
検索とブーストをサポートします:
Python
resp = client.search_application.put(
name="my_search_application",
search_application={
"indices": [
"index1",
"index2"
],
"template": {
"script": {
"lang": "mustache",
"source": "\n {\n \"query\": {\n \"multi_match\": {\n \"query\": \"{{query_string}}\",\n \"fields\": [{{#text_fields}}\"{{name}}^{{boost}}\",{{/text_fields}}]\n }\n },\n \"explain\": \"{{explain}}\",\n \"from\": \"{{from}}\",\n \"size\": \"{{size}}\"\n }\n ",
"params": {
"query_string": "*",
"text_fields": [
{
"name": "title",
"boost": 10
},
{
"name": "description",
"boost": 5
}
],
"explain": False,
"from": 0,
"size": 10
}
}
}
},
)
print(resp)
Js
const response = await client.searchApplication.put({
name: "my_search_application",
search_application: {
indices: ["index1", "index2"],
template: {
script: {
lang: "mustache",
source:
'\n {\n "query": {\n "multi_match": {\n "query": "{{query_string}}",\n "fields": [{{#text_fields}}"{{name}}^{{boost}}",{{/text_fields}}]\n }\n },\n "explain": "{{explain}}",\n "from": "{{from}}",\n "size": "{{size}}"\n }\n ',
params: {
query_string: "*",
text_fields: [
{
name: "title",
boost: 10,
},
{
name: "description",
boost: 5,
},
],
explain: false,
from: 0,
size: 10,
},
},
},
},
});
console.log(response);
コンソール
PUT _application/search_application/my_search_application
{
"indices": ["index1", "index2"],
"template": {
"script": {
"lang": "mustache",
"source": """
{
"query": {
"multi_match": {
"query": "{{query_string}}",
"fields": [{{#text_fields}}"{{name}}^{{boost}}",{{/text_fields}}]
}
},
"explain": "{{explain}}",
"from": "{{from}}",
"size": "{{size}}"
}
""",
"params": {
"query_string": "*",
"text_fields": [
{"name": "title", "boost": 10},
{"name": "description", "boost": 5}
],
"explain": false,
"from": 0,
"size": 10
}
}
}
}
このテンプレートを使用した検索クエリは次のようになります:
Python
resp = client.search_application.search(
name="my_search_application",
params={
"size": 5,
"query_string": "mountain climbing",
"text_fields": [
{
"name": "title",
"boost": 10
},
{
"name": "description",
"boost": 2
},
{
"name": "state",
"boost": 1
}
]
},
)
print(resp)
Js
const response = await client.searchApplication.search({
name: "my_search_application",
params: {
size: 5,
query_string: "mountain climbing",
text_fields: [
{
name: "title",
boost: 10,
},
{
name: "description",
boost: 2,
},
{
name: "state",
boost: 1,
},
],
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
{
"params": {
"size": 5,
"query_string": "mountain climbing",
"text_fields": [
{"name": "title", "boost": 10},
{"name": "description", "boost": 2},
{"name": "state", "boost": 1}
]
}
}
### テキスト検索 + ELSERとRRF
この例は、BM25と[ELSER](https://www.elastic.co/guide/en/machine-learning/8.15/ml-nlp-elser.html)検索を組み合わせるための[逆順位融合 (RRF)](/read/elasticsearch-8-15/6f3c8b9c492b896d.md)メソッドをサポートします。逆順位融合は、異なる検索アルゴリズムの組み合わせ結果を一貫して改善します。他のすべてのランキングアルゴリズムを上回り、しばしば最良の個別結果を超え、キャリブレーションなしで実現します。
#### Python
``````python
resp = client.search_application.put(
name="my-search-app",
search_application={
"indices": [
"index1"
],
"template": {
"script": {
"lang": "mustache",
"source": "\n {\n \"retriever\": {\n \"rrf\": {\n \"retrievers\": [\n {{#text_fields}}\n {\n \"standard\": {\n \"query\": {\n \"match\": {\n \"{{.}}\": \"{{query_string}}\"\n }\n }\n }\n },\n {{/text_fields}}\n {{#elser_fields}}\n {\n \"standard\": {\n \"query\": {\n \"sparse_vector\": {\n \"field\": \"ml.inference.{{.}}_expanded.predicted_value\",\n \"inference_id\": \"<elser_inference_id>\",\n \"query\": \"{{query_string}}\"\n }\n }\n }\n },\n {{/elser_fields}}\n ],\n \"rank_window_size\": {{rrf.rank_window_size}},\n \"rank_constant\": {{rrf.rank_constant}}\n }\n }\n }\n ",
"params": {
"elser_fields": [
"title",
"meta_description"
],
"text_fields": [
"title",
"meta_description"
],
"query_string": "",
"rrf": {
"rank_window_size": 100,
"rank_constant": 60
}
}
}
}
},
)
print(resp)
`
Js
const response = await client.searchApplication.put({
name: "my-search-app",
search_application: {
indices: ["index1"],
template: {
script: {
lang: "mustache",
source:
'\n {\n "retriever": {\n "rrf": {\n "retrievers": [\n {{#text_fields}}\n {\n "standard": {\n "query": {\n "match": {\n "{{.}}": "{{query_string}}"\n }\n }\n }\n },\n {{/text_fields}}\n {{#elser_fields}}\n {\n "standard": {\n "query": {\n "sparse_vector": {\n "field": "ml.inference.{{.}}_expanded.predicted_value",\n "inference_id": "<elser_inference_id>",\n "query": "{{query_string}}"\n }\n }\n }\n },\n {{/elser_fields}}\n ],\n "rank_window_size": {{rrf.rank_window_size}},\n "rank_constant": {{rrf.rank_constant}}\n }\n }\n }\n ',
params: {
elser_fields: ["title", "meta_description"],
text_fields: ["title", "meta_description"],
query_string: "",
rrf: {
rank_window_size: 100,
rank_constant: 60,
},
},
},
},
},
});
console.log(response);
コンソール
PUT _application/search_application/my-search-app
{
"indices": [
"index1"
],
"template": {
"script": {
"lang": "mustache",
"source": """
{
"retriever": {
"rrf": {
"retrievers": [
{{#text_fields}}
{
"standard": {
"query": {
"match": {
"{{.}}": "{{query_string}}"
}
}
}
},
{{/text_fields}}
{{#elser_fields}}
{
"standard": {
"query": {
"sparse_vector": {
"field": "ml.inference.{{.}}_expanded.predicted_value",
"inference_id": "<elser_inference_id>",
"query": "{{query_string}}"
}
}
}
},
{{/elser_fields}}
],
"rank_window_size": {{rrf.rank_window_size}},
"rank_constant": {{rrf.rank_constant}}
}
}
}
""",
"params": {
"elser_fields": ["title", "meta_description"],
"text_fields": ["title", "meta_description"],
"query_string": "",
"rrf": {
"rank_window_size": 100,
"rank_constant": 60
}
}
}
}
}
このテンプレートのサンプルクエリは次のようになります:
#### Python
``````python
resp = client.search_application.search(
name="my-search-app",
params={
"query_string": "What is the most popular brand of coffee sold in the United States?",
"elser_fields": [
"title",
"meta_description"
],
"text_fields": [
"title",
"meta_description"
],
"rrf": {
"rank_window_size": 50,
"rank_constant": 25
}
},
)
print(resp)
`
Js
const response = await client.searchApplication.search({
name: "my-search-app",
params: {
query_string:
"What is the most popular brand of coffee sold in the United States?",
elser_fields: ["title", "meta_description"],
text_fields: ["title", "meta_description"],
rrf: {
rank_window_size: 50,
rank_constant: 25,
},
},
});
console.log(response);
コンソール
POST _application/search_application/my-search-app/_search
{
"params": {
"query_string": "What is the most popular brand of coffee sold in the United States?",
"elser_fields": ["title", "meta_description"],
"text_fields": ["title", "meta_description"],
"rrf": {
"rank_window_size": 50,
"rank_constant": 25
}
}
}
テキスト検索 + ELSER
Elastic Learned Sparse EncodeR (ELSER)は、テキスト拡張を通じて検索の関連性を向上させ、意味的検索を可能にします。この実験的テンプレートは、1つ以上のフィールドでELSERを有効にする必要があります。ELSERを使用した意味的検索を参照して、ELSERの使用方法についての詳細を確認してください。この場合、ELSERはtitle
およびdescription
フィールドで有効になっています。
この例は、さまざまな検索アプリケーションシナリオで使用できる単一のテンプレートを提供します: テキスト検索、ELSER、またはその両方。パラメータが指定されていない場合は、シンプルなデフォルトquery_string
クエリも提供します。
Python
resp = client.search_application.put(
name="my_search_application",
search_application={
"indices": [
"index1",
"index2"
],
"template": {
"script": {
"lang": "mustache",
"source": "\n {\n \"query\": {\n \"bool\": {\n \"should\": [\n {{#text}}\n {\n \"multi_match\": {\n \"query\": \"{{query_string}}\",\n \"fields\": [{{#text_fields}}\"{{name}}^{{boost}}\",{{/text_fields}}],\n \"boost\": \"{{text_query_boost}}\"\n }\n },\n {{/text}}\n {{#elser}}\n {{#elser_fields}}\n {\n \"sparse_vector\": {\n \"field\": \"ml.inference.{{.}}_expanded.predicted_value\",\n \"inference_id\": \"<elser_inference_id>\",\n \"query\": \"{{query_string}}\"\n }\n },\n {{/elser_fields}}\n { \"bool\": { \"must\": [] } },\n {{/elser}}\n {{^text}}\n {{^elser}}\n {\n \"query_string\": {\n \"query\": \"{{query_string}}\",\n \"default_field\": \"{{default_field}}\",\n \"default_operator\": \"{{default_operator}}\",\n \"boost\": \"{{text_query_boost}}\"\n }\n },\n {{/elser}}\n {{/text}}\n { \"bool\": { \"must\": [] } }\n ],\n \"minimum_should_match\": 1\n }\n },\n \"min_score\": \"{{min_score}}\",\n \"explain\": \"{{explain}}\",\n \"from\": \"{{from}}\",\n \"size\": \"{{size}}\"\n }\n ",
"params": {
"text": False,
"elser": False,
"elser_fields": [
{
"name": "title",
"boost": 1
},
{
"name": "description",
"boost": 1
}
],
"text_fields": [
{
"name": "title",
"boost": 10
},
{
"name": "description",
"boost": 5
},
{
"name": "state",
"boost": 1
}
],
"query_string": "*",
"text_query_boost": 4,
"default_field": "*",
"default_operator": "OR",
"explain": False,
"from": 0,
"size": 10,
"min_score": 0
}
}
}
},
)
print(resp)
Js
const response = await client.searchApplication.put({
name: "my_search_application",
search_application: {
indices: ["index1", "index2"],
template: {
script: {
lang: "mustache",
source:
'\n {\n "query": {\n "bool": {\n "should": [\n {{#text}}\n {\n "multi_match": {\n "query": "{{query_string}}",\n "fields": [{{#text_fields}}"{{name}}^{{boost}}",{{/text_fields}}],\n "boost": "{{text_query_boost}}"\n }\n },\n {{/text}}\n {{#elser}}\n {{#elser_fields}}\n {\n "sparse_vector": {\n "field": "ml.inference.{{.}}_expanded.predicted_value",\n "inference_id": "<elser_inference_id>",\n "query": "{{query_string}}"\n }\n },\n {{/elser_fields}}\n { "bool": { "must": [] } },\n {{/elser}}\n {{^text}}\n {{^elser}}\n {\n "query_string": {\n "query": "{{query_string}}",\n "default_field": "{{default_field}}",\n "default_operator": "{{default_operator}}",\n "boost": "{{text_query_boost}}"\n }\n },\n {{/elser}}\n {{/text}}\n { "bool": { "must": [] } }\n ],\n "minimum_should_match": 1\n }\n },\n "min_score": "{{min_score}}",\n "explain": "{{explain}}",\n "from": "{{from}}",\n "size": "{{size}}"\n }\n ',
params: {
text: false,
elser: false,
elser_fields: [
{
name: "title",
boost: 1,
},
{
name: "description",
boost: 1,
},
],
text_fields: [
{
name: "title",
boost: 10,
},
{
name: "description",
boost: 5,
},
{
name: "state",
boost: 1,
},
],
query_string: "*",
text_query_boost: 4,
default_field: "*",
default_operator: "OR",
explain: false,
from: 0,
size: 10,
min_score: 0,
},
},
},
},
});
console.log(response);
コンソール
PUT _application/search_application/my_search_application
{
"indices": [
"index1",
"index2"
],
"template": {
"script": {
"lang": "mustache",
"source": """
{
"query": {
"bool": {
"should": [
{{#text}}
{
"multi_match": {
"query": "{{query_string}}",
"fields": [{{#text_fields}}"{{name}}^{{boost}}",{{/text_fields}}],
"boost": "{{text_query_boost}}"
}
},
{{/text}}
{{#elser}}
{{#elser_fields}}
{
"sparse_vector": {
"field": "ml.inference.{{.}}_expanded.predicted_value",
"inference_id": "<elser_inference_id>",
"query": "{{query_string}}"
}
},
{{/elser_fields}}
{ "bool": { "must": [] } },
{{/elser}}
{{^text}}
{{^elser}}
{
"query_string": {
"query": "{{query_string}}",
"default_field": "{{default_field}}",
"default_operator": "{{default_operator}}",
"boost": "{{text_query_boost}}"
}
},
{{/elser}}
{{/text}}
{ "bool": { "must": [] } }
],
"minimum_should_match": 1
}
},
"min_score": "{{min_score}}",
"explain": "{{explain}}",
"from": "{{from}}",
"size": "{{size}}"
}
""",
"params": {
"text": false,
"elser": false,
"elser_fields": [
{"name": "title", "boost": 1},
{"name": "description", "boost": 1}
],
"text_fields": [
{"name": "title", "boost": 10},
{"name": "description", "boost": 5},
{"name": "state", "boost": 1}
],
"query_string": "*",
"text_query_boost": 4,
"default_field": "*",
"default_operator": "OR",
"explain": false,
"from": 0,
"size": 10,
"min_score": 0
}
}
}
}
このテンプレートを使用したテキスト検索クエリは次のようになります:
Python
resp = client.search_application.search(
name="my_search_application",
params={
"text": True,
"size": 5,
"query_string": "mountain climbing",
"text_fields": [
{
"name": "title",
"boost": 10
},
{
"name": "description",
"boost": 5
},
{
"name": "state",
"boost": 1
}
]
},
)
print(resp)
Js
const response = await client.searchApplication.search({
name: "my_search_application",
params: {
text: true,
size: 5,
query_string: "mountain climbing",
text_fields: [
{
name: "title",
boost: 10,
},
{
name: "description",
boost: 5,
},
{
name: "state",
boost: 1,
},
],
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
{
"params": {
"text": true,
"size": 5,
"query_string": "mountain climbing",
"text_fields": [
{"name": "title", "boost": 10},
{"name": "description", "boost": 5},
{"name": "state", "boost": 1}
]
}
}
このテンプレートを使用したELSER検索クエリは次のようになります:
Python
resp = client.search_application.search(
name="my_search_application",
params={
"elser": True,
"query_string": "where is the best mountain climbing?",
"elser_fields": [
{
"name": "title",
"boost": 1
},
{
"name": "description",
"boost": 1
}
]
},
)
print(resp)
Js
const response = await client.searchApplication.search({
name: "my_search_application",
params: {
elser: true,
query_string: "where is the best mountain climbing?",
elser_fields: [
{
name: "title",
boost: 1,
},
{
name: "description",
boost: 1,
},
],
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
{
"params": {
"elser": true,
"query_string": "where is the best mountain climbing?",
"elser_fields": [
{"name": "title", "boost": 1},
{"name": "description", "boost": 1}
]
}
}
このテンプレートを使用したテキスト検索とELSER検索の組み合わせクエリは次のようになります:
Python
resp = client.search_application.search(
name="my_search_application",
params={
"elser": True,
"text": True,
"query_string": "where is the best mountain climbing?",
"elser_fields": [
{
"name": "title",
"boost": 1
},
{
"name": "description",
"boost": 1
}
],
"text_query_boost": 4,
"min_score": 10
},
)
print(resp)
Js
const response = await client.searchApplication.search({
name: "my_search_application",
params: {
elser: true,
text: true,
query_string: "where is the best mountain climbing?",
elser_fields: [
{
name: "title",
boost: 1,
},
{
name: "description",
boost: 1,
},
],
text_query_boost: 4,
min_score: 10,
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
{
"params": {
"elser": true,
"text": true,
"query_string": "where is the best mountain climbing?",
"elser_fields": [
{"name": "title", "boost": 1},
{"name": "description", "boost": 1}
],
"text_query_boost": 4,
"min_score": 10
}
}
テキスト検索結果とELSER検索結果は、場合によっては大きく異なるスコアを持つことが予想され、ランキングが難しくなります。データセットに最適な検索結果のミックスを見つけるために、例のテンプレートで提供されるブースト値を使って実験することをお勧めします:
上記のブーストは、多くのユースケースに対して十分であるはずですが、テンプレートに再スコアクエリやインデックスブーストを追加することが有益な場合もあります。新しいテンプレートを使用するために検索アプリケーションを更新することを忘れないでください。put search application commandを使用して。
最後に、このテンプレートを使用したパラメータなしの検索は、すべてのドキュメントを返すデフォルト検索にフォールバックします:
Python
resp = client.search_application.search(
name="my_search_application",
)
print(resp)
Js
const response = await client.searchApplication.search({
name: "my_search_application",
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
ELSER検索
この例は、ELSER検索の簡略化されたバージョンをサポートします。
Python
resp = client.search_application.put(
name="my_search_application",
search_application={
"indices": [
"index1",
"index2"
],
"template": {
"script": {
"lang": "mustache",
"source": "\n {\n \"query\": {\n \"bool\": {\n \"should\": [\n {{#elser_fields}}\n {\n \"sparse_vector\": {\n \"field\": \"ml.inference.{{.}}_expanded.predicted_value\",\n \"inference_id\": \"<elser_inference_id>\",\n \"query\": \"{{query_string}}\"\n }\n },\n {{/elser_fields}}\n ]\n }\n },\n \"min_score\": \"{{min_score}}\"\n }\n ",
"params": {
"query_string": "*",
"min_score": "10",
"elser_fields": [
{
"name": "title"
},
{
"name": "description"
}
]
}
}
}
},
)
print(resp)
Js
const response = await client.searchApplication.put({
name: "my_search_application",
search_application: {
indices: ["index1", "index2"],
template: {
script: {
lang: "mustache",
source:
'\n {\n "query": {\n "bool": {\n "should": [\n {{#elser_fields}}\n {\n "sparse_vector": {\n "field": "ml.inference.{{.}}_expanded.predicted_value",\n "inference_id": "<elser_inference_id>",\n "query": "{{query_string}}"\n }\n },\n {{/elser_fields}}\n ]\n }\n },\n "min_score": "{{min_score}}"\n }\n ',
params: {
query_string: "*",
min_score: "10",
elser_fields: [
{
name: "title",
},
{
name: "description",
},
],
},
},
},
},
});
console.log(response);
コンソール
PUT _application/search_application/my_search_application
{
"indices": [
"index1",
"index2"
],
"template": {
"script": {
"lang": "mustache",
"source": """
{
"query": {
"bool": {
"should": [
{{#elser_fields}}
{
"sparse_vector": {
"field": "ml.inference.{{.}}_expanded.predicted_value",
"inference_id": "<elser_inference_id>",
"query": "{{query_string}}"
}
},
{{/elser_fields}}
]
}
},
"min_score": "{{min_score}}"
}
""",
"params": {
"query_string": "*",
"min_score": "10",
"elser_fields": [
{
"name": "title"
},
{
"name": "description"
}
]
}
}
}
}
このテンプレートのサンプルクエリは次のようになります:
#### Python
``````python
resp = client.search_application.search(
name="my_search_application",
params={
"query_string": "Where is the best place for mountain climbing?"
},
)
print(resp)
`
Js
const response = await client.searchApplication.search({
name: "my_search_application",
params: {
query_string: "Where is the best place for mountain climbing?",
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
{
"params": {
"query_string": "Where is the best place for mountain climbing?"
}
}
kNN検索
この例はk近傍検索 (kNN)をサポートします。
正確なkNN検索をサポートするテンプレートは次のようになります:
Python
resp = client.search_application.put(
name="my_search_application",
search_application={
"indices": [
"index1"
],
"template": {
"script": {
"lang": "mustache",
"source": "\n {\n \"query\": {\n \"script_score\": {\n \"query\": {\n \"bool\": {\n \"filter\": {\n \"range\": {\n \"{{field}}\": {\n \"{{operator}}\": {{value}}\n }\n }\n }\n }\n },\n \"script\": {\n \"source\": \"cosineSimilarity({{#toJson}}query_vector{{/toJson}}, '{{dense_vector_field}}') + 1.0\"\n }\n }\n }\n }\n ",
"params": {
"field": "price",
"operator": "gte",
"value": 1000,
"dense_vector_field": "product-vector",
"query_vector": []
}
}
}
},
)
print(resp)
Js
const response = await client.searchApplication.put({
name: "my_search_application",
search_application: {
indices: ["index1"],
template: {
script: {
lang: "mustache",
source:
'\n {\n "query": {\n "script_score": {\n "query": {\n "bool": {\n "filter": {\n "range": {\n "{{field}}": {\n "{{operator}}": {{value}}\n }\n }\n }\n }\n },\n "script": {\n "source": "cosineSimilarity({{#toJson}}query_vector{{/toJson}}, \'{{dense_vector_field}}\') + 1.0"\n }\n }\n }\n }\n ',
params: {
field: "price",
operator: "gte",
value: 1000,
dense_vector_field: "product-vector",
query_vector: [],
},
},
},
},
});
console.log(response);
コンソール
PUT _application/search_application/my_search_application
{
"indices": [
"index1"
],
"template": {
"script": {
"lang": "mustache",
"source": """
{
"query": {
"script_score": {
"query": {
"bool": {
"filter": {
"range": {
"{{field}}": {
"{{operator}}": {{value}}
}
}
}
}
},
"script": {
"source": "cosineSimilarity({{#toJson}}query_vector{{/toJson}}, '{{dense_vector_field}}') + 1.0"
}
}
}
}
""",
"params": {
"field": "price",
"operator": "gte",
"value": 1000,
"dense_vector_field": "product-vector",
"query_vector": []
}
}
}
}
このテンプレートを使用した検索クエリは次のようになります:
Python
resp = client.search_application.search(
name="my_search_application",
params={
"field": "price",
"operator": "gte",
"value": 500
},
)
print(resp)
Js
const response = await client.searchApplication.search({
name: "my_search_application",
params: {
field: "price",
operator: "gte",
value: 500,
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
{
"params": {
"field": "price",
"operator": "gte",
"value": 500
}
}
近似kNN検索をサポートするテンプレートは次のようになります:
Python
resp = client.search_application.put(
name="my_search_application",
search_application={
"indices": [
"index1"
],
"template": {
"script": {
"lang": "mustache",
"source": "\n {\n \"knn\": {\n \"field\": \"{{knn_field}}\",\n \"query_vector\": {{#toJson}}query_vector{{/toJson}},\n \"k\": \"{{k}}\",\n \"num_candidates\": {{num_candidates}}\n },\n \"fields\": {{#toJson}}fields{{/toJson}}\n }\n ",
"params": {
"knn_field": "image-vector",
"query_vector": [],
"k": 10,
"num_candidates": 100,
"fields": [
"title",
"file-type"
]
}
}
}
},
)
print(resp)
Js
const response = await client.searchApplication.put({
name: "my_search_application",
search_application: {
indices: ["index1"],
template: {
script: {
lang: "mustache",
source:
'\n {\n "knn": {\n "field": "{{knn_field}}",\n "query_vector": {{#toJson}}query_vector{{/toJson}},\n "k": "{{k}}",\n "num_candidates": {{num_candidates}}\n },\n "fields": {{#toJson}}fields{{/toJson}}\n }\n ',
params: {
knn_field: "image-vector",
query_vector: [],
k: 10,
num_candidates: 100,
fields: ["title", "file-type"],
},
},
},
},
});
console.log(response);
コンソール
PUT _application/search_application/my_search_application
{
"indices": [
"index1"
],
"template": {
"script": {
"lang": "mustache",
"source": """
{
"knn": {
"field": "{{knn_field}}",
"query_vector": {{#toJson}}query_vector{{/toJson}},
"k": "{{k}}",
"num_candidates": {{num_candidates}}
},
"fields": {{#toJson}}fields{{/toJson}}
}
""",
"params": {
"knn_field": "image-vector",
"query_vector": [],
"k": 10,
"num_candidates": 100,
"fields": ["title", "file-type"]
}
}
}
}
このテンプレートを使用した検索クエリは次のようになります:
Python
resp = client.search_application.search(
name="my_search_application",
params={
"knn_field": "image-vector",
"query_vector": [
-5,
9,
-12
],
"k": 10,
"num_candidates": 100,
"fields": [
"title",
"file-type"
]
},
)
print(resp)
Js
const response = await client.searchApplication.search({
name: "my_search_application",
params: {
knn_field: "image-vector",
query_vector: [-5, 9, -12],
k: 10,
num_candidates: 100,
fields: ["title", "file-type"],
},
});
console.log(response);
コンソール
POST _application/search_application/my_search_application/_search
{
"params": {
"knn_field": "image-vector",
"query_vector": [-5, 9, -12],
"k": 10,
"num_candidates": 100,
"fields": ["title", "file-type"]
}
}