Kibana 在Elasticsearch中聚合时,将字段中的逗号分隔值视为单独值

uubf1zoe  于 2023-11-15  发布在  Kibana
关注(0)|答案(1)|浏览(183)

我想对具有以下值的字段进行聚合:
文档1_field:“A”文档2_field:“A,B”文档3_field:“A,B,C”
我可以使用什么Map/设置,以便当我在这个字段上聚合时,我应该得到这样的结果:
键:A计数:3
键:“B”计数:2
键:“C”计数:3
我尝试在上面的字段中添加逗号分隔分析器,但它没有给我想要的结果,我仍然得到这样的结果
键:“A”计数:1
按键:“A、B、C”计数:1
这不是我想要的
你能帮助我在这个领域如何聚合吗?

ijxebb2r

ijxebb2r1#

最好的方法是在摄取时使用摄取管道和split processor分割字段:
使用您提供的相同文档模拟以下摄取管道将产生以下结果:

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "split": {
          "field": "field_name",
          "separator": "\\s*[,;]\\s*"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "field_name": "A"
      }
    },
    {
      "_source": {
        "field_name": "A, B"
      }
    },
    {
      "_source": {
        "field_name": "A; B; C"
      }
    }
  ]
}

字符串
结果如下:

{
  "docs": [
    {
      "doc": {
        "_source": {
          "field_name": [
            "A"
          ]
        }
      }
    },
    {
      "doc": {
        "_source": {
          "field_name": [
            "A",
            "B"
          ]
        }
      }
    },
    {
      "doc": {
        "_source": {
          "field_name": [
            "A",
            "B",
            "C"
          ]
        }
      }
    }
  ]
}


这意味着,不是索引"A, B, C",而是索引一个包含三个单独值的数组:["A", "B", "C"],然后您可以轻松地聚合并获得想要的结果。
如果你想走这条路,只需创建管道:

PUT _ingest/pipeline/splitter
{
    "processors": [
      {
        "split": {
          "field": "field_name",
          "separator": "\\s*,\\s*"
        }
      }
    ]
}


然后通过引用来索引您的文档:

PUT index/_doc/1?pipeline=splitter
{
   "field": "A, B, C"
}

相关问题