弹性搜索中的聚合+排序+分页

kum*_*mar 16 elasticsearch

我需要在其中一个索引中进行聚合+排序+分页.

我了解了弹性搜索的内部功能,

我有5个总分片,它将对各个分片进行排序并获取结果,默认情况下,每个分片将返回10个记录.然后再对50条记录进行排序,它将获取前10条记录,因为默认大小为10.

输出继电器:

聚合结果在名为"aggregations"的单独字段中返回.为了在此聚合数据中进行分页,大小和from不起作用.

厌倦了做termBuilder.size(500),现在根据这个链接的逻辑是不同的(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation .html)

这会导致数据不准确.

任何人都可以建议我如何处理聚合+分页.

Vik*_*mar 15

是的,可以分页+排序+搜索elasticsearch打开链接。Elasticsearch在 v6.X 及更高版本中支持Bucket Sort Aggregation 。bucket_sort使用terms/date_histogram存储桶中的所有记录并应用于该存储桶。因此,对于这种情况,我们必须保持存储桶大小足够大或大于存储桶记录,以便将所有可能的记录保留在存储桶中。示例如下...

{
    "aggs": {
        "aggs1": {
            "terms": {
                "field": "field_name.keyword",
                // We can do sort here also
                "size": 1000000  // Keep this size big integer. This keep all possible result in bucket
            },
            "aggs": {
                "bucket_sort": {
                    "bucket_sort": {                                 
                        "sort": [{
                            "_key": {
                                "order": "asc"
                            }
                        }],
                        // This "from" and "size" use above terms bucket size. it applies over available bucket data [This one give actual result]
                        // Bellow is standard pagination as we do
                        "from": 0,
                        "size": 10
                    }
                }
            }
        }
    },
    "size": 0
}
Run Code Online (Sandbox Code Playgroud)

  • 将大小设置得这么高是否会带来显着的性能成本? (2认同)

Nis*_*ant 13

在elasticsearch中,不可能对聚合进行分页.如果指定了大小,查询将不会给出准确的结果.因此,进行排序和分页的唯一方法是给出大小为0并返回所有文档,然后通过将所有结果累积到列表中以获得进一步操作来获得所需结果.

  • 只有使用from和size的命中才能进行分页.但是对于聚合,没有这种方法可以对准确的结果进行分页.如果指定聚合大小则不会给出准确的结果. (5认同)

Aka*_*abu 13

我认为Composite Aggregation可能会解决您的问题,因为它允许在聚合结果中进行分页。

请参考这个文档

  • 注意:复合聚合不允许像术语聚合那样任意排序(例如按文档计数、子聚合或多个条件排序)。 (4认同)
  • 复合聚合仅适用于术语、日期直方图和直方图聚合。但是,不能对值源进行子聚合。但它确实在很大程度上解决了问题。 (2认同)

Özg*_*çın 11

ElasticSearchBucket Sort Aggregation在 v6.1 及更高版本中支持。它允许聚合结果中的“排序”、“大小”和“来自”参数。

请参考这个文档

  • 注意:Bucket Sort 聚合仅适用于已从父聚合返回的存储桶,而不是整个集合。 (2认同)