跳到主要内容

访问文档字段和特殊变量

根据脚本的使用位置,它可以访问某些特殊变量和文档字段。

Update scripts

参数说明
ctx._source应用于文档的_source字段
ctx.op应用于文档的操作:index或delete。
ctx._index应用于文档元字段

搜索和聚合脚本

除了每个搜索命中执行一次的脚本字段外,搜索和聚合中使用的脚本将对可能匹配查询或聚合的每个文档执行一次。根据您拥有的文档数量,这可能意味着数百万或数十亿次的执行:这些脚本需要非常高效!

可以使用 docvalue、_source 或 stored fields 从脚本中访问字段值,下面将对每个字段进行解释

访问文档的_score

使用 function_score query、基于脚本的排序或聚合中使用的脚本可以访问_score变量,该变量表示文档的当前相关性得分。

以下是在function_score query中使用脚本来更改每个文档的相关性_score的示例:

PUT my_index/_doc/1?refresh
{
"text": "quick brown fox",
"popularity": 1
}

PUT my_index/_doc/2?refresh
{
"text": "quick fox",
"popularity": 5
}

GET my_index/_search
{
"query": {
"function_score": {
"query": {
"match": {
"text": "quick brown fox"
}
},
"script_score": {
"script": {
"lang": "expression",
"source": "_score * doc['popularity']"
}
}
}
}
}

DocValue

从脚本中访问字段值最快最有效的方法是使用doc['field_name']语法,该语法从doc值中检索字段值。docvalue是一个列式存储,默认情况下,除 analyzed text fields 外,建议所有字段都启用。

PUT my_index/_doc/1?refresh
{
"cost_price": 100
}

GET my_index/_search
{
"script_fields": {
"sales_price": {
"script": {
"lang": "expression",
"source": "doc['cost_price'] * markup",
"params": {
"markup": 0.2
}
}
}
}
}
提示

docvalue只能返回“简单”字段值,如数字、日期、地理点、term等,如果字段是多值的,则只能返回这些值的数组,它无法返回JSON对象。

_source

可以使用_source.field_name语法访问文档_source。例如_source.name.first访问。

PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"first_name": {
"type": "text"
},
"last_name": {
"type": "text"
}
}
}
}
}

PUT my_index/_doc/1?refresh
{
"first_name": "Barry",
"last_name": "White"
}

GET my_index/_search
{
"script_fields": {
"full_name": {
"script": {
"lang": "painless",
"source": "params._source.first_name + ' ' + params._source.last_name"
}
}
}
}

Stored fields

Stored fields — 显式标记为“store”的字段:mapping中设置为true 则可以使用_fields['field_name'].value或_fields[fields_name']语法访问:

PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"full_name": {
"type": "text",
"store": true
},
"title": {
"type": "text",
"store": true
}
}
}
}
}

PUT my_index/_doc/1?refresh
{
"full_name": "Alice Ball",
"title": "Professor"
}

GET my_index/_search
{
"script_fields": {
"name_with_title": {
"script": {
"lang": "painless",
"source": "params._fields['title'].value + ' ' + params._fields['full_name'].value"
}
}
}
}