如何使用Elasticsearch groovy script脚本更新数据

 我来答
手机用户76371
2017-08-20 · 超过245用户采纳过TA的回答
知道小有建树答主
回答量:663
采纳率:33%
帮助的人:375万
展开全部
用groovy脚本自定义ElasticSearch查询,来实现以上功能。

例,数据中包含字段birdtyday,记录游客生日:
"birthday": "1992-02-05 00:00:00",
新建文件getAgeByBirthday.groovy,编辑其内容为:

def b = doc[birthday_field].value
def birthday = new Date(b)
def now = new Date()
long age = (now -birthday)/365
age

并把此文件放在es的config/scripts目录下(如果没有此目录就新建一个)。

然后在config/elasticsearch.yml文件中加一行:

script.groovy.sandbox.enabled: true

最后重启es即可。
接下来,我们就可以用以下DSL进行年龄统计了

GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"aggs": {
"counts_by_age": {
"terms": {
"script_file": "getAgeByBirthday",
"params": {
"birthday_field": "birthday"
},
"size": 100
}
}
}
}

或者:

GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"aggs": {
"histogram_by_age": {
"histogram": {
"script_file": "getAgeByBirdthday",
"params": {
"birdthday_field": "birdthday"
},
"interval": 5
}
}
}
}

不过脚本查询性能不佳,且不能利用es的缓存,所以在大数据量或高性能要求的场景下不适用。。

-------------------------------------
补充一个自定义的年龄range过滤:
range_AgeByBirthday.groovy:

def b = doc[birdthday_field].value
def birdthday = new Date(b)
def now = new Date()
long age = (now -birdthday)/365
gte<=age && age<=lte

DSL:

GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"query": {
"filtered": {
"filter": {
"script": {
"script_file": "range_AgeByBirdthday",
"params": {
"birdthday_field": "birdthday",
"gte": 50,
"lte": 60
}
}
}
}
},
"aggs": {
"histogram_by_age": {
"histogram": {
"script_file": "getAgeByBirdthday",
"params": {
"birdthday_field": "birdthday"
},
"interval": 5
}
}
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式