スクリプトクエリ
Runtime fields は、より柔軟な非常に似た機能を提供します。フィールド値を作成するためのスクリプトを書き、それらは fields
、すべてのクエリ、および 集約 のように、どこでも利用可能です。
提供された script に基づいてドキュメントをフィルタリングします。script
クエリは通常、フィルターコンテキスト で使用されます。
スクリプトを使用すると、検索速度が遅くなる可能性があります。詳細は Scripts, caching, and search speed を参照してください。
例のリクエスト
Python
resp = client.search(
query={
"bool": {
"filter": {
"script": {
"script": "\n double amount = doc['amount'].value;\n if (doc['type'].value == 'expense') {\n amount *= -1;\n }\n return amount < 10;\n "
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
bool: {
filter: {
script: {
script: "\n double amount = doc['amount'].value;\n if (doc['type'].value == 'expense') {\n amount *= -1;\n }\n return amount < 10;\n "
}
}
}
}
}
)
puts response
Js
const response = await client.search({
query: {
bool: {
filter: {
script: {
script:
"\n double amount = doc['amount'].value;\n if (doc['type'].value == 'expense') {\n amount *= -1;\n }\n return amount < 10;\n ",
},
},
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"bool": {
"filter": {
"script": {
"script": """
double amount = doc['amount'].value;
if (doc['type'].value == 'expense') {
amount *= -1;
}
return amount < 10;
"""
}
}
}
}
}
ランタイムフィールドを使用することで、検索クエリで同じ結果を得ることができます。_search
API の fields
パラメータを使用して、同じクエリの一部として値を取得します:
Python
resp = client.search(
runtime_mappings={
"amount.signed": {
"type": "double",
"script": "\n double amount = doc['amount'].value;\n if (doc['type'].value == 'expense') {\n amount *= -1;\n }\n emit(amount);\n "
}
},
query={
"bool": {
"filter": {
"range": {
"amount.signed": {
"lt": 10
}
}
}
}
},
fields=[
{
"field": "amount.signed"
}
],
)
print(resp)
Ruby
response = client.search(
body: {
runtime_mappings: {
'amount.signed' => {
type: 'double',
script: "\n double amount = doc['amount'].value;\n if (doc['type'].value == 'expense') {\n amount *= -1;\n }\n emit(amount);\n "
}
},
query: {
bool: {
filter: {
range: {
'amount.signed' => {
lt: 10
}
}
}
}
},
fields: [
{
field: 'amount.signed'
}
]
}
)
puts response
Js
const response = await client.search({
runtime_mappings: {
"amount.signed": {
type: "double",
script:
"\n double amount = doc['amount'].value;\n if (doc['type'].value == 'expense') {\n amount *= -1;\n }\n emit(amount);\n ",
},
},
query: {
bool: {
filter: {
range: {
"amount.signed": {
lt: 10,
},
},
},
},
},
fields: [
{
field: "amount.signed",
},
],
});
console.log(response);
コンソール
GET /_search
{
"runtime_mappings": {
"amount.signed": {
"type": "double",
"script": """
double amount = doc['amount'].value;
if (doc['type'].value == 'expense') {
amount *= -1;
}
emit(amount);
"""
}
},
"query": {
"bool": {
"filter": {
"range": {
"amount.signed": { "lt": 10 }
}
}
}
},
"fields": [{"field": "amount.signed"}]
}
スクリプトのトップレベルパラメータ
script
- (必須、script object) クエリとして実行するスクリプトを含みます。このスクリプトはブール値を返す必要があります。
true
またはfalse
。
ノート
カスタムパラメータ
filters のように、スクリプトはより速い実行のためにキャッシュされます。スクリプトの引数を頻繁に変更する場合は、スクリプトの params
パラメータに保存することをお勧めします。例えば:
Python
resp = client.search(
query={
"bool": {
"filter": {
"script": {
"script": {
"source": "doc['num1'].value > params.param1",
"lang": "painless",
"params": {
"param1": 5
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
bool: {
filter: {
script: {
script: {
source: "doc['num1'].value > params.param1",
lang: 'painless',
params: {
"param1": 5
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
query: {
bool: {
filter: {
script: {
script: {
source: "doc['num1'].value > params.param1",
lang: "painless",
params: {
param1: 5,
},
},
},
},
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"bool": {
"filter": {
"script": {
"script": {
"source": "doc['num1'].value > params.param1",
"lang": "painless",
"params": {
"param1": 5
}
}
}
}
}
}
}
高コストのクエリを許可する
search.allow_expensive_queries
が false に設定されている場合、スクリプトクエリは実行されません。