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

时间:2014-04-01 20:24:43

标签: elasticsearch

我在ES数据库中有一堆公司数据。我想要计算每个文件中出现的文件的数量,但是我在聚合查询时遇到了一些问题。我希望排除诸如“公司”或“公司”之类的术语到目前为止,我已经能够按照以下代码一次成功完成一个任期。

{
    "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),我对此犹豫不决

2 个答案:

答案 0 :(得分:11)

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

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

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

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

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

答案 1 :(得分:0)

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

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

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