通过数组中的字符串聚合 Elasticsearch 术语

Posted

技术标签:

【中文标题】通过数组中的字符串聚合 Elasticsearch 术语【英文标题】:Elasticsearch terms aggregation by strings in an array 【发布时间】:2016-02-17 21:47:09 【问题描述】:

如何编写一个 Elasticsearch 术语聚合,按整个术语而不是单个令牌分割存储桶?例如,我想按州进行汇总,但以下将 new、york、jersey 和 california 作为单独的存储桶返回,而不是按预期将 New York、New Jersey 和 California 作为存储桶返回:

curl -XPOST "http://localhost:9200/my_index/_search" -d'

    "aggs" : 
        "states" : 
            "terms" :  
                "field" : "states",
                "size": 10
            
        
    
'

我的用例和这里描述的一样 https://www.elastic.co/guide/en/elasticsearch/guide/current/aggregations-and-analysis.html 只有一个区别: 在我的例子中,city 字段是一个数组。

示例对象:


    "states": ["New York", "New Jersey", "California"]

似乎建议的解决方案(将字段映射为 not_analyzed)不适用于数组。

我的映射:


    "properties": 
        "states": 
            "type":"object",
            "fields": 
                "raw": 
                    "type":"object",
                    "index":"not_analyzed"
                
            
        
    

我试图用“字符串”替换“对象”,但这也不起作用。

【问题讨论】:

【参考方案1】:

我认为您所缺少的只是聚合中的"states.raw"(请注意,由于没有指定分析器,因此"states" 字段与standard analyzer 一起分析;子字段"raw" 是@987654326 @)。尽管您的映射也可能需要考虑。当我尝试针对 ES 2.0 进行映射时,我遇到了一些错误,但这有效:

PUT /test_index

   "mappings": 
      "doc": 
         "properties": 
            "states": 
               "type": "string",
               "fields": 
                  "raw": 
                     "type": "string",
                     "index": "not_analyzed"
                  
               
            
         
      
   

然后我添加了几个文档:

POST /test_index/doc/_bulk
"index":"_id":1
"states":["New York","New Jersey","California"]
"index":"_id":2
"states":["New York","North Carolina","North Dakota"]

而且这个查询似乎做你想做的事:

POST /test_index/_search

    "size": 0, 
    "aggs" : 
        "states" : 
            "terms" :  
                "field" : "states.raw",
                "size": 10
            
        
    

返回:


   "took": 1,
   "timed_out": false,
   "_shards": 
      "total": 1,
      "successful": 1,
      "failed": 0
   ,
   "hits": 
      "total": 2,
      "max_score": 0,
      "hits": []
   ,
   "aggregations": 
      "states": 
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            
               "key": "New York",
               "doc_count": 2
            ,
            
               "key": "California",
               "doc_count": 1
            ,
            
               "key": "New Jersey",
               "doc_count": 1
            ,
            
               "key": "North Carolina",
               "doc_count": 1
            ,
            
               "key": "North Dakota",
               "doc_count": 1
            
         ]
      
   

这是我用来测试它的代码:

http://sense.qbox.io/gist/31851c3cfee8c1896eb4b53bc1ddd39ae87b173e

【讨论】:

非常感谢您的回答,您是对的,我的问题确实缺少.raw。那是因为我尝试了很多不同的映射和搜索组合,最终发布了那个。您的回答让我发现我真正的问题是,我正在使用 elasticsearch-transport-couchbase 插件将我的文档导入 Elasticsearch,并且该插件会更改我的文档结构,并用 "doc" 属性包围它。感谢您的回答,我手动添加了一个文档,它起作用了,这就是我在其他文档中检测到周围的“doc”属性的方式。

以上是关于通过数组中的字符串聚合 Elasticsearch 术语的主要内容,如果未能解决你的问题,请参考以下文章

通过elasticsearch.net中的字符串数组查询字符串数组

如何在 Elasticsearch 中聚合数组字段的一个索引

不同键上的 Elasticsearch 聚合

Elasticsearch聚合学习之四:结果排序

将 Elasticsearch 中的数据读入 Flink 聚合?

Elasticsearch:Elasticsearch 中的父级和兄弟级聚合