【问题标题】:Filter/Query support in Elasticsearch Top hits AggregationElasticsearch 中的过滤/查询支持热门点击聚合
【发布时间】:2015-12-18 00:56:03
【问题描述】:

Elasticsearch 文档指出 The top_hits aggregation returns regular search hits, because of this many per hit features can be supported 至关重要的是,该列表包括 Named filters and queries

但尝试添加任何过滤器或查询会抛出 SearchParseException: Unknown key for a START_OBJECT

用例:我有包含嵌套 cmets 列表的项目

items{id} -> cmets {日期,评级}

我想在上周获得每个项目的最高评价。

{
 "query": {
   "match_all": {}
  },
  "aggs": {
    "items": {
      "terms": {
        "field": "id",
        "size": 10
      },
      "aggs": {
        "comment": {
          "nested": {
            "path": "comments"
          },
          "aggs": {
            "top_comment": {
              "top_hits": {
                "size": 1,
                //need filter  here to select only comments of last week
                "sort": {
                  "comments.rating": {
                    "order": "desc"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

那么是文档有误,还是有什么办法可以添加过滤器?

https://www.elastic.co/guide/en/elasticsearch/reference/2.1/search-aggregations-metrics-top-hits-aggregation.html

【问题讨论】:

  • 您能否发布您的查询以及一些示例文档和所需的输出?
  • @ChintanShah25 更新了问题

标签: elasticsearch


【解决方案1】:

您确定已将它们映射为Nested?我刚刚尝试对我的数据执行这样的查询,并且效果很好。

如果是这样,您可以简单地在嵌套聚合之后添加一个过滤器聚合(希望我没有弄乱大括号):

POST data/_search
{
  "size": 0,
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "nested": {
          "path": "comments",
          "query": {
            "range": {
              "comments.date": {
                "gte": "now-1w",
                "lte": "now"
              }
            }
          }
        }
      }
    }
  },
  "aggs": {
    "items": {
      "terms": {
        "field": "id",
        "size": 10
      },
      "aggs": {
        "nested": {
          "nested": {
            "path": "comments"
          },
          "aggs": {
            "filterComments": {
              "filter": {
                "range": {
                  "comments.date": {
                    "gte": "now-1w",
                    "lte": "now"
                  }
                }
              },
              "aggs": {
                "topComments": {
                  "top_hits": {
                    "size": 1,
                    "sort": {
                      "comments.rating": "desc"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

附:始终包含嵌套对象的完整路径。

所以这个查询将:

  1. 过滤具有小于一周的 cmets 的文档,以缩小文档的聚合范围并找到实际具有此类 cmets 的文档(过滤查询)
  2. 根据 id 字段进行术语聚合
  3. 打开嵌套子文档 (cmets)
  4. 按日期过滤
  5. 返回最坏的一个(评价最高)

【讨论】:

  • 我知道过滤器 agg 可以在热门点击之后使用,但问题是关于热门点击中的过滤器以及可能的错误文档。
  • @Summit 即使是这样,您也没有写出关于热门聚合中的过滤器的问题。您问如何在上周获得每个项目的最高评价 cmets。这就是这个查询要做的事情。
  • 有理由相信您在回答时错过了整个主题和问题的第一部分。即便如此,即使在被告知答案完全错过了所问的内容之后,您对它的持续误解还是相当令人反感的。
  • @Summit 引用你的话:文档是错误的,还是有什么方法可以添加过滤器?这是添加过滤器的唯一方法。就那么简单。您没有指定过滤器必须在热门点击聚合中。下次问清楚你的问题。
  • 您是否阅读了上述文档、主题或问题的前半部分,或除此行之外的任何内容?在下次回答之前先阅读问题/主题,或者更好的是,不要自己回答问题。无论如何,这种对话已经超出了理性的范围。
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2016-09-11
  • 2019-10-10
  • 2014-10-09
相关资源
最近更新 更多