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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 有了分词,开发中会遇到,某个索引的文档集合中,共有多少XX关键词?

0、实战问题

有了分词,开发中会遇到,某个索引的文档集合中,共有多少XX关键词?

这就引发出了词频统计的问题。

社区问题:

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

1、创建索引

DELETE message_index
PUT 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


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
8月前
|
存储 搜索推荐 数据挖掘
|
8月前
|
自然语言处理 API 索引
Elasticsearch Analyzer原理分析并实现中文分词
Elasticsearch Analyzer原理分析并实现中文分词
134 0
|
6月前
|
存储 数据采集 数据处理
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
271 12
|
7月前
|
存储 缓存 负载均衡
elasticsearch写入流程和请求检索流程原理全方位解析
elasticsearch写入流程和请求检索流程原理全方位解析
|
7月前
|
存储 监控 固态存储
elasticsearch索引生命周期管理(ILM):原理和实践
elasticsearch索引生命周期管理(ILM):原理和实践
|
7月前
|
数据采集 API 定位技术
elasticsearch pipelineI详解:原理与使用
elasticsearch pipelineI详解:原理与使用
|
7月前
|
缓存 自然语言处理 监控
elasticsearch过滤器filter:原理及使用
elasticsearch过滤器filter:原理及使用
|
7月前
|
存储 数据库 开发者
Elasticsearch中的三种分页策略深度解析:原理、使用及对比
Elasticsearch中的三种分页策略深度解析:原理、使用及对比
|
7月前
|
缓存 监控 安全
深入解析Elasticsearch中脚本原理
深入解析Elasticsearch中脚本原理
|
7月前
|
缓存 监控 Java
深入Elasticsearch:线程池的原理与应用
深入Elasticsearch:线程池的原理与应用

热门文章

最新文章