[ElasticSearch]painless脚本获取字段方式及性能比较

一.3种常见方式

  • doc['fieldname']: 常用于在搜索或排序等无状态操作时进行使用
  • params['_source']['fieldname']:也是常用在搜索或排序中,但更多用在获取额外字段时灵活操作时使用,如不获取某个字段直接使用params['_source']获取整个_source对象;
  • ctx._source:一般用于状态化操作(会已知整个文档并进行操作时),比如在进行_update_by_query或者updae等修改删除操作时,大部分都能且只能使用ctx._source。          在我看来它更像是已知结果,并对结果进行缓冲区留存而后对其进行操作,而非上述两位预设程序,并进行获取的感觉(个人拙见)

二.doc['fieldname']与params['_source']['fieldname']对比

一般在进行查询时并需要对字段进行额外获取值,并利用值进行无状态化操作时,更推荐使用此方式;

例如在script_fields中,可以同时使用doc['fieldname']及params['_source']['fieldname']的方式。

但需要注意的是:

1.通过doc['fieldname']获取字段,将会加载该字段的相关术语及字段值本身;

2.通过params['_source']['fieldname']获取字段会获取到整个_source的json对象并从中获取字段,相比第1种,此种方式会相对较慢;但如果你想对整个_source的json对象进行操作,那当我没说;尽情使用params['_source']吧

举例常用script_field及script_sort

GET test_index/_search
{
  "script_fields": {
    "my_doubled_field": {
      "script": {
        "source": "doc['my_field'].value * params['multiplier']",
        "params":{
          "multiplier": 2
        }
      }
    }
  }
}

GET test_index/_search
{
	"query": {
		"match_all": {}
	},
	"sort": [		{
			"_script": {
				"type": "number",
				"order": "desc",
				"script": {
					"lang": "painless",
					"source": "doc['public_time'].value"
				}
			}
		}
	]
}


{
	"query": {
		"match_all": {}
	},
	"sort": [		{
			"_script": {
				"type": "number",
				"order": "desc",
				"script": {
					"lang": "painless",
					"source": "params['_source']['public_time']"
				}
			}
		}
	]
}

简单结论:修改删除ctx._source,查询排序doc['fieldname']

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值