具有多个排除项的 Elasticsearch 聚合查询

Posted

技术标签:

【中文标题】具有多个排除项的 Elasticsearch 聚合查询【英文标题】:Elasticsearch Aggregation Query with multiple excludes 【发布时间】:2014-05-12 20:00:44 【问题描述】:

我在 ES 数据库中有一堆公司数据。我希望统计每家公司出现的文档数量,但aggregation 查询存在一些问题。我希望排除诸如“公司”或“公司”之类的术语。到目前为止,我已经能够按照下面的代码一次成功地完成一个学期。


    "aggs" : 
        "companies" : 
            "terms" : 
                "field" : "Companies.name",
                "exclude" : "corporation"
            
        
    

返回

"aggregations": 
    "assignee": 
         "buckets": [
            
               "key": "inc",
               "doc_count": 375
            ,
            
               "key": "company",
               "doc_count": 252
            
         ]
     

理想情况下,我希望能够做类似的事情


    "aggs" : 
        "companies" : 
            "terms" : 
                "field" : "Companies.name",
                "exclude" : ["corporation", "inc.", "inc", "co", "company", "the", "industries", "incorporated", "international"],
            
        
    

但我一直没能找到一种不会引发错误的方法

我查看了 ES 文档中聚合的“术语”部分,只能找到单个排除的示例。我想知道是否可以排除多个术语,如果可以,正确的语法是什么所以。

注意:我知道我可以将该字段设置为“not_analyzed”并获取完整公司名称的分组,而不是拆分名称。但是,我犹豫要不要这样做,因为分析允许存储桶更容忍名称变化(即 Microsoft Corp 和 Microsoft Corporation)

【问题讨论】:

仅供参考,这已从 ES 1.5 开始实施。有关更多信息,请参阅此问题:github.com/elastic/elasticsearch/issues/11959 【参考方案1】:

exclude parameter is a regular expression,因此您可以使用一个正则表达式来详尽列出所有选项:

"exclude" :
    "corporation|inc\\.|inc|co|company|the|industries|incorporated|international"

一般来说,转义值很重要(例如,.)。如果它不是一般生成的,那么您可以通过对它们进行分组来简化其中的一些(例如,inc\\.? 覆盖inc\\.|inc,或更复杂的:co(mpany|rporation)?)。如果这会运行很多,那么可能值得测试增加的复杂性如何影响性能。

还有可选的flags可以应用,它们是JavaPattern中存在的选项。可能会派上用场的是CASE_INSENSITIVE

"exclude" : 
    "pattern" : "...expression as before...",
    "flags" : "CASE_INSENSITIVE"

【讨论】:

【参考方案2】:

这是一个老问题,但更新的答案:exclude 列表项的精确匹配当前支持数组

因此 OP 中的数组语法现在是有效的并且可以按预期工作(除了有效的正则表达式答案之外)

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_filtering_values_with_exact_values

【讨论】:

以上是关于具有多个排除项的 Elasticsearch 聚合查询的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 从复合聚合中排除键

我可以在同一台机器上运行多个elasticsearch实例进行日志聚合吗?

具有 .every() 等效项的 Mongoose 聚合

Elasticsearch 多个聚合或术语和同一列上的聚合

具有 after_key 和 size 的 ElasticSearch 复合聚合

跨多个索引的多个字段上的 Elasticsearch 聚合