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

dro*_*ode 8 filter elasticsearch elasticsearch-aggregation

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

{
    "aggs" : {
        "companies" : {
            "terms" : {
                "field" : "Companies.name",
                "exclude" : "corporation"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个回报

"aggregations": {
    "assignee": {
         "buckets": [
            {
               "key": "inc",
               "doc_count": 375
            },
            {
               "key": "company",
               "doc_count": 252
            }
         ]
     }
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "aggs" : {
        "companies" : {
            "terms" : {
                "field" : "Companies.name",
                "exclude" : ["corporation", "inc.", "inc", "co", "company", "the", "industries", "incorporated", "international"],
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我查看了ES文档中聚合的"术语"部分,并且只能找到单个排除的示例.我想知道是否可以排除多个术语,如果是,那么这样做的正确语法是什么.

注意:我知道我可以将字段设置为"not_analyzed"并获取完整公司名称的分组,而不是拆分名称.但是,由于分析允许存储桶更容忍名称变化(即微软公司和微软公司),我对此犹豫不决.

pic*_*ypg 11

exclude参数是一个正则表达式,因此您可以使用一个穷举列出所有选项的正则表达式:

"exclude" :
    "corporation|inc\\.|inc|co|company|the|industries|incorporated|international"
Run Code Online (Sandbox Code Playgroud)

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

flags可以应用可选项,这些是Java中存在的选项Pattern.可能派上用场的是CASE_INSENSITIVE.

"exclude" : {
    "pattern" : "...expression as before...",
    "flags" : "CASE_INSENSITIVE"
}
Run Code Online (Sandbox Code Playgroud)