【问题标题】:How to aggregate a 'non - keyword' field in elasticsearch?如何在弹性搜索中聚合“非关键字”字段?
【发布时间】:2019-05-29 16:06:39
【问题描述】:

我正在尝试编写一个弹性搜索查询,该查询应列出文档中各个字段持有的所有不同值。当字段为关键字类型时,术语聚合查询工作正常,我可以看到这些值及其计数在桶中列出。但是,当我查询不同的柑橘类水果类型时,我没有得到任何结果,映射如下所示:

{   
    "vegetables":{
      "type": "text",
      "fields": {
         "keyword" : {
            "type" : "keyword",
            "ignore_above": 256
          }
        }
     }, 
    "fruits": {
        "properties": {
            "citrus": {
                "properties": {
                    "orange": {
                        "type": "long"
                    },
                    "lemon": {
                        "type": "long"
                    },
                    "kiwi": {
                        "type": "long"
                    }
                }
            }
        }
    }
}

我期待的结果是:

"aggregations": {
  "distinct_citrusy_fruits"{
     "buckets" : [
       {
         "key":"oranges",
         "doc_count": 23
       },
       {
         "key":"lemon",
         "doc_count": 21
       },
       {
         "key":"kiwi",
         "doc_count": 23
       }
      ]
   }
}

当我为“vegetables”字段(这是一个关键字类型)进行术语聚合时,我能够获得如上所示的存储桶。 在这种情况下如何获得不同的计数?另外,我没有更改文档格式的选项。

编辑-到目前为止我发现的唯一解决方法是调用映射 api,然后在我的代码中解析嵌套的 JSON 以获取键值,如果有更好的解决方案,请在此处添加答案。

【问题讨论】:

  • 增加索引的映射,以便人们更好地理解字段的数据类型。
  • 嗨,我编辑了问题以包含映射。

标签: java elasticsearch kibana elastic-stack elasticsearch-aggregation


【解决方案1】:

我认为您不能在字段名称上查询或运行聚合,只能在值上。 对于水果,我期望以下映射:

{
    "fruits": {
        "properties": {
            "citrus": {
                "properties": {
                    "kind": {
                        "type": "keyword"
                    },
                    "count": {
                        "type": "long"
                    }
                }
            }
        }
    }
}

也许您可以使用 _field_names 字段,其中包含每个具有值的字段名。 (https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-field-names-field.html)

【讨论】:

  • 是的,你是对的,它不可能聚合​​非关键字类型的字段。我试图聚合 '_field_names' 但出现异常 - “字段 [_field_names] 类型的字段不支持字段数据[_field_names]”,然后在我查找此错误 (stackoverflow.com/a/48724411/11259999) 时在这里找到了这个答案,它说-“似乎 ES > 5.X 中获取唯一字段名称的唯一方法是通过映射端点,并且因为无法在 _field_names 上进行聚合,您可能需要稍微更改数据格式,因为无论嵌套如何,映射端点都会返回每个字段。”
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多