当前位置: 首页 > 知识库问答 >
问题:

应用聚合后过滤elasticsearch中的术语聚合桶

段干跃
2023-03-14

以下是数据集的快照:

recordNo    employeeId      employeeStatus   employeeAddr
1           employeeA       Permanent   
2           employeeA                         ABC
3           employeeB       Contract    
4           employeeB                         CDE

我想获得员工名单以及employeeStatus和employeeAddr。

所以我在employeeId上使用术语聚合,然后使用employeeStatus和employeeAddr的子聚合来获得这些详细信息。下面的查询正确返回结果。

{
    "aggregations": {
        "Employee": {
            "terms": {
                "field": "employeeID"
            
            },
            "aggregations": {
                "employeeStatus": {
                    "terms": {"field": "employeeStatus"}
                },
                "employeeAddr": {
                    "terms": {"field": "employeeAddr"}
                }
            }
        }
    }
}
        

现在我只想要永久身份的员工。所以我正在应用过滤器聚合。

{
    "aggregations": {
        "filter_Employee_employeeID": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "employeeStatus": {"query": "Permanent"}
                            }
                        }
                    ]
                }
            },
            "aggregations": {
                "Employee": {
                    "terms": {
                        "field": "employeeID"
                    },
                    "aggregations": {
                        "employeeStatus": {
                            "terms": {"field": "employeeStatus"}
                        },
                        "employeeAddr": {
                            "terms": {"field": "employeeAddr"}
                        }
                    }
                }
            }
        }
    }    

}

现在的问题是雇员地址聚合没有为雇员地址返回存储桶,因为记录2在聚合完成之前就被过滤掉了。

假设我无法修改数据集,并且我希望通过单个弹性查询获得结果,那么我该如何做呢?

我检查了Bucket选择器管道聚合,但它只适用于度量聚合。应用聚合后,是否有方法过滤掉术语存储桶?

共有1个答案

夏侯楷
2023-03-14

如果我理解正确,即使使用某种过滤器,您也希望保留聚合。要实现这一点,请尝试使用post\u filter子句。

你可以在这里查看文档

该子句应用于聚合的“外部”。使用您的示例,应该如下所示:

{
  "aggregations": {
    "filter_Employee_employeeID": {
      "aggregations": {
        "Employee": {
          "terms": {
            "field": "employeeID"
          },
          "aggregations": {
            "employeeStatus": {
              "terms": {
                "field": "employeeStatus"
              }
            },
            "employeeAddr": {
              "terms": {
                "field": "employeeAddr"
              }
            }
          }
        }
      }
    }
  },
  "post_filter": {
    "bool": {
      "must": [
        {
          "match": {
            "employeeStatus": {
              "query": "Permanent"
            }
          }
        }
      ]
    }
  }
}
 类似资料:
  • 问题内容: 我正在尝试使用以下查询对以下数据进行elasticsearch来执行术语聚合,输出将名称分解为标记(请参见下面的输出)。因此,我尝试将os_name映射为multi_field,但现在无法通过它查询。是否可以有没有令牌的索引?例如“ Fedora Core”? 查询: 数据: 输出: 映射: 问题答案: 实际上,您应该像这样更改映射 并且您的aggs应该更改为:

  • 我们目前正在开发一个多语言文档CMS。因此,我们有翻译成不同语言的文件。 对于使用Elasticsearch进行搜索,我们目前使用每种语言(德语、英语、法语……)一个索引,其中同一文档的所有翻译共享相同的ID。 当用户搜索特定术语时,我们希望在所有语言中搜索,但只返回不同ID的列表。据我所知,只有使用以下术语聚合才能做到这一点: 这很好,但是作为弹性搜索文档https://www.elastic.

  • 问题内容: 我有两种日志消息: 第一个消息是已发送消息的类型,第二个消息是确认消息已传递的消息。 它们之间的区别是后缀,我已将其与“ id”分开并可以对其进行查询。 这些消息将按以下格式解析并存储在elasticsearch中: 我想找出哪些消息已成功发送,哪些没有成功。我是Elasticsearch的初学者,所以我真的很努力。 我目前正在尝试术语聚合,但是我所能实现的就是以下代码: 向我显示已发

  • 我有一个存储字符串数组的字段。不同的文档包含不同的字符串集。 现在,我使用这个聚合查询来分析每个文件类型的使用情况。 结果与预期一致。但最近我在删除XML文件支持后更新了此字段。因此,文档的non具有文件类型XML。我可以从这个查询中确认这一点。 总命中计数为零。奇怪的是,当我再次执行上述聚合查询时,我仍然可以将XML视为一个术语。doc count为零。 如果这个XML术语在任何文档中都不存在,

  • 我想根据top hits聚合中第一个元素所拥有的属性,从terms聚合中订购Bucket。 我的尽力而为查询如下(有语法错误): 有人知道如何做到这一点吗? 例子: 按“a”分组,按“id”(desc)排序存储桶,并按“b”(desc)排序最热门的内容,将给出:

  • 不知道如何表达这个问题。我正在使用Elasticsearch 2.2。 让我们从数据集的一个示例开始,该数据集由5个文档组成: 被调用的\u实体始终具有uuid。coverage\u实体可以为空,也可以具有uuid。 我使用脚本在任何一个被调用的\实体上进行聚合。uuid或coverage\u实体。uuid: 现在,聚合已经从任一头生成了术语。调用了\u实体。uuid或标头。coverage\u实