【问题标题】:Elasticsearch filter data by selected aggregations valueElasticsearch 按选定的聚合值过滤数据
【发布时间】:2019-03-03 04:09:10
【问题描述】:

我必须在个人资料集合中搜索,每个个人资料都有名字、中间名和姓氏、性别键。

我添加了关于性别的术语聚合,这将返回男性和女性的计数。 我正在使用简单的搜索(纯文本)查询来查找整个文档。当我使用查询作为查询字符串参数时,来自帖子正文的查询对象不起作用。我想显示通过纯文本查询返回的配置文件列表,用户可以选择性别过滤器来过滤结果。

我的问题是我应该在哪里使用哪个过滤器选项,以便在应用过滤器后根据查询和文档获得聚合结果。

我尝试使用全局聚合,但它忽略了查询。我尝试在聚合中使用过滤器,但那是过滤聚合。

例如:

如果http://localhost:9200/profiles/_search?q=dlinx 带有正文

{
    "aggs": {
       "Gender": {
        "terms": {
          "field": "gender"
        }
      }
    }
}

返回聚合结果为男性:10,女性:15,然后文档计数为 25。将性别过滤器应用为男性后,我期望结果为男性:10,女性:15,文档计数为 15

【问题讨论】:

  • 您希望过滤器只应用于查询而不是聚合,对吧?

标签: elasticsearch


【解决方案1】:

您正在搜索帖子过滤器 =D

在聚合计数“完成”后仅应用于过滤命中的过滤器。

Here is the documentation

post_filter 应用于搜索结果末尾的搜索结果 搜索请求,在已经计算聚合之后

您的 _search 正文应该是这样的:

GET profiles/_search
{
  "query": {
    "match": {
      "<yourfield>": "dlinx"
    }
  },
  "aggs": {
    "Gender": {
      "terms": {
        "field": "gender"
      }
    }
  },
  "post_filter": {
    "term": {
      "gender": "<theselectedGender>"
    }
  }
}

【讨论】:

  • 其实aggspost_filter 应该在query 部分之外。
  • 匹配后也要去掉悬空的逗号,否则 ES 会报错
  • 这正是我所尝试的,谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2016-12-04
  • 2015-09-17
相关资源
最近更新 更多