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 中的术语聚合返回单词而不是完整字段值的存储桶的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch - 聚合返回 key 中的术语,但不是完整的字段,我怎样才能返回完整的字段?

Elasticsearch:从聚合中的存储桶访问值

Elasticsearch聚合初探——metric篇

Elasticsearch聚合初探——metric篇

elasticsearch 多词重要词聚合

使用术语聚合执行搜索时如何返回实际值(不是小写字母)?