猿问

如何在 elasticsearch 中聚合“非关键字”字段?

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


{   

    "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

       }

      ]

   }

}

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


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


皈依舞
浏览 163回答 1
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 )
随时随地看视频慕课网APP

相关分类

Java
我要回答