期限汇总值

问题描述:

我有一个使用期限聚合的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 
     }, 
     ... 
] 
.... 

我做错了什么?有没有办法做到这一点?

+0

我刚刚注意到Elasticsearch记录中出现了一些奇怪的现象......角色在facet对象中。我们可以看到这个映射吗? – eemp

正如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。恐怕您无法动态地在您的映射中进行此更改。您需要使用更新的映射为所有文档重新编制索引,以使更改生效。