您的位置 首页 > 德语词汇

highlighting是什么意思?Aggregation

大家好,今天给各位分享highlighting是什么意思的一些知识,其中也会对Aggregation进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

highlighting是什么意思?Aggregation

某一天,你正在优哉悠哉的摸鱼,你的产品又来给你提需求:他想知道所有订单的平均价格,最大价格,,,等等各种指标,无奈的你只能再次开始了Google搜索。

bash复制代码DELETEorder\n\nPUTorder\n{\n"mappings":{\n"properties":{\n"id":{\n"type":"keyword"\n},\n"name":{\n"type":"keyword"\n},\n"price":{\n"type":"double"\n},\n"sales":{\n"type":"integer"\n},\n"type":{\n"type":"keyword"\n},\n"status":{\n"type":"keyword"\n},\n"createTime":{\n"type":"date"\n}\n}\n}\n}\n1.AggregationQuery

Elasticsearch除了致力于搜索以外,也提供了聚合实时分析数据的功能。如果把搜索比喻成大海捞针,那么聚合就是去分析大海中针的特性。因此,透过聚合,我们可以得到一个数据的概览,聚合能做到的是分析和总结全套的数据,而不是查找单个文档。

聚合查询允许我们向数据提出一些复杂的问题,虽然它的功能完全不同于搜索,但是他们其实使用了相同的数据结构,这表示聚合的执行速度很快,并且像是搜索一样,是近实时的。

由于聚合和搜索使用的一样的数据结构,因此聚合和搜索是可以一起执行的。我们可以在一次json请求中,同时对相同的数据进行搜索/过滤+分析。

Elasticsearch中的聚合类型主要有三种:

提供求和,求平均值等数学运算,可以对字段进行统计分析。

对满足特定条件的文档进行分组。例如人类可以按照性别分为男性,女性,中性。

对其他聚合输出的结果进行再次聚合。

聚合的两个重要概念分别是桶Bucket和指标Metric。

AggregationTemplate

当Query和Aggs一起存在时,会先执行Query的主查询,主查询Query执行完后会搜出一批结果,而这些结果才会被Aggs拿去做聚合。

如果不在意查询结果是什么,只在意Aggs的结果,可以把size设置为0,这样可以让返回的hits结果集是0,加快返回速度。

一个Aggs查询里面可以有很多个聚合,每个聚合之间彼此都是独立的,因此可以一个聚合拿来统计数量,一个聚合拿来分析数据,一个聚合拿来分析计算标准差,,让一次搜索就可以把想要做的事情都做完。

另外,Aggs可以嵌套在其他的Aggs里面,而嵌套的桶能作用的文档集范围,是外层的桶所输出的结果集。

bash复制代码GETorder/_search?size=0\n{\n"aggs":{\n"type_aggs":{\n"terms":{\n"field":"type",\n"size":100\n}\n},\n"status_aggs":{\n"terms":{\n"field":"status",\n"size":100\n},\n"aggs":{\n"sales_aggs":{\n"terms":{\n"field":"name",\n"size":100\n}\n}\n}\n}\n}\n}\n2.MetricAggregation2.1avgaggregation

求所有订单的平均价格。

bash复制代码GETorder/_search?size=0\n{\n"aggs":{\n"avg_price":{\n"avg":{\n"field":"price"\n}\n}\n}\n}\n

missing参数定义了如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有某个值。

bash复制代码GETorder/_search?size=0\n{\n"aggs":{\n"avg_price":{\n"avg":{\n"field":"price",\n"missing":10\n}\n}\n}\n}\n

在"price"字段没有值的文档将与具有值为10的文档落入同一个桶中。换句话说,这些文档在聚合操作中被视为具有值为10的桶。

他的作用类似于SQL中的distinctcount。统计订单有多少种类型。

bash复制代码GETorder/_search?size=0\n{\n"aggs":{\n"type_count":{\n"cardinality":{\n"field":"type"\n}\n}\n}\n}\n2.3max&minaggregation

max聚合是一种单值指标聚合,它返回从聚合文档中提取的数值中的最大值。min聚合是一种单值指标聚合,它返回从聚合文档中提取的数值中的最小值。

min和max聚合操作的是数据的双精度表示。因此,当在绝对值大于2^53的长整型数据上运行时,结果可能是近似的。

bash复制代码GETorder/_search?size=0\n{\n"aggs":{\n"max_sales":{\n"max":{\n"field":"sales"\n}\n}\n}\n}\n

bash复制代码GETorder/_search?size=0\n{\n"aggs":{\n"min_sales":{\n"min":{\n"field":"sales"\n}\n}\n}\n}\n2.4statsaggregation

statsaggregation是一个多值度量聚合,它计算从聚合文档中提取的数值的统计信息。

返回的统计信息包括:最小值(min)、最大值(max)、总和(sum)、计数(count)和平均值(avg)。

bash复制代码GET/order/_search?size=0\n{\n"aggs":{\n"stats_price":{\n"stats":{\n"field":"price"\n}\n}\n}\n}\n

返回结果:

json复制代码{\n"aggregations":{\n"stats_price":{\n"count":3,\n"min":66.6,\n"max":3000.0,\n"avg":1063.2,\n"sum":3189.6\n}\n}\n}\n2.5sumaggregation

sumaggregation聚合是一个单值指标聚合,它对从聚合文档中提取的数值进行求和。

bash复制代码GET/order/_search?size=0\n{\n"aggs":{\n"sum_price":{\n"sum":{\n"field":"price"\n}\n}\n}\n}\n2.6valuecountaggregation

valuecountaggregation是一个单值指标聚合,用于计算从聚合文档中提取的数值的数量。这些数值可以从文档中的特定字段提取,也可以通过提供的脚本生成。通常情况下,该聚合器会与其他单值聚合器一起使用。例如,在计算平均值时,可能会对计算平均值的数值数量感兴趣。

value_count不会对值进行去重,因此即使一个字段存在重复值,每个值都将被单独计数。

bash复制代码GET/order/_search?size=0\n{\n"query":{\n"term":{\n"type":{\n"value":"clothes"\n}\n}\n},\n"aggs":{\n"types_count":{"value_count":{"field":"type"}}\n}\n}\n2.7topmetricaggregation

topmetricaggregation根据具有最大或最小的"sort"值的文档选择指标。

bash复制代码#销量最大的订单的价格\nGET/order/_search?size=0\n{\n"aggs":{\n"tm":{\n"top_metrics":{\n"metrics":{"field":"price"},\n"sort":{"sales":"desc"}\n}\n}\n}\n}\n2.8tophitsaggregation

top_hitsaggregation跟踪被聚合的最相关文档。该聚合器旨在作为子聚合器使用,以便可以按桶对顶部匹配的文档进行聚合。

top_hitsaggregation可以通过桶聚合器有效地按照某些字段对结果集进行分组。

每个桶返回的最大匹配结果数。默认情况下,返回前三个匹配结果。

指定如何对顶部匹配结果进行排序。默认情况下,按照主查询的分数进行排序。

top_hits聚合返回常规的搜索结果,因此它支持许多针对每个结果的功能,包括:

提供有关匹配度得分的详细信息。

指定要在搜索结果中返回的特定字段。

根据需要过滤返回结果中的源文档字段。

在索引时将字段存储在磁盘上,可以在搜索结果中返回这些字段。

通过执行脚本来生成结果中的自定义字段。

包含版本信息(Includeversions)

在搜索结果中包含每个文档的版本号。

包含序列号和主要项(IncludeSequenceNumbersandPrimaryTerms)

在搜索结果中包含每个文档的序列号和主要项。

这些功能可以让你根据需要对搜索结果进行进一步处理和分析。

如果你只需要使用docvalue_fields、size和sort这些参数,那么TopMetrics可能是比TopHitsAggregation更高效的选择。

ForExample:按状态对订单进行分组,并对每种状态显示最后一个订单。对于每个订单,只有日期,名字和价格字段被包含在源中。

bash复制代码GET/order/_search?size=0\n{\n"aggs":{\n"top_tags":{\n"terms":{\n"field":"status",\n"size":3\n},\n"aggs":{\n"top_sales_hits":{\n"top_hits":{\n"sort":[\n{\n"createTime":{\n"order":"desc"\n}\n}\n],\n"_source":{\n"includes":["createTime","price","name"]\n},\n"size":1\n}\n}\n}\n}\n}\n}\n

响应结果:

json复制代码{\n"aggregations":{\n"top_tags":{\n"doc_count_error_upper_bound":0,\n"sum_other_doc_count":0,\n"buckets":[\n{\n"key":"已付款",\n"doc_count":1,\n"top_sales_hits":{\n"hits":{\n"total":{\n"value":1,\n"relation":"eq"\n},\n"max_score":null,\n"hits":[\n{\n"_index":"order",\n"_type":"_doc",\n"_id":"2",\n"_score":null,\n"_source":{\n"createTime":"2023-02-12",\n"price":123,\n"name":"xiongzhao"\n},\n"sort":[\n1676160000000\n]\n}\n]\n}\n}\n},\n{\n"key":"已完成",\n"doc_count":1,\n"top_sales_hits":{\n"hits":{\n"total":{\n"value":1,\n"relation":"eq"\n},\n"max_score":null,\n"hits":[\n{\n"_index":"order",\n"_type":"_doc",\n"_id":"1",\n"_score":null,\n"_source":{\n"createTime":"2023-01-11",\n"price":66.6,\n"name":"kuchazi"\n},\n"sort":[\n1673395200000\n]\n}\n]\n}\n}\n},\n{\n"key":"待收货",\n"doc_count":1,\n"top_sales_hits":{\n"hits":{\n"total":{\n"value":1,\n"relation":"eq"\n},\n"max_score":null,\n"hits":[\n{\n"_index":"order",\n"_type":"_doc",\n"_id":"3",\n"_score":null,\n"_source":{\n"createTime":"2023-03-16",\n"price":3000,\n"name":"heisi"\n},\n"sort":[\n1678924800000\n]\n}\n]\n}\n}\n}\n]\n}\n}\n}\n2.9stringstatsaggregation

字符串统计聚合是一种多值度量聚合,用于计算从聚合文档中提取的字符串值的统计信息。这些值可以从特定的关键字字段中检索。

bash复制代码GET/order/_search?size=0\n{\n"aggs":{\n"message_stats":{\n"string_stats":{\n"field":"type"\n}\n}\n}\n}\n

响应结果:

json复制代码{\n"aggregations":{\n"message_stats":{\n"count":3,\n"min_length":7,\n"max_length":7,\n"avg_length":7.0,\n"entropy":2.8073549220576046\n}\n}\n}\n3.BucketAggregation

search.max_buckets集群设置限制了单个响应中允许的桶数量。这个设置的目的是为了防止聚合操作生成过多的桶,从而消耗过多的内存和计算资源。默认情况下,search.max_buckets的值为10000。如果聚合操作生成的桶数量超过了这个限制,Elasticsearch将会返回一个异常,并提示超过了最大桶数限制。可以根据需要调整search.max_buckets的值来平衡聚合操作的需求和系统资源的消耗。

termsaggregation针对某一个fields的值进行分组,field有几种值就分成几组。

terms桶在进行分组时,会为此field中的每一种值创建一个新桶。这里的terms桶和用于主查询的query种的查找terms是不同的概念。

bash复制代码GET/order/_search?size=0\n{\n"aggs":{\n"status_terms":{\n"terms":{\n"field":"status"\n}\n}\n}\n}\n

默认情况下,terms聚合将按照文档数量(doc_count)的顺序返回前十个terms的桶。可以通过设置size参数来更改这种默认行为。

字段可以是关键字(Keyword)、数值(Numeric)、IP地址(ip)、布尔值(boolean)或二进制(binary)类型的字段。根据字段的类型,terms聚合将对其进行分桶和聚合计算。例如,对于keyword字段,terms聚合将根据每个唯一的关键字值创建一个桶,并计算每个桶中文档的数量等聚合指标。

默认情况下,无法在text类型的字段上运行terms聚合。可以使用keyword子字段(keywordsub-field)代替。或者可以在text类型字段上启用fielddata以创建该字段分析后的terms的桶。启用fielddata可能会显著增加内存使用量。

filteraggregation一个用来过滤的桶。

此处的filter桶和用在主查询的query的过滤桶用法是一模一样的,都是过滤。不过差别是filter桶会自己创建一个新桶,而不会像filter依附在query下。因为filter桶毕竟还是一个聚合桶,因此他可以和别的桶进行嵌套,但是他不是依附在别的桶上。

ForExample:求所有订单的平均价格和"衣服类订单"的平均价格。

bash复制代码GET/order/_search?size=0&filter_path=aggregations\n{\n"aggs":{\n"avg_price":{"avg":{"field":"price"}},\n"clothes_avg_price":{\n"filter":{"term":{"type":"clothes"}},\n"aggs":{\n"avg_price":{"avg":{"field":"price"}}\n}\n}\n}\n}\n

响应结果:

json复制代码{\n"aggregations":{\n"clothes_avg_price":{\n"doc_count":3,\n"avg_price":{\n"value":1063.2\n}\n},\n"avg_price":{\n"value":1063.2\n}\n}\n}\n

为了限制搜索中所有聚合扫描的文档数量,使用ToplevelQuery,比使用包含子聚合的单个过滤聚合更快。

bash复制代码GET/order/_search?size=0&filter_path=aggregations\n{\n"query":{\n"term":{\n"type":"clothes"\n}\n},\n"aggs":{\n"avg_price":{\n"avg":{\n"field":"price"\n}\n}\n}\n}\n3.3filtersaggregation

一个多桶聚合,其中每个桶包含与查询匹配的文档。

bash复制代码PUT/logs/_bulk?refresh\n{"index":{"_id":1}}\n{"body":"warning:pagecouldnotberendered"}\n{"index":{"_id":2}}\n{"body":"authenticationerror"}\n{"index":{"_id":3}}\n{"body":"warning:connectiontimedout"}\n\nGETlogs/_search\n{\n"size":0,\n"aggs":{\n"messages":{\n"filters":{\n"filters":{\n"errors":{\n"match":{\n"body":"error"\n}\n},\n"warnings":{\n"match":{\n"body":"warning"\n}\n}\n}\n}\n}\n}\n}\n

上面的SQL,我们分析日志消息。该聚合将构建两个日志消息的集合(桶),一个包含所有包含错误的消息,另一个包含所有包含警告的消息。

json复制代码{\n"aggregations":{\n"messages":{\n"buckets":{\n"errors":{\n"doc_count":1\n},\n"warnings":{\n"doc_count":2\n}\n}\n}\n}\n}\n

filters字段也可以作为一个过滤器数组提供。

bash复制代码GETlogs/_search\n{\n"size":0,\n"aggs":{\n"messages":{\n"filters":{\n"filters":[\n{\n"match":{\n"body":"error"\n}\n},\n{\n"match":{\n"body":"warning"\n}\n}\n]\n}\n}\n}\n}\n\n

响应结果的桶排序和请求的条件排序是一一对应的。

json复制代码{\n"aggregations":{\n"messages":{\n"buckets":[\n{\n"doc_count":1\n},\n{\n"doc_count":2\n}\n]\n}\n}\n}\nOtherbucket

other_bucket参数可以设置为在响应中添加一个桶,该桶将包含所有不匹配给定过滤器的文档。该参数的值可以如下所示:

other_bucket_key参数用于将其他桶的键设置为除默认值"other"以外的其他值。设置此参数将隐式将other_bucket参数设置为true。

bash复制代码PUTlogs/_doc/4?refresh\n{\n"body":"info:userBobloggedout"\n}\n\nGETlogs/_search\n{\n"size":0,\n"aggs":{\n"messages":{\n"filters":{\n"other_bucket_key":"other_messages",\n"filters":{\n"errors":{\n"match":{\n"body":"error"\n}\n},\n"warnings":{\n"match":{\n"body":"warning"\n}\n}\n}\n}\n}\n}\n}\n

响应结果:

json复制代码{\n"aggregations":{\n"messages":{\n"buckets":{\n"errors":{\n"doc_count":1\n},\n"warnings":{\n"doc_count":2\n},\n"other_messages":{\n"doc_count":1\n}\n}\n}\n}\n}\n3.4rangeaggregation

这是一个基于多桶值源的聚合,允许用户定义一组范围,每个范围代表一个桶。在聚合过程中,从每个文档中提取的值将与每个桶范围进行比较,并将相关/匹配的文档放入相应的桶中。

该聚合包括每个范围的from值但不包括to值。

bash复制代码GETorder/_search\n{\n"size":0,\n"aggs":{\n"price_ranges":{\n"range":{\n"field":"price",\n"ranges":[\n{\n"to":100\n},\n{\n"from":100,\n"to":200\n},\n{\n"from":200\n}\n]\n}\n}\n}\n}\n\n

响应结果:

json复制代码{\n"aggregations":{\n"price_ranges":{\n"buckets":[\n{\n"key":"*-100.0",\n"to":100.0,\n"doc_count":1\n},\n{\n"key":"100.0-200.0",\n"from":100.0,\n"to":200.0,\n"doc_count":1\n},\n{\n"key":"200.0-*",\n"from":200.0,\n"doc_count":1\n}\n]\n}\n}\n}\n

将keyed标志设置为true将为每个桶关联一个唯一的字符串键,并将范围作为哈希而不是数组返回。

bash复制代码GETorder/_search\n{\n"size":0,\n"aggs":{\n"price_ranges":{\n"range":{\n"field":"price",\n"keyed":true,\n"ranges":[\n{\n"to":100\n},\n{\n"from":100,\n"to":200\n},\n{\n"from":200\n}\n]\n}\n}\n}\n}\n

也可以自己给每一个范围指定key。

bash复制代码GETorder/_search\n{\n"size":0,\n"aggs":{\n"price_ranges":{\n"range":{\n"field":"price",\n"keyed":true,\n"ranges":[\n{\n"key":"cheap",\n"to":100\n},\n{\n"key":"average",\n"from":100,\n"to":200\n},\n{\n"key":"expensive",\n"from":200\n}\n]\n}\n}\n}\n}\n3.5daterangeaggregation

日期范围聚合是专门针对日期值的聚合方式。与普通的范围聚合的主要区别在于,from和to值可以使用日期数学表达式表示,还可以指定日期格式,用于返回from和to的响应字段。

该聚合包含from值但不包含to值。

bash复制代码GET/order/_search?size=0\n{\n"aggs":{\n"range":{\n"date_range":{\n"field":"createTime",\n"format":"yyyy-MM-dd",\n"ranges":[\n{"to":"now-10M/M"},\n{"from":"now-10M/M"}\n]\n}\n}\n}\n}\n

在上面的示例中,我们创建了两个范围桶。第一个桶将把所有早于10个月前的文档分为一组,第二个桶将把所有晚于10个月前的文档分为一组。

如果格式或日期值不完整,日期范围聚合会用默认值替换任何缺失的组成部分。

HistogramAggregation可以对区间进行分组,但这个区间是固定间隔的。

bash复制代码GET/order/_search?size=0\n{\n"aggs":{\n"prices":{\n"histogram":{\n"field":"price",\n"interval":50\n}\n}\n}\n}\n3.7Compositeaggregation

使用composite聚合会带来一定的开销。在将composite聚合应用于生产环境之前,建议对应用程序进行负载测试,以评估性能和资源消耗情况。这样可以确保应用程序在使用composite聚合时具有足够的性能和可扩展性。

CompositeAggregation是一种多桶聚合,用于创建组合桶以支持分页和遍历聚合结果。它是一种有效的分页机制,适用于大型数据集和复杂的多级聚合情况。

Composite聚合可以从多个源(字段或脚本)提取或创建值,并将这些值的组合作为桶进行聚合。每个组合都被视为一个独立的桶,而且可以按照指定的排序顺序进行遍历和处理。

下面是一个示例,演示如何使用CompositeAggregation进行分页和遍历聚合结果。

bash复制代码GET/order/_search\n{\n"size":0,\n"aggs":{\n"composite_agg":{\n"composite":{\n"size":2,\n"sources":[\n{\n"type_aggs":{\n"terms":{\n"field":"type"\n}\n}\n},\n{\n"sales_aggs":{\n"histogram":{\n"field":"sales",\n"interval":10\n}\n}\n}\n]\n},\n"aggregations":{\n"avg_price":{\n"avg":{\n"field":"price"\n}\n}\n}\n}\n}\n}\n

在上面的SQL中,使用CompositeAggregation来分页并遍历数据。CompositeAggregation包含两个源:类型(terms桶)和销量(histogram桶)。我们设置了每页返回2个桶,并计算了每个桶中的平均价格(avg_price)。

通过这个聚合查询,可以按照类型和销量进行分页遍历结果。每次返回的结果集中会包含2个桶,每个桶都具有不同的类型和销量范围。同时还可以获取每个桶的平均售价。

在处理聚合结果时,可以使用after_key参数来指定下一页的起始位置。例如,如果想获取下一页的结果,可以将上一页结果中最后一个桶的after_key值作为新的请求参数。

使用CompositeAggregation可以灵活地分页和遍历聚合结果,无需一次性加载所有数据,对于处理大型数据集和复杂聚合非常有用。

bash复制代码GET/order/_search\n{\n"size":0,\n"aggs":{\n"composite_agg":{\n"composite":{\n"after":{\n"type_aggs":"clothes",\n"sales_aggs":80\n},\n"size":2,\n"sources":[\n{\n"type_aggs":{\n"terms":{\n"field":"type"\n}\n}\n},\n{\n"sales_aggs":{\n"histogram":{\n"field":"sales",\n"interval":10\n}\n}\n}\n]\n},\n"aggregations":{\n"avg_price":{\n"avg":{\n"field":"price"\n}\n}\n}\n}\n}\n}\n4.PipelineAggregations

ForExample:现在有这样一个需求,在销售量最好的2个订单里,找出平均价格最低的订单。

bash复制代码GET/order/_search\n{\n"aggs":{\n"best_order":{\n"terms":{\n"field":"id",\n"size":2,\n"order":{"sales_total":"desc"}\n},\n"aggs":{\n"sales_total":{\n"sum":{"field":"sales"}\n},\n"avg_price":{\n"avg":{"field":"price"}\n}\n}\n},\n"min_avg_price":{\n"min_bucket":{\n"buckets_path":"best_order>avg_price"\n}\n}\n},\n"size":0\n}\n\n#结果\n{\n"aggregations":{\n"best_order":{\n"doc_count_error_upper_bound":0,\n"sum_other_doc_count":1,\n"buckets":[\n{\n"key":"3",\n"doc_count":1,\n"sales_total":{\n"value":10000.0\n},\n"avg_price":{\n"value":3000.0\n}\n},\n{\n"key":"1",\n"doc_count":1,\n"sales_total":{\n"value":88.0\n},\n"avg_price":{\n"value":66.6\n}\n}\n]\n},\n"min_avg_price":{\n"value":66.6,\n"keys":[\n"1"\n]\n}\n}\n}\n\n

如上示例,在"best_order"中我们做了以下几件事:

最终在"best_order"中我们得出了销量最多的两个订单和它们书本的平均售价、销售总量。

最后使用PipelineAggregations找出平均售价最低的订单即可。上面的示例是一个简单的例子,"min_avg_price"是我们指定的名字,使用"min_bucket"求出之前结果的最小值,并且通过"buckets_path"关键字来指定路径,例子中我们的路径为"best_order"下的"avg_price"。

通过上面的例子可以看到Pipelineaggregations提供的功能了。Pipeline分析的结果会输出到原查询的结果中,根据位置的不同可以分为两类:

当设置了size参数时,结果列表可能不是完全准确的Topsize个terms桶,而是一个近似的结果。这是由于在分片级别上计算和返回terms桶,然后在协调节点上进行汇总和处理的过程中可能会存在轻微的不准确性。

如果想检索所有terms或所有terms的组合,而不是在terms聚合中设置一个大于字段的基数的size值,应该使用Compositeaggregation。Compositeaggregation允许对所有可能的terms进行分页,而不仅仅返回顶部的terms。termsaggregation旨在返回Topterms,不支持分页功能。

请求的size参数越大,结果的准确性就越高,但计算最终结果的成本也越高(由于在分片级别管理更大的优先级队列和节点与客户端之间更大的数据传输)。

为了减少更大请求大小所带来的额外工作量,可以使用shard_size参数。当定义了shard_size参数时,它将确定协调节点从每个分片请求的terms数。一旦所有分片都响应,协调节点将它们缩减为最终结果,该结果基于size参数。通过这种方式,可以提高返回的terms的准确性,并避免将大量的bucket流式传输回客户端所带来的开销。

shard_size参数不能小于size参数(因为这没有太多意义)。当shard_size小于size时,Elasticsearch会将其覆盖并重置为与size相等。默认的shard_size=(size*1.5+10)。

doc_count值对于terms聚合可能是近似值。因此,对于terms聚合的任何子聚合也可能是近似值。

为了计算doc_count值,每个分片提供其自己的Topterms和文档计数。聚合将这些分片级别的结果合并以计算其最终的doc_count值。为了衡量doc_count值的准确性,聚合结果包括以下属性:

(整数)除了返回结果中的terms外,其他没有返回的terms的文档数量之和。

(整数)没有在本次聚合返回的分组中,包含文档数的可能最大值的和。如果是0,说明聚合结果是准确的。

设置show_term_doc_count_error为true以获取每个terms的doc_count_error_upper_bound值。

bash复制代码GET/_search\n{\n"aggs":{\n"products":{\n"terms":{\n"field":"product",\n"size":5,\n"show_term_doc_count_error":true\n}\n}\n}\n}\n

这将显示聚合返回的每个term的错误值,该值表示文档计数中的最坏情况错误,并在确定shard_size参数的值时可能会有用。计算方法是对所有未返回该term的分片的最后一个term的文档计数求和。

只有在按照文档计数的降序对term进行排序时,才能以这种方式计算这些错误。当聚合按term值本身(无论是升序还是降序)排序时,文档计数中没有错误,因为如果一个分片不返回另一个分片的结果中出现的特定term,那么它的索引中就不包含该term。当聚合按照子聚合进行排序或按升序文档计数顺序排序时,无法确定文档计数的错误,并将其赋予值-1以表示此情况。

可以通过设置order参数来自定义桶的顺序。默认情况下,桶按照doc_count降序排序。

不建议按升序排序_count或按子聚合排序,因为这会增加文档计数的误差。当查询单个分片或在索引时使用的字段作为路由键时,这是可以接受的:在这些情况下,结果将是准确的,因为分片具有不重叠的值。否则,错误是无限制的。一个特殊的情况仍然可能有用,即按最小或最大聚合排序:计数可能不准确,但至少可以正确选择顶部的桶。

OK,本文到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023