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

  • 为用户查询标识包含同义词,首字母缩略词等的相关文档。例如,当用户搜索H1N1时,重要术语聚合可能会建议带有“bird flu”的文档。
  • 识别数据中的异常和有趣的事件。例如,通过基于位置过滤文档,我们可以确定特定区域中最常见的犯罪类型。
  • 使用对整数字段(例如身高,体重,收入等)的significant term聚合来确定一组主题的最重要属性。

应当注意,重要术语和重要文本聚合都对直接查询(前景集)和索引中所有其他文档(背景集)检索的文档执行复杂的统计计算。因此,两种聚合都需要大量计算,因此应正确配置以快速工作。但是,一旦在本教程的帮助下掌握了它们,您将获得一个强大的工具,可以在应用程序中构建非常有用的功能并从数据集中获取有用的见解。让我们开始吧!

在教程开始,我们假定您已经把Elasticsearch及Kibana完整地安装好了。

创建Index mapping

为了说明significant terms和significant text的工作方式,我们首先需要创建一个测试“news”索引来存储新闻文章的集合。 索引映射将包含诸如作者,出版日期,文章标题,视图数和主题之类的字段。 让我们创建映射:

    PUT news
{
"mappings": {
"properties": {
"published": {
"type": "date",
"format": "dateOptionalTime"
},
"author": {
"type": "keyword"
},
"title": {
"type": "text"
},
"topic": {
"type": "keyword"
},
"views": {
"type": "integer"
}
}
}
}

如您所见,我们在topic和author字段中使用了keyword数据类型,在title字段中使用了text数据类型。 提醒您,关键字字段只能按其确切值进行搜索,而文本字段可用于全文搜索。

接下来,让我们使用Bulk API将一些任意新闻文档添加到索引中。

    POST news/_bulk
{"index":{"_index":"news"}}
{"author":"John Michael","published":"2018-07-08","title":"Tesla is flirting with its lowest close in over 1 1/2 years (TSLA)","topic":"automobile","views":"431"}
{"index":{"_index":"news"}}
{"author":"John Michael","published":"2018-07-22","title":"Tesla to end up like Lehman Brothers (TSLA)","topic":"automobile","views":"1921"}
{"index":{"_index":"news"}}
{"author":"John Michael","published":"2018-07-29","title":"Tesla (TSLA) official says that they are going to release a new self-driving car model in the coming year","topic":"automobile","views":"1849"}
{"index":{"_index":"news"}}
{"author":"John Michael","published":"2018-08-14","title":"Five ways Tesla uses AI and Big Data","topic":"ai","views":"871"}
{"index":{"_index":"news"}}
{"author":"John Michael","published":"2018-08-14","title":"Toyota partners with Tesla (TSLA) to improve the security of self-driving cars","topic":"automobile","views":"871"}
{"index":{"_index":"news"}}
{"author":"Robert Cann","published":"2018-08-25","title":"Is AI dangerous for humanity","topic":"ai","views":"981"}
{"index":{"_index":"news"}}
{"author":"Robert Cann","published":"2018-09-13","title":"Is AI dangerous for humanity","topic":"ai","views":"871"}
{"index":{"_index":"news"}}
{"author":"Robert Cann","published":"2018-09-27","title":"Introduction to Generative Adversarial Networks (GANs) in self-driving cars","topic":"automobile","views":"1183"}
{"index":{"_index":"news"}}
{"author":"Robert Cann","published":"2018-10-09","title":"Introduction to Natural Language Processing","topic":"ai","views":"786"}
{"index":{"_index":"news"}}
{"author":"Robert Cann","published":"2018-10-15","title":"New Distant Objects Found in the Fight for Planet X ","topic":"astronomy","views":"542"}

在这里,我们共同插入了20条数据。

Significant Terms Aggregation

正如我们已经提到的,重要的术语聚合可以识别数据中异常和有趣的术语。 对于以下用例,聚合功能非常强大:

  • 识别与用户查询相关的相关术语/文档。 例如,当用户查询“Spain”时,聚合可能会建议诸如“Madrid”,“Corrida”之类的术语,或有关Spain的文档中常见的其他任何术语。
  • Significant term聚合可用于自动新闻分类器,其中基于频繁连接的术语图对文档进行分类。
  • 发现数据中的异常。 例如,借助这种汇总,我们可以识别某些地理区域中的异常犯罪类型或疾病。

重要的是要理解,significant terms聚合选择的术语不仅是文档集中最受欢迎的术语。 例如,即使首字母缩略词“ MSFT”仅存在于一千万个文档索引中的10个文档中,但如果在与用户查询“ Microsoft”相匹配的50个文档中有10个找到了这个MSFT,则它仍然是相关的。 该频率使acronym(比如MSFT)与用户的搜索相关。

为了识别重要术语,聚合对与查询匹配的搜索结果以及从中收集结果的索引执行复杂的统计分析。 与查询直接匹配的搜索结果代表前景集,而从中检索它们的索引代表背景集。 重要术语聚合的任务是比较这些集合并找到最常与用户查询关联的术语。

上面的意思可以用上面的一幅图来解释。比如上面的绿色代表一个很大的索引,它里面可能含有比如Nokia这个term很高的出现率。即便如此,只要我们所搜索的FG那个红色的结果里,它出现的几率非常低,也不能够出现在significant terms的聚合里。相反,如果一个term比如TECNO(中国一个非常出名的在非洲的品牌)出现我们所搜索的set里(比如搜索 africa phone),那么我们搜索的聚合将会是是TECNO尽管TECNO可能在整个BG所包含的文档里出现的几率非常之低。

让我们使用真实示例,演示聚合如何工作。 在下面的示例中,我们将尝试在索引中查找每个author的重要topics。 为此,我们首先在author字段上使用术语“桶聚合(bucket aggregation)”。 您还记得,terms aggregation为找到索引的所有唯一术语(即author)构造了存储桶。 接下来,我们在“topics”字段上使用significant terms聚合,以找出每个author的最重要topic。 看一下下面的查询:

    GET news/_search
{
"size": 0,
"aggregations": {
"authors": {
"terms": {
"field": "author"
},
"aggregations": {
"significant_topic_types": {
"significant_terms": {
"field": "topic"
}
}
}
}
}
}

显示的结果为:

    {
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 20,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"authors" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "John Michael",
"doc_count" : 10,
"significant_topic_types" : {
"doc_count" : 10,
"bg_count" : 20,
"buckets" : [
{
"key" : "automobile",
"doc_count" : 8,
"score" : 0.4800000000000001,
"bg_count" : 10
}
]
}
},
{
"key" : "Robert Cann",
"doc_count" : 10,
"significant_topic_types" : {
"doc_count" : 10,
"bg_count" : 20,
"buckets" : [
{
"key" : "ai",
"doc_count" : 6,
"score" : 0.2999999999999999,
"bg_count" : 8
}
]
}
}
]
}
}
}

显然对于作者John Michael来说,在他所发表的书里automobile是最经常出现的词。共有8次,而bg_count是10。同样对于作者Robert Cann来说,在他发布的作品里,ai是最最经常出现的词,在他的8个作品中,有6词提到ai。可以断定他就是一个ai专家!

针对上面的significant terms聚合查询,我们也可以通过如下的方法来查询针对某个作者(author)的聚合。

    GET news/_search
{
"size": 0,
"query": {
"term": {
"author": "John Michael"
}
},
"aggregations": {
"significant_topics": {
"significant_terms": {
"field": "topic"
}
}
}
}

显示的结果为:

    {
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"significant_topics" : {
"doc_count" : 10,
"bg_count" : 20,
"buckets" : [
{
"key" : "automobile",
"doc_count" : 8,
"score" : 0.4800000000000001,
"bg_count" : 10
}
]
}
}
}

这种表述更适合解释我们上面的那个BG和FG的图。

针对significant text aggregation,基本它和significant terms aggregation非常相似,只是它作用于一个text字段而不是一个keyword字段。比如:

    GET news/_search
{
"size": 0,
"query": {
"match": {
"title": "Tesla ai"
}
},
"aggregations": {
"significant_topics": {
"significant_text": {
"field": "topic"
}
}
}
}

注意这里的title字段是text,它同时搜索Telsa及ai,再根据这两个词来进行聚合:

    {
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 14,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"significant_topics" : {
"doc_count" : 14,
"bg_count" : 20,
"buckets" : [
{
"key" : "automobile",
"doc_count" : 8,
"score" : 0.08163265306122446,
"bg_count" : 10
},
{
"key" : "ai",
"doc_count" : 6,
"score" : 0.030612244897959134,
"bg_count" : 8
}
]
}
}
}

参考:

【1】significant terms aggregation(https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html)

【2】significant text aggregation(https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket-significanttext-aggregation.html)

Elasticsearch:significant terms aggregation的更多相关文章

  1. Elasticsearch:aggregation介绍

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

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

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

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

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

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

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

  5. Elasticsearch:Pinyin 分词器

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

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

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

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

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

  8. Elasticsearch:top_hits aggregation

    top_hits指标聚合器跟踪要聚合的最相关文档. 该聚合器旨在用作子聚合器,以便可以按存储分区汇总最匹配的文档. top_hits聚合器可以有效地用于通过存储桶聚合器按某些字段对结果集进行分组. 一 ...

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

随机推荐

  1. MicTR01 Tester 开发套件(振弦采集读数仪)使用说明

    MicTR01 是系列振弦模块 VM5/6/7和电子标签读写模块 TR01 开发测试.开发套件.使用 STC8 位 51 单片机为核心部件,演示上述各个型号模块的基本用法,包括了模块使用时的硬件连接和 ...

  2. 讲透JAVA Stream的collect用法与原理,远比你想象的更强大

    大家好,又见面了. 在我前面的文章<吃透JAVA的Stream流操作,多年实践总结>中呢,对Stream的整体情况进行了细致全面的讲解,也大概介绍了下结果收集器Collectors的常见用 ...

  3. 多校B层冲刺NOIP20211110 字符配对游戏

    原题 问题描述 操场边,运动会没有项目的同学也没闲着,经过几天的研究,他们发明了一个很有意思的字符串配对游戏,两位同学准备两张白纸,第一个同学在纸上写一个整数N和一个由小写字母组成的字符串S,将S重复 ...

  4. springmvc源码笔记-HandlerMethodReturnValueHandler

    返回值解析器 用于对controller的返回值进行二次处理 结构 // 返回值解析器 public interface HandlerMethodReturnValueHandler { // 判断 ...

  5. 【Azure Developer】在Azure VM (Windows) 中搭建 kafka服务,并且通过本地以及远程验证 发送+消费 消息

    问题描述 查看了 "How to Install and Run Apache Kafka on Windows? " 一文后,成功安装了Kafka服务,但是如何使用呢?如何在其他 ...

  6. DP の 百题大过关(5/100)

      动态规划自古以来是DALAO凌虐萌新的分水岭,但有些OIer认为并没有这么重要--会打暴力,大不了记忆化.但是其实,动态规划学得好不好,可以彰显出一个OIerOIer的基本素养--能否富有逻辑地思 ...

  7. 4G巴歇尔槽流量采集网关

    首先向大家展示下拓扑图: 金鸽科技R10物联网网关,带有一个RS485口可以采集巴歇尔槽的液位状态,还提供一个网口用于给摄像头和现场其他的网络设备提供网络传输通道!R10A内置了巴歇尔槽液位换算成流量 ...

  8. 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化

    <深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...

  9. ExcelPatternTool: Excel表格-数据库互导工具

    ExcelPatternTool Excel表格-数据库互导工具 介绍: 指定Pattern文件-一个规则描述的json文档,基于此规则实现Excel表格与数据库之间的导入导出,校验等功能. 特点: ...

  10. Odoo4 tree视图左上角新增Button

    # 一.直接在tree根元素中新增.这种有个限制就是必须要勾选一或多条记录的时候按钮才会显示 <tree> <header> <button type="obj ...