具有多个排除项的 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实例进行日志聚合吗?