我在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),我对此犹豫不决
答案 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中的数组语法现在有效并且按预期工作(除了有效的正则表达式回答之外)