脚本查询
编辑脚本查询编辑
根据提供的 脚本 过滤文档。 script
查询通常用于 过滤器上下文 中。
使用脚本会导致搜索速度变慢。请参阅 脚本、缓存和搜索速度。
示例请求编辑
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
GET /_search { "query": { "bool": { "filter": { "script": { "script": """ double amount = doc['amount'].value; if (doc['type'].value == 'expense') { amount *= -1; } return amount < 10; """ } } } } }
您可以通过使用运行时字段在搜索查询中获得相同的结果。使用 fields
参数在 _search
API 上获取值作为同一查询的一部分
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
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"}] }
备注编辑
自定义参数编辑
与 过滤器 一样,脚本会被缓存以加快执行速度。如果您经常更改脚本的参数,建议您将它们存储在脚本的 params
参数中。例如
response = client.search( body: { query: { bool: { filter: { script: { script: { source: "doc['num1'].value > params.param1", lang: 'painless', params: { "param1": 5 } } } } } } } ) puts response
GET /_search { "query": { "bool": { "filter": { "script": { "script": { "source": "doc['num1'].value > params.param1", "lang": "painless", "params": { "param1": 5 } } } } } } }
允许昂贵的查询编辑
如果 search.allow_expensive_queries
设置为 false,则不会执行脚本查询。