【问题标题】:Excluding inner hits from top hits aggregation with source filter使用源过滤器从热门点击聚合中排除内部点击
【发布时间】:2019-12-20 03:24:15
【问题描述】:

在我的查询中,我使用inner_hits 返回与我的查询匹配的嵌套对象列表。

然后我为我的文档的 categoryId 添加一个聚合,然后添加一个热门聚合以获取该类别的显示名称。

"aggs": {
  "category": {
    "terms": {
      "field": "categoryId",
      "size": 100
    },
    "aggs": {
      "category_value": {
        "top_hits": {
          "size": 1,
          "_source": {
            "includes": "categoryName"
          }
        }
      }
    }
  }
}

现在,当我查看聚合存储桶时,我确实得到了一个只有 categoryName 属性的 _source 文档,但我也得到了整个 inner_hits 集合:

{
    ...
    "_source": {
        "categoryName": "Armchairs"
    },
    "inner_hits": {
        "my_inner_hits": {
            "hits": {
                "total": 260,
                "max_score": null,
                "hits": [{
                        ...
                        "_source": {
                            //nested document here
                        }
                    }
                ]
            }
        }
    }
}

有没有办法不将inner_hits 数据包含在top_hits 聚合中?

【问题讨论】:

  • 您好,请您添加您的整个查询和一些示例文档,好吗?很难理解你想要达到的目标。

标签: elasticsearch


【解决方案1】:

既然你只需要一个字段,我建议你做的是摆脱top_hits聚合并使用另一个terms聚合作为名称:

{
  ...
  "aggs": {
    "category": {
      "terms": {
        "field": "categoryId",
        "size": 100
      },
      "aggs": {
        "category_value": {
          "terms": {
            "field": "categoryName",
            "size": 1
          }
        }
      }
    }
  }
}

这样也会更有效率。

更新

继续使用terms/top_hits 的另一种方法是利用response filtering 并仅返回您需要的内容。例如,将此附加到您的 URL 将确保您不会在聚合中找到任何内部命中

?filter_path=hits.hits,aggregations.**.key,aggregations.**.doc_count,aggregations.**.hits.hits.hits._source

【讨论】:

  • 感谢您的建议。这是一个简化的示例,所以我想知道如果我需要 top_hit 中的 10 个字段,效率会有多高?
  • 我会说这将是一个不同的用例。你的到底是什么?
  • 我们有一个产品索引,其中每个产品文档都有一个嵌套变体列表。当我进行查询时,我使用 inner_hits 来了解哪些变体实际上与我的查询匹配。现在,如果我创建一个 top_hit 聚合,那么 inner_hits 将始终是该 top_hit 的一部分,如果聚合中有很多项,这会大大增加响应的大小。
  • 是的,我理解那部分。我建议的解决方案可以解决这个问题。
  • 好吧,为我想要从 top_hit 中的每个字段添加另一个术语聚合并不能很好地扩展。如果我想从一个变体中获取 20 个字段,那么我需要 20 个术语聚合吗?
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多