0、实战问题
有了分词,开发中会遇到,某个索引的文档集合中,共有多少XX关键词?
这就引发出了词频统计的问题。
社区问题:
中文分词后能否统计索引词频
初学者,想做一个简单的论坛检索和热词分析的应用,IK分词后能否将分好的索引词出现频率排序。这样可以形成一个大致的热点词汇范围。
我知道单条index的话可以用termvectors做这个事情,要是上万条index能做吗? 多谢!
1、创建索引
DELETE message_indexPUT message_index{ "mappings": { "_doc":{ "properties":{ "message": { "analyzer": "ik_smart", "term_vector": "with_positions_offsets", "boost": 8, "type": "text", "fielddata":"true" } } } }}2、导入数据
POST message_index/_doc/1{ "message":"沉溺于「轻易获得高成就感」的事情:有意无意地寻求用很小付出获得很大「回报」的偏方,哪怕回报是虚拟的"}POST message_index/_doc/2{ "message":"过度追求“短期回报”可以先思考这样一个问题:为什么玩王者荣耀沉溺我们总是停不下来回报"}POST message_index/_doc/3{ "message":"过度追求的努力无法带来超额的回报,就因此放弃了努力。这点在聪明人身上尤其明显。以前念本科的时候身在沉溺"}3、聚合获取词频
POST message_index/_search{ "size" : 0, "aggs" : { "messages" : { "terms" : { "size" : 10, "field" : "message" } } }}4、返回结果
{ "took": 4, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": 0, "hits": [] }, "aggregations": { "messages": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 45, "buckets": [ { "key": "回报", "doc_count": 3 }, { "key": "沉溺", "doc_count": 2 }, { "key": "的", "doc_count": 2 }, { "key": "过度", "doc_count": 2 }, { "key": "追求", "doc_count": 2 }, { "key": "一个", "doc_count": 1 }, { "key": "为什么", "doc_count": 1 }, { "key": "了", "doc_count": 1 }, { "key": "事情", "doc_count": 1 }, { "key": "付出", "doc_count": 1 } ] } }}5、核心知识点解读
“fielddata”:”true” 是什么?5.1 基础认知:text类型不能用于聚合
所有字段是默认被 indexed(被索引的),这使得它们是可搜索的.可以在脚本中排序,聚合和获取字段值,但是需要不同的搜索模式.
搜索需要回答一个问题 “哪个 document(文档) 包含这个 term(词条)”,然而排序和聚合需要回答一个不同的问题 ” 这个字段在这个 document(文档)中的值是多少?”.
text 字段不支持 doc_values。
引申解析:
1、doc_values是存储在磁盘的数据结构,在文档建立索引的时候创建。
2、对比:field_data缓存主要用于在字段上进行排序或计算聚合。 它将所有字段值加载到内存中,以便为这些值提供基于文档的快速访问。
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。
PUT my_index/_mapping/_doc{ "properties": { "my_field": { "type": "text", "fielddata": true } }}参考:
http://t.cn/R3MzYfZ
http://t.cn/R3MzHkJ
通透讲解:http://t.cn/R3MzRiz
fielddata中文:http://t.cn/R3MznOe
fielddata英文:http://t.cn/R3Mz3eN
作者:铭毅天下
转载请标明出处,原文地址:
https://blog.csdn.net/laoyang360/article/details/80303996
继续阅读与本文标签相同的文章
js瀑布流详细介绍及实现源码
Jquery实现的高考倒计时
-
容器服务及相关云环境几次故障和问题排查记录
2026-05-18栏目: 教程
-
探寻流式计算
2026-05-18栏目: 教程
-
AliOS Things 维测典型案例分析 —— 内存泄漏
2026-05-18栏目: 教程
-
单店营收平均提升达8%-10% 阿里系小程序矩阵的风口来了!
2026-05-18栏目: 教程
-
从零开始入门 K8s| K8s 的应用编排与管理
2026-05-18栏目: 教程
