elasticsearch-script-painless-实践
Painless实践
以下案例来源工作中实际需求,或者自己想到例子。
案例一
需求描述:搜索数据时返回一个新增的常量字段
GET hockey/_search { "_source": true, "script_fields": { "area": { "script": { "lang": "painless", "source": """ return "CN" """ } } } }
搜索结果
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 12, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "hockey", "_type" : "_doc", "_id" : "2", "_score" : 1.0, "_source" : { "first" : "sean", "last" : "monohan", "goals" : [ 7, 54, 26 ], "assists" : [ 11, 26, 13 ], "gp" : [ 26, 82, 82 ], "born" : "1994/10/12" }, "fields" : { "area" : [ "CN" ] } }, { "_index" : "hockey", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "first" : "jiri", "last" : "hudler", "goals" : [ 5, 34, 36 ], "assists" : [ 11, 62, 42 ], "gp" : [ 24, 80, 79 ], "born" : "1984/01/04" }, "fields" : { "area" : [ "CN" ] } } ] } }
案例二
需求描述:抽样多个地区数据,查询某个地区数据,要求某些字段(数组)元素个数不超过固定数量,返回指定字段、至少返回多少个字段、必须有哪几个字段及返回数据条数
GET vip/_search { "_source": ["gender","birth","phone","email","address","names","friends"], "query": { "bool": { "should": [ { "exists": { "field": "gender" } }, { "exists": { "field": "birth" } }, { "exists": { "field": "phone" } }, { "exists": { "field": "email" } }, { "exists": { "field": "friends" } } ], "minimum_should_match": 3, "must": [ { "match": { "address": "北京" } }, { "exists": { "field": "names" } }, { "exists": { "field": "address" } },{ "script": { "script": "doc['names.raw'].length <= 10" } },{ "script": { "script": "doc.friends.size() <= 10" } } ] } }, "size": 10 }
POST _reindex { "size": 3, "source": { "index": "vips", "_source": [ "gender", "birth", "phone", "email", "address", "names", "friends" ], "query": { "bool": { "should": [ { "exists": { "field": "gender" } }, { "exists": { "field": "birth" } }, { "exists": { "field": "phone" } }, { "exists": { "field": "email" } }, { "exists": { "field": "friends" } } ], "minimum_should_match": 3, "must": [ { "match": { "address": "北京" } }, { "exists": { "field": "names" } }, { "exists": { "field": "address" } },{ "script": { "script": "doc['names.raw'].length <= 10" } },{ "script": { "script": "doc.friends.size() <= 10" } } ] } }, "dest": { "index": "reindex_test" , "op_type": "create" } }
案例四
需求描述:根据条件查询出的数据新增字段
POST index_reindex/_update_by_query { "query": { "match_phrase": { "address": "北京" } }, "script": { "source": "ctx._source['area'] = \"北京\"" } }
案例五
需求描述:删除字段