ElasticSearch 7中获取某类型为List<String>的字段的元素个数

在ElasticSearch中,如果我们设置某字段的类型为keyword,但是我们实际存进去的是一个形如List<String>的值时,这时候Es也是可以保存成功,存储后的数据类似于这样

{
    "ids": [
        "123345",
        "1231231",
        "1231265879"
    ],
    "status": "1"
}

这时候通过集合中任何一个值进行查询筛选时都可以命中到当前文档,由此可以实现诸如通过分类编号、标签编号、群组成员查询文档信息等场景。

但有时候我们可能想获取ids中有多少个元素,因为有需求要查询某区间内的分布情况,如ids的大小为5~10,10~50的有多少文档命中,对应的是哪些文档。

这里提供一个比较简单的解决方案,就是通过Es的pipeline以及新增一个计数字段来进行处理。

1、新建pipeline

PUT _ingest/pipeline/add_group_size_pipeline
{
  "processors": [
    {
      "script": {
        "lang": "painless",
        "source": "ctx.groupSize = ctx.ids.size();"
      }
    }
  ]
}

这个前置预处理器就是在保存文档前,先计算文档中某个字段的元素数量,并赋值到文档中具体某个字段中

2、将刚才新建的pipline添加到索引的设置项中

PUT ids_manager
{
  "settings": {
    "index": {
      "default_pipeline": "add_group_size_pipeline"
    }
  },
  "mappings": {
    "properties": {
      "ids": {
        "type": "keyword"
      },
      "groupSize": {
        "type": "keyword"
      },
      "createTime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "updateTime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

这样我们就可以通过groupSize字段进行筛选以满足对应的需求,以上Mapping仅演示使用,实际结构会复杂一点

posted @ 2022-11-11 20:25  yourxiong  阅读(410)  评论(0)    收藏  举报