通过数组中的字符串聚合 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 中聚合数组字段的一个索引