Elasticsearch词频统计实现与原理解读

0、实战问题

有了分词,开发中会遇到,某个索引的文档集合中,共有多少XX关键词? 这就引发出了词频统计的问题。 社区问题:

中文分词后能否统计索引词频 初学者,想做一个简单的论坛检索和热词分析的应用,IK分词后能否将分好的索引词出现频率排序。这样可以形成一个大致的热点词汇范围。 我知道单条index的话可以用termvectors做这个事情,要是上万条index能做吗? 多谢!

1、创建索引

1DELETE message_index
 2PUT message_index
 3{
 4   "mappings": {
 5    "_doc":{
 6       "properties":{
 7            "message": {
 8               "analyzer": "ik_smart",
 9               "term_vector": "with_positions_offsets",
10                "boost": 8,
11                "type": "text",
12                "fielddata":"true"
13            }
14        }
15    }
16  }
17}

2、导入数据

1POST message_index/_doc/1
 2{
 3  "message":"沉溺于「轻易获得高成就感」的事情:有意无意地寻求用很小付出获得很大「回报」的偏方,哪怕回报是虚拟的"
 4}
 5POST message_index/_doc/2
 6{
 7  "message":"过度追求“短期回报”可以先思考这样一个问题:为什么玩王者荣耀沉溺我们总是停不下来回报"
 8}
 9POST message_index/_doc/3
10{
11  "message":"过度追求的努力无法带来超额的回报,就因此放弃了努力。这点在聪明人身上尤其明显。以前念本科的时候身在沉溺"
12}

3、聚合获取词频

1POST message_index/_search
 2{
 3   "size" : 0,  
 4    "aggs" : {   
 5        "messages" : {   
 6            "terms" : {   
 7               "size" : 10,
 8              "field" : "message"
 9            }  
10        }  
11    }
12}

4、返回结果

1{
 2  "took": 4,
 3  "timed_out": false,
 4  "_shards": {
 5    "total": 5,
 6    "successful": 5,
 7    "skipped": 0,
 8    "failed": 0
 9  },
10  "hits": {
11    "total": 3,
12    "max_score": 0,
13    "hits": []
14  },
15  "aggregations": {
16    "messages": {
17      "doc_count_error_upper_bound": 0,
18      "sum_other_doc_count": 45,
19      "buckets": [
20        {
21          "key": "回报",
22          "doc_count": 3
23        },
24        {
25          "key": "沉溺",
26          "doc_count": 2
27        },
28        {
29          "key": "的",
30          "doc_count": 2
31        },
32        {
33          "key": "过度",
34          "doc_count": 2
35        },
36        {
37          "key": "追求",
38          "doc_count": 2
39        },
40        {
41          "key": "一个",
42          "doc_count": 1
43        },
44        {
45          "key": "为什么",
46          "doc_count": 1
47        },
48        {
49          "key": "了",
50          "doc_count": 1
51        },
52        {
53          "key": "事情",
54          "doc_count": 1
55        },
56        {
57          "key": "付出",
58          "doc_count": 1
59        }
60      ]
61    }
62  }
63}

5、核心知识点解读

"fielddata":"true" 是什么?

5.1 基础认知:text类型不能用于聚合

所有字段是默认被 indexed(被索引的),这使得它们是可搜索的.可以在脚本中排序,聚合和获取字段值,但是需要不同的搜索模式.

搜索需要回答一个问题 “哪个 document(文档) 包含这个 term(词条)”,然而排序和聚合需要回答一个不同的问题 " 这个字段在这个 document(文档)中的值是多少?".

许多字段可以使用 index-time,在磁盘上的 doc_values 支持这种数据访问模式, 但是 text 字段不支持 doc_values。

5.2 docvalues和fileddata的本质区别?

docvalues 它保存某一列的数据,并索引它,用于加快聚合和排序的速度。

fileddata 它保存某一列的数据,并索引它,用于加快聚合和排序的速度。和docvalues不一样的是,fielddata保存的是text类型的字段分词后的terms,而不是保存源字段数据。

5.3 fileddata的特点

相反,text 字段使用查询时存在于内存的数据结构 fielddata.这个数据结构是第一次将字段用于聚合,排序,或者脚本时基于需求构建的。

它是通过读取磁盘上的每个 segment(片段)的整个反向索引来构建的,将 term(词条)和 document(文档)关系反转,并将结果存储在内存中,在JVM的堆中.

5.4 text字段默认关闭Fielddat的原因?

text 字段默认关闭 Fielddata Fielddata会消耗很多堆空间,尤其是加载高基数的 text 字段的时候.一旦 fielddata 加载到堆中,它在 segment(片段)中的生命周期还是存在的.

此外,加载 fielddata 是一件非常昂贵的过程,会导致用户体验到延迟的感觉.这就是为什么 fielddata 默认关闭.

如果你尝试对文本字段上的脚本进行排序,访问值,你会看到此异常:

5.5 fielddata的打开方式?

以下ES6.2.X验证ok。

1PUT my_index/_mapping/_doc
2{
3  "properties": {
4    "my_field": { 
5      "type":     "text",
6      "fielddata": true
7    }
8  }
9}

参考: http://t.cn/R3MzYfZ http://t.cn/R3MzHkJ 通透讲解:http://t.cn/R3MzRiz fielddata中文:http://t.cn/R3MznOe fielddata英文:http://t.cn/R3Mz3eN

原文发布于微信公众号 - 铭毅天下(gh_0475cf887cf7)

原文发表时间:2018-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据订阅

图数据库调研

更好,更快速的查询和分析:图数据库为查询相关数据(无论大小)提供了卓越的性能。 图模型提供了固有的索引数据结构,因此它不需要为给定条件的查询加载或接触不相关的数...

50319
来自专栏更流畅、简洁的软件开发方式

【自然框架】 之 主从表的添加、修改

摘要 1、 这里不是说如何做一个人员管理,这里要说的是自然框架如何处理主从表的添加、修改。人员管理只是一个例子。 2、 人员管理的表的“结构”。 3、 Tab...

3176
来自专栏禁心尽力

数据库设计

杨鑫奇数据库设计经验之谈 一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% ...

2428
来自专栏大数据和云计算技术

新数仓系列:MongoDB关键能力和特性梳理

最近看一本书,铃木敏文的《零售的哲学》,里面提到一个很有意思的观点,711核心使命是提供便利,围绕便利场景,提供一系列食品、ATM服务等,而不是和超市去PK货物...

3046
来自专栏CSDN技术头条

Hamsterdb vs. LevelDB:且看非主流数据库的自白和逆袭

【编者按】虽已问世9年之久,但是相较MongoDB,Hamsterdb的知名度仍然有所欠缺,更一度被评为非主流数据库。Hamsterdb是个开源的键值类型数据库...

2267
来自专栏牛客网

前端工程师:电信专业转前端是如何拿到阿里、腾讯offer的?

1.个人情况 ● 211本科 985硕士 电信专业 女生 ● 16年3月开始学习前端 ● 16年7月开始实习,共五家实习经历(不是特别厉害的厂) ● 秋招拿到两...

3546
来自专栏马洪彪

Ora-03113\Ora-03114与Oracle In 拼接字符串的问题

刚深入接触Oracle不久(大学里以及刚参加工作时学到的Oracle知识只能算是皮毛),因为之前使用SqlServer有将近两年的时间,对SqlServer相对...

4116
来自专栏数据和云

性能优化:B*Tree 索引分裂之存储参数

黄玮(Fuyuncat) 黄玮(Fuyuncat),资深 Oracle DBA,从事 Oracle 数据库管理、维护与开发工作十余年,有丰富的大型数据库设计、...

2934
来自专栏CSDN技术头条

N1QL为NoSQL数据库带来SQL般的查询体验

关系型数据库已经流行了超过40年,在这个过程中SQL也成为了操作关系型数据库的标准。SQL将数据的存储方式进行了包装和抽象,使开发人员可以专注于程序逻辑。对开发...

2129
来自专栏北京马哥教育

Python —— 一个『拉勾网』的小爬虫

本文将展示一个 Python 爬虫,其目标网站是『拉勾网』;题图是其运行的结果,这个爬虫通过指定『关键字』抓取所有相关职位的『任职要求』,过滤条件有『城市』、...

5295

扫码关注云+社区

领取腾讯云代金券