期限汇总值
问题描述:
我有一个使用期限聚合的elasticsearch查询:期限汇总值
{
"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
},
...
]
....
我做错了什么?有没有办法做到这一点?
答
正如bittusarkar提到的,角色字段最有可能被分析。如果您没有在映射中指定映射或有关该字段的信息,那么它将被Elasticsearch动态添加到映射中,类型为string
,缺省值为Standard Analyzer。分析器结合了标准分词器,它比空白分词器多一点,但基本上你的字段的内容被视为一个“袋子文字”。
通常,对于全文搜索/ Elasticsearch查询,您希望分析内容,以便在搜索“管理员”时匹配“研究经理”。
一个解决方案是使用multi-fields。你映射的有关人物领域的一个片段可能会是这样的:
"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
。
答
很可能是该领域的“角色”进行了分析。映射“样本”的定义应该确认它。 Terms aggregation
适用于未分析的字段。如果分析字段“角色”,则将其作为两个不同的词“研究”和“经理”保存在索引中。为了得到你想要的,你必须将字段“角色”改为未分析。有关更多信息,请参阅this。恐怕您无法动态地在您的映射中进行此更改。您需要使用更新的映射为所有文档重新编制索引,以使更改生效。
我刚刚注意到Elasticsearch记录中出现了一些奇怪的现象......角色在facet对象中。我们可以看到这个映射吗? – eemp