草庐IT

Elasticsearch:Top metrics 聚合

Elastic 中国社区官方博客 2023-04-11 原文

top_metrics 聚合从文档中选择具有最大或最小排序值的 metrics。 例如,这会获取文档中 s 字段的最大值所对应的 m 字段的值:

POST /test/_bulk?refresh
{"index":{}}
{"s":1,"m":3.1415}
{"index":{}}
{"s":2,"m":1}
{"index":{}}
{"s":3,"m":2.71828}


POST /test/_search?filter_path=aggregations
{
  "aggs": {
    "tm": {
      "top_metrics": {
        "metrics": {
          "field": "m"
        },
        "sort": {
          "s": "desc"
        }
      }
    }
  }
}

上面的聚合返回的结果是:

{
  "aggregations": {
    "tm": {
      "top": [
        {
          "sort": [
            3
          ],
          "metrics": {
            "m": 2.718280076980591
          }
        }
      ]
    }
  }
}

s 字段的最大值为 3,而它对应的 m 值为 2.718280076980591。

top_metrics 在本质上与 top_hits 非常相似,但由于它受到更多限制,它能够使用更少的内存来完成它的工作,并且通常更快。

sort

metric 请求中的 sort 字段的功能与 search 请求中的 sort 字段完全相同,除了:

聚合返回的 metric 是搜索请求将返回的第一个命中。 所以,

"sort": {"s": "desc"}

        从具有最大 s 值的文档中获取 metric

"sort": {"s": "asc"}

        从具有最小 s 值的文档中获取 metric

"sort": {"_geo_distance": {"location": "POINT (-78.6382 35.7796)"}}

        位置最接近 35.7796, -78.6382 的文档中获取 metric

"sort": "_score"

        从得分最高的文档中获取 metric

metrics

metrics 选择要返回的 top 文档的字段。 你可以通过请求像 "metrics": [{"field": "m"} 或者以 "metrics": [{"field": "m"}, {"field": "i"} 的形式请求多个 metrics。metrics.field 支持如下的字段类型:

除 keywords 外,还支持对应类型的运行时字段(runtime fields)。 metrics.field 不支持具有数组值的字段。 数组值的 top_metric 聚合可能会返回不一致的结果。

以下示例对几种字段类型运行 top_metrics 聚合。

DELETE test
PUT /test
{
  "mappings": {
    "properties": {
      "d": {
        "type": "date"
      }
    }
  }
}
POST /test/_bulk?refresh
{"index":{}}
{"s":1,"m":3.1415,"i":1,"d":"2020-01-01T00:12:12Z","t":"cat"}
{"index":{}}
{"s":2,"m":1,"i":6,"d":"2020-01-02T00:12:12Z","t":"dog"}
{"index":{}}
{"s":3,"m":2.71828,"i":-12,"d":"2019-12-31T00:12:12Z","t":"chicken"}
POST /test/_search?filter_path=aggregations
{
  "aggs": {
    "tm": {
      "top_metrics": {
        "metrics": [
          {"field": "m"},
          {"field": "i"},
          {"field": "d"},
          {"field": "t.keyword"}
        ],
        "sort": {"s": "desc"}
      }
    }
  }
}

上面的聚合返回结果:

{
  "aggregations": {
    "tm": {
      "top": [
        {
          "sort": [
            3
          ],
          "metrics": {
            "m": 2.718280076980591,
            "i": -12,
            "d": "2019-12-31T00:12:12.000Z",
            "t.keyword": "chicken"
          }
        }
      ]
    }
  }
}

size

top_metrics 可以使用 size 参数返回前几个文档的 metrics 值:

DELETE test
POST /test/_bulk?refresh
{"index": {}}
{"s": 1, "m": 3.1415}
{"index": {}}
{"s": 2, "m": 1.0}
{"index": {}}
{"s": 3, "m": 2.71828}
POST /test/_search?filter_path=aggregations
{
  "aggs": {
    "tm": {
      "top_metrics": {
        "metrics": {
          "field": "m"
        },
        "sort": {
          "s": "desc"
        },
        "size": 3
      }
    }
  }
}

上面的聚合返回:

{
  "aggregations": {
    "tm": {
      "top": [
        {
          "sort": [
            3
          ],
          "metrics": {
            "m": 2.718280076980591
          }
        },
        {
          "sort": [
            2
          ],
          "metrics": {
            "m": 1
          }
        },
        {
          "sort": [
            1
          ],
          "metrics": {
            "m": 3.1414999961853027
          }
        }
      ]
    }
  }
}

默认大小为 1。最大默认大小为 10,因为聚合的工作存储是“密集”的,这意味着我们为每个存储桶分配大小槽。 10 是一个非常保守的默认最大值,如果需要,可以通过更改 top_metrics_max_size 索引设置来提高它。 但是要知道,大尺寸可能会占用相当多的内存,特别是如果它们位于聚合内部,这会使许多存储桶像大 terms aggregation 一样。 如果你想提高它,请使用以下内容:

PUT /test/_settings
{
  "top_metrics_max_size": 100
}

注意:如果 size 大于 1,则 top_metrics 聚合不能成为排序的目标。

示例

和 terms 一起使用

这种聚合在 terms 聚合中应该非常有用,例如,查找每个服务器报告的最后一个值。

PUT /node
{
  "mappings": {
    "properties": {
      "ip": {"type": "ip"},
      "date": {"type": "date"}
    }
  }
}
POST /node/_bulk?refresh
{"index":{}}
{"ip":"192.168.0.1","date":"2020-01-01T01:01:01","m":1}
{"index":{}}
{"ip":"192.168.0.1","date":"2020-01-01T02:01:01","m":2}
{"index":{}}
{"ip":"192.168.0.2","date":"2020-01-01T02:01:01","m":3}
POST /node/_search?filter_path=aggregations
{
  "aggs": {
    "ip": {
      "terms": {
        "field": "ip"
      },
      "aggs": {
        "tm": {
          "top_metrics": {
            "metrics": {
              "field": "m"
            },
            "sort": {
              "date": "desc"
            }
          }
        }
      }
    }
  }
}

上面的聚合返回:

{
  "aggregations": {
    "ip": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "192.168.0.1",
          "doc_count": 2,
          "tm": {
            "top": [
              {
                "sort": [
                  "2020-01-01T02:01:01.000Z"
                ],
                "metrics": {
                  "m": 2
                }
              }
            ]
          }
        },
        {
          "key": "192.168.0.2",
          "doc_count": 1,
          "tm": {
            "top": [
              {
                "sort": [
                  "2020-01-01T02:01:01.000Z"
                ],
                "metrics": {
                  "m": 3
                }
              }
            ]
          }
        }
      ]
    }
  }
}

与 top_hits 不同,你可以按此指标的结果对存储桶进行排序:

POST /node/_search?filter_path=aggregations
{
  "aggs": {
    "ip": {
      "terms": {
        "field": "ip",
        "order": {"tm.m": "desc"}
      },
      "aggs": {
        "tm": {
          "top_metrics": {
            "metrics": {"field": "m"},
            "sort": {"date": "desc"}
          }
        }
      }
    }
  }
}

上面的结果显示:

{
  "aggregations": {
    "ip": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "192.168.0.2",
          "doc_count": 1,
          "tm": {
            "top": [
              {
                "sort": [
                  "2020-01-01T02:01:01.000Z"
                ],
                "metrics": {
                  "m": 3
                }
              }
            ]
          }
        },
        {
          "key": "192.168.0.1",
          "doc_count": 2,
          "tm": {
            "top": [
              {
                "sort": [
                  "2020-01-01T02:01:01.000Z"
                ],
                "metrics": {
                  "m": 2
                }
              }
            ]
          }
        }
      ]
    }
  }
}

混合排序类型

按跨不同索引的不同类型的字段对 top_metrics 进行排序会产生一些令人惊讶的结果:浮点字段总是独立于整数字段进行排序。

DELETE test
POST /test/_bulk?refresh
{"index":{"_index":"test1"}}
{"s":1,"m":3.1415}
{"index":{"_index":"test1"}}
{"s":2,"m":1}
{"index":{"_index":"test2"}}
{"s":3.1,"m":2.71828}
POST /test*/_search?filter_path=aggregations
{
  "aggs": {
    "tm": {
      "top_metrics": {
        "metrics": {
          "field": "m"
        },
        "sort": {
          "s": "asc"
        }
      }
    }
  }
}

上面的聚合返回结果:

{
  "aggregations": {
    "tm": {
      "top": [
        {
          "sort": [
            3.0999999046325684
          ],
          "metrics": {
            "m": 2.718280076980591
          }
        }
      ]
    }
  }
}

虽然这比错误要好,但它可能不是你想要的。 虽然它确实会丢失一些精度,但你可以使用以下方式将整数字段显式转换为浮点数:

POST /test*/_search?filter_path=aggregations
{
  "aggs": {
    "tm": {
      "top_metrics": {
        "metrics": {
          "field": "m"
        },
        "sort": {
          "s": {
            "order": "asc",
            "numeric_type": "double"
          }
        }
      }
    }
  }
}

上面的聚合结果显示:

{
  "aggregations": {
    "tm": {
      "top": [
        {
          "sort": [
            1
          ],
          "metrics": {
            "m": 3.1414999961853027
          }
        }
      ]
    }
  }
}

参考:

【1】Top metrics aggregation | Elasticsearch Guide [8.4] | Elastic

有关Elasticsearch:Top metrics 聚合的更多相关文章

  1. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  2. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  3. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  4. ruby-on-rails - 使用 Rails (Tire) 和 ElasticSearch 进行模糊字符串匹配 - 2

    我有一个Rails应用程序,现在设置了ElasticSearch和Tiregem以在模型上进行搜索,我想知道我应该如何设置我的应用程序以对模型中的某些索引进行模糊字符串匹配。我将我的模型设置为索引标题、描述等内容,但我想对其中一些进行模糊字符串匹配,但我不确定在何处进行此操作。如果您想发表评论,我将在下面包含我的代码!谢谢!在Controller中:defsearch@resource=Resource.search(params[:q],:page=>(params[:page]||1),:per_page=>15,load:true)end在模型中:classResource'Us

  5. 美团外卖搜索基于Elasticsearch的优化实践 - 2

    美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此

  6. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  7. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  8. ruby-on-rails - Elasticsearch 问题 : Cannot connect AWS elasticsearch service - 2

    我有一个关于配置elasticsearch以连接AWSelasticsearch服务以在生产环境中运行项目的问题。我的gem文件:gem'searchkick'gem'faraday_middleware-aws-signers-v4'gem'aws-sdk','~>2'gem"elasticsearch",">=1.0.15"引用:https://github.com/ankane/searchkick我的config/initializers/elasticsearch.rb文件:require"faraday_middleware/aws_signers_v4"ENV["ELAS

  9. linux查看es节点使用情况,elasticsearch(es) 如何查看当前集群中哪个节点是主节点(master) - 2

    elasticsearch查看当前集群中的master节点是哪个需要使用_cat监控命令,具体如下。查看方法es主节点确定命令,以kibana上查看示例如下:GET_cat/nodesv返回结果示例如下:ipheap.percentram.percentcpuload_1mload_5mload_15mnode.rolemastername172.16.16.188529952.591.701.45mdi-elastic3172.16.16.187329950.990.991.19mdi-elastic2172.16.16.231699940.871.001.03mdi-elastic4172

  10. sql - Arel 导致聚合无限循环 - 2

    我在使用Arel聚契约(Contract)一查询中的2列时遇到了问题。当我运行它时,在railsdev-server崩溃之前,整个服务器会卡住一分钟。我怀疑是无限循环:)。也许我误解了Arel的整个概念,如果有人能看一下,我将不胜感激。这个查询的预期结果是这样的:[{:user_id=>1,:sum_account_charges=>300,:sum_paid_debts=>1000},...]a_account_charges=Table(:account_charges)a_paid_debts=Table(:paid_debts)a_participants=Table(:exp

随机推荐