top_hits指标聚合器跟踪要聚合的最相关文档。 该聚合器旨在用作子聚合器,以便可以按存储分区汇总最匹配的文档。

top_hits聚合器可以有效地用于通过存储桶聚合器按某些字段对结果集进行分组。 一个或多个存储桶聚合器确定将结果集切成哪些属性。

选项:

  • from-要获取的第一个结果的偏移量。
  • size-每个存储桶要返回的最匹配匹配项的最大数目。 默认情况下,返回前三个匹配项。
  • 排序-匹配的热门匹配的排序方式。 默认情况下,命中按主要查询的分数排序。

我们还是来用一个例子来展示如何使用这个:

准备数据:

我们选用Kibana里带的官方的Sample web logs来作为我们的索引:

然后加载我们的索引:

这样我们的数据就加载完成了。

Top hits aggregation

首先,我们先做一个简单的基于hosts的aggregation:

GET kibana_sample_data_logs/_search
{
"size": 0,
"aggs": {
"hosts": {
"terms": {
"field": "host.keyword",
"size": 2
}
}
}
}

上面的搜索的结果是我们想得到2个桶的数据(这里为了说明问题的方便,设定为2)。而这两个桶是基于hosts的值。搜索的结果是:

"aggregations" : {
"hosts" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 2807,
"buckets" : [
{
"key" : "artifacts.elastic.co",
"doc_count" : 6488
},
{
"key" : "www.elastic.co",
"doc_count" : 4779
}
]
}
}

现在的要求是:我们想针对这里的每个桶得到按照我们需要排序的前面的几个结果,比如下面的搜索:

GET kibana_sample_data_logs/_search
{
"size": 0,
"aggs": {
"hosts": {
"terms": {
"field": "host.keyword",
"size": 2
},
"aggs": {
"most_bytes": {
"top_hits": {
"sort": [
{
"bytes": {
"order": "desc"
}
}
],
"_source": {
"includes": [
"bytes",
"hosts",
"ip",
"clientip"
]
},
"size": 2
}
}
}
}
}
}

上面实际上市一个pipleline的聚合。它在针对上面的桶来做了一个top_hits的聚合。针对每个桶,我们需要安装bytes的大小,降序排列,并且每个桶只需要两个数据:

  "aggregations" : {
"hosts" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 2807,
"buckets" : [
{
"key" : "artifacts.elastic.co",
"doc_count" : 6488,
"most_bytes" : {
"hits" : {
"total" : {
"value" : 6488,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "kibana_sample_data_logs",
"_type" : "_doc",
"_id" : "dnNIHm8BjrINWI3xXlRc",
"_score" : null,
"_source" : {
"bytes" : 19929,
"ip" : "127.155.255.9",
"clientip" : "127.155.255.9"
},
"sort" : [
19929
]
},
{
"_index" : "kibana_sample_data_logs",
"_type" : "_doc",
"_id" : "OXNIHm8BjrINWI3xX1td",
"_score" : null,
"_source" : {
"bytes" : 19904,
"ip" : "100.177.58.231",
"clientip" : "100.177.58.231"
},
"sort" : [
19904
]
}
]
}
}
},
{
"key" : "www.elastic.co",
"doc_count" : 4779,
"most_bytes" : {
"hits" : {
"total" : {
"value" : 4779,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "kibana_sample_data_logs",
"_type" : "_doc",
"_id" : "4nNIHm8BjrINWI3xYWQl",
"_score" : null,
"_source" : {
"bytes" : 19986,
"ip" : "233.204.30.48",
"clientip" : "233.204.30.48"
},
"sort" : [
19986
]
},
{
"_index" : "kibana_sample_data_logs",
"_type" : "_doc",
"_id" : "wnNIHm8BjrINWI3xW0Rj",
"_score" : null,
"_source" : {
"bytes" : 19956,
"ip" : "129.237.102.30",
"clientip" : "129.237.102.30"
},
"sort" : [
19956
]
}
]
}
}
}
]
}
}

从上面的返回结果可以看出来两个hosts artifacts.elastic.co及www.elastic.co各返回两个结果,并且它们是按照bytes的大小进行降序排列的。

细心的读者可能会发现这个和我之前介绍的field collapsing有些类似。只是field collapsing里针对每个桶有一个结果,并且是按照我们的要求进行排序的最高结果的那个。当然我们也可以含有多几个返回结果在inner_hits之中。

参考:

【1】https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html

Elasticsearch:top_hits aggregation的更多相关文章

  1. Elasticsearch:运用search_after来进行深度分页

    在上一篇文章 "Elasticsearch:运用scroll接口对大量数据实现更好的分页",我们讲述了如何运用scroll接口来对大量数据来进行有效地分页.在那篇文章中,我们讲述了 ...

  2. Elasticsearch:Index生命周期管理入门

    如果您要处理时间序列数据,则不想将所有内容连续转储到单个索引中. 取而代之的是,您可以定期将数据滚动到新索引,以防止数据过大而又缓慢又昂贵. 随着索引的老化和查询频率的降低,您可能会将其转移到价格较低 ...

  3. Elasticsearch:Pinyin 分词器

    Elastic的Medcl提供了一种搜索Pinyin搜索的方法.拼音搜索在很多的应用场景中都有被用到.比如在百度搜索中,我们使用拼音就可以出现汉字: 对于我们中国人来说,拼音搜索也是非常直接的.那么在 ...

  4. Elasticsearch:定制分词器(analyzer)及相关性

    转载自:https://elasticstack.blog.csdn.net/article/details/114278163 在许多的情况下,我们使用现有的分词器已经足够满足我们许多的业务需求,但 ...

  5. Elasticsearch:如何实现对 emoji 表情符号进行搜索

    转摘自:https://elasticstack.blog.csdn.net/article/details/114261636 Elasticsearch 是一个应用非常广泛的搜索引擎.它可以对文字 ...

  6. Elasticsearch:使用 GeoIP 丰富来自内部专用 IP 地址

    转载自:https://blog.csdn.net/UbuntuTouch/article/details/108614271 对于公共 IP,可以创建表来指定 IP 属于哪个城市的特定范围.但是,互 ...

  7. Elasticsearch:aggregation介绍

    聚合(aggregation)功能集是整个Elasticsearch产品中最令人兴奋和有益的功能之一,主要是因为它提供了一个非常有吸引力对之前的facets的替代. 在本教程中,我们将解释Elasti ...

  8. Elasticsearch:significant terms aggregation

    在本文中,我们将重点关注significant terms和significant text聚合.这些聚合旨在搜索数据集中有趣和/或不寻常的术语,这些术语可以告诉您有关数据的隐藏属性的更多信息.此功能 ...

  9. Elasticsearch:运用 shard_size 来提高term aggregation的精度

随机推荐

  1. get前言之版本控制-get和SVN的区别

    版本控制什么是版本控制版本控制(Revision control)是一种在开发的过程中用于管理我们对文件.目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术. ~实 ...

  2. scanf读入与printf输出

    作为一个资深$cin,cout$玩家,在多次因为$cin$太慢被吊打后,开始反思有必要认真地学一下$scanf$和$printf$了$\cdot \cdot \cdot$ 格式 $scanf( &qu ...

  3. Python: 列表、数组及迭代器切片的区别及联系

    1. 对列表和数组进行切片 1.1 切片索引 众所周知,Python中的列表和numpy数组都支持用begin: end语法来表示[begin, end)区间的的切片索引: import numpy ...

  4. 攻防世界MISC进阶区—48-51

    48.Become_a_Rockstar 得到无类型文件,010 Editor打开为几段话,看到标示性的NCTF{),怀疑是用脚本加密后的结果,网上查了一下,得知Rockstar是一种语言,用rock ...

  5. APISpace 未来7天生活指数API接口 免费好用

    随着经济的发展,我们的生活水平在不断的提高,生活指数在我们的生活中也越来越受到关注,根据当天的生活指数,我们就可以知道在今天我们可以干什么比较好.   未来7天生活指数API,支持国内3400+个城市 ...

  6. 2022-7-11 javascript学习 第七组 刘昀航

    ​ JavaScript是什么? 编程语言,脚本语言,依赖于某种容器来运行. JS是运行在浏览器上的,可以帮助我们去控制页面. Vue.js   react.js    jquery.js    an ...

  7. Note -「0/1 Fractional Programming」

    What is that? Let us pay attention to a common problem that we often meet in daily life: There are \ ...

  8. 串口应用:遵循uart协议,发送多个字节的数据(状态机)

    上一节中,我们遵循uart协议,它发送一次只能发送6/7/8位数据,我们不能随意更改位数(虽然在代码上可行),不然就不遵循uart协议了,会造成接收端无法接收. 在现实生活中,我们有时候要发的数据不止 ...

  9. 面试题:Java中为什么只有值传递?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 目录 经典的问题 形参&实参 Java是 ...

  10. Java中break、continue和return三者之间的区别

    控制流程语句 java关键字break.continue.return主要按三个纬度去区分. 作用不同 结束不同 紧跟不同  一.作用不同 1.break:执行break操作,跳出所在的当前整个循环, ...