Elasticsearch 中的术语聚合返回单词而不是完整字段值的存储桶
Posted
技术标签:
【中文标题】Elasticsearch 中的术语聚合返回单词而不是完整字段值的存储桶【英文标题】:Term Aggregations in Elasticsearch Returning Buckets for Words Instead of Full Field Values 【发布时间】:2016-01-15 17:35:33 【问题描述】:我有一个使用术语聚合的弹性搜索查询:
"query" :
"match_all" :
,
"aggregations" :
"tag" :
"terms" :
"field": "persona"
查询结果中样本命中的_source如下所示:
"_source":
"facets":
"persona": "research manager",
"research type": "qualitative"
,
"name": "Joe Doe"
聚合桶如下所示:
"facets":
"tag":
"_type": "terms",
"missing": 0,
"other": 0,
"terms": [
"count": 2,
"term": "research"
,
"count": 2,
"term": "manager"
],
"total": 4
术语聚合是考虑角色字段中的单词而不是字段的整个值。这是预期的输出:
...
"terms" : [
"term" : "research manager",
"count" : 2
,
...
]
....
我做错了吗?有没有办法做到这一点?
【问题讨论】:
我刚刚注意到您的 Elasticsearch 记录中发生了一些奇怪的事情……角色在 facets 对象中。我们能看到这个映射吗? 【参考方案1】:正如 bittusarkar 所提到的,角色字段很可能会被分析。如果您没有在映射中指定映射或有关该字段的信息,则 Elasticsearch 会将其动态添加到映射中,类型为 string
,默认为 Standard Analyzer。分析器包含标准标记器,它比空白标记器做得更多,但基本上您的字段内容被视为“词袋”。
通常,对于全文搜索/Elasticsearch 查询,您确实希望对内容进行分析,以便在搜索“经理”时匹配“研究经理”。
一种解决方案是使用multi-fields。关于角色字段的映射的 sn-p 可能如下所示:
"persona":
"type": "multi_field",
"fields":
"persona": "type": "string" ,
"raw": "type": "string", "index": "not_analyzed"
这样你就可以进行如下搜索:
"query" :
"match" :
"persona" : "Managers"
同时你可以使用聚合:
"query" :
"match_all" :
,
"aggregations" :
"tag" :
"terms" :
"field": "persona.raw"
请注意,您使用 persona.raw
代替 persona
来表示术语聚合。
【讨论】:
【参考方案2】:很可能对“角色”字段进行了分析。映射“样本”的定义应予以确认。 Terms aggregation
适用于非分析领域。如果对字段“persona”进行分析,则在索引中将其保存为两个不同的单词“research”和“manager”。要获得您想要的,您必须将“角色”字段更改为未分析。请参阅this 了解更多信息。恐怕您无法动态地在映射中进行此更改。您需要使用更新后的映射重新索引所有文档,以使更改生效。
【讨论】:
以上是关于Elasticsearch 中的术语聚合返回单词而不是完整字段值的存储桶的主要内容,如果未能解决你的问题,请参考以下文章