Elasticsearch-1

ooowl
  • 大数据🐘
  • Elasticsearch
  • 大数据🐘
  • Elasticsearch
About 1 min

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...