Elasticsearch-1
Elasticsearch-1
ES查询遇到的需求
插入去重
数据结构是这样的
{
"mappings": {
"properties": {
"person_id": {
"type": "keyword" # 唯一,和id相等
},
"person_id_tag": {
"type": "keyword" # 列表字段
}
}
}
}
现在要求添加数据的时候自动去重,即已存在的元素不会被插入,取并集
如果此id不存在,那就插入传入的新的
使用神奇海螺+自己修改调试,使用这个脚本,下次要改的话复制出来不难看明白,主要是语法的问题
{
"script": {
"lang": "painless",
"inline": "if (ctx._source.person_id == null) { ctx._source.person_id = params.person_id; ctx._source.person_id_tag = params.person_id_tag }else { for (int i = 0; i < params.person_id_tag.length; ++i) {if (!ctx._source.person_id_tag.contains(params.person_id_tag[i])){ ctx._source.person_id_tag.add(params.person_id_tag[i])}}}",
"params": {
"person_id": "string22233",
"person_id_tag": [
"x",
"a",
"b",
"c"
]
}
},
"upsert": {
"person_id": "string22233",
"person_id_tag": [
"x",
"a",
"b",
"c"
]
}
}
再就是如果存在的话删除传入的标签,不存在不动
{
"script": {
"lang": "painless",
"inline": "if (ctx._source.containsKey('person_id')) { for (int i = 0; i < params.person_id_tag.length; ++i) { if (ctx._source.person_id_tag.contains(params.person_id_tag[i])) { ctx._source.person_id_tag.remove(ctx._source.person_id_tag.indexOf(params.person_id_tag[i])); } }} else {ctx.op = 'none';}",
"params": {
"person_id": "string222ss33",
"person_id_tag": [
"a",
"b",
"c"
]
}
},
"upsert": {
"person_id": "string2ss2233",
"person_id_tag": [
"a",
"b",
"c"
]
}
}
列表的与或查询
keyword机制
收集文章
Loading...