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. HashSet 添加/遍历元素源码分析

    HashSet 类图 HashSet 简单说明 HashSet 实现了 Set 接口 HashSet 底层实际上是由 HashMap 实现的 public HashSet() { map = new ...

  2. Wpf 多指应用开发解析

    1  首先分析多指事件与单指事件,以及执行顺序 2  事件阻断 订阅多指事件后,在TouchDown时 采用e.handle = true,阻断多指事件,或在ManipulationStarting. ...

  3. 多校B层冲刺NOIP20211111模拟12

    题面:PDFhttp://xn--gwt928b.accoders.com/pdf/10248/10248.pdfhttp://xn--gwt928b.accoders.com/pdf/10248/1 ...

  4. maven exclusion 理解

    结论:exclusion 表示对传递性依赖进行排除,排除后当前项目的依赖jar中,就不会包含该传递性依赖. 扩展:项目中的jar 都会在classpath下,排除后的传递性依赖,相当于在classpa ...

  5. CMake库搜索函数居然不搜索LD_LIBRARY_PATH

    摘要: 本文通过编译后运行找不到库文件的问题引入,首先分析了find_package(JNI)的工作流程,而后针对cmake不搜索LD_LIBRARY_PATH的问题,提出了一种通用的解决办法. 本文 ...

  6. spring boot实现不同生产环境下的文件配置

    配置不同生产环境 本文适用于开发环境下需要打包项目至生产环境,避免开发环境的配置文件泄露. 设置maven 作用:1. 手动调节运行时的不同环境 2. 打包时可以不会有其它环境的文件 注:每次换环境前 ...

  7. 「APIO2010」巡逻 题解

    来源 LCA 个人评价:lca求路径,让我发现了自己不会算树的直径(但是本人似乎没有用lca求) 1 题面 「APIO2010」巡逻 大意:有一个有n个节点的树,每条边权为1,一每天要从1号点开始,遍 ...

  8. React报错之useNavigate() may be used only in context of Router

    正文从这开始~ 总览 当我们尝试在react router的Router上下文外部使用useNavigate 钩子时,会产生"useNavigate() may be used only i ...

  9. LuoguP4165 [SCOI2007]组队

    化式子,然后两个指针平\(A\)过去 #include <cstring> #include <cstdio> #include <algorithm> #incl ...

  10. HDU3085 Nightmare Ⅱ (双向BFS)

    联赛前该练什么?DP,树型,状压当然是爆搜啦 双向BFS就是两个普通BFS通过一拼接函数联系,多多判断啦 #include <iostream> #include <cstdio&g ...