ES分布式搜索-IK分词器

ES分词器-IK

1、为什么使用分词器?

es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。

我们在kibana的DevTools中测试:

json 复制代码
GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "程序员学习java太棒了"
}

语法说明:

  • POST:请求方式

  • /_analyze:请求路径,这里省略了http://192.168.12.131:9200,有kibana帮我们补充

  • 请求参数,json风格:

    • analyzer:分词器类型,这里是默认的standard分词器

    • text:要分词的内容

由于kibana无法识别中文词汇,在没有使用IK分词器的情况下每一个中文会逐字进行识别保存查询,所以对效率和内存的耗损都有一些代价。

处理中文分词,一般会使用IK分词器。IK分词器GitHub官网

安装IK分词器,参考资料《安装elasticsearch.md》

ik分词器包含两种模式("analyzer"中添加):

  • ik_smart :最少切分,粒度
  • ik_max_word :最细切分,粒度(分词之后的词语更多)

问题来了,ik分词器是怎样进行分词的?

ik分词器是一种基于字典和规则的中文分词器,其分词过程可以简要描述如下:

  1. 文本预处理:首先将输入的文本进行预处理,包括去除特殊字符、停用词等操作。

  2. 正向最大匹配:ik分词器采用正向最大匹配算法,即从左向右扫描文本,在词典中查找以当前位置开始的最长匹配词。

  3. 词典匹配:ik分词器使用内置的词典来匹配词语。如果当前位置的字符组合在词典中找到了匹配的词语,则将其作为一个词语输出。

  4. 细粒度切分:当出现歧义情况时,ik分词器会根据一定的规则进行细粒度切分,以解决歧义问题。

  5. 返回结果:最终将分词结果返回给用户,用户可以根据需要进行后续的文本处理或分析。

总的来说,ik分词器通过词典匹配和规则处理的方式对中文文本进行分词,以实现对文本的有效切分。

2、ik分词器-拓展和停用词条

假如现在有需求,字典实现个性化设置,比如说不能出现有关政治或国家领导人的关键词汇,过滤黄赌毒等关键词汇等,还有没有意思的词语如"的"等,而且词汇随着时代进步也会产生许多,也需要不含在字典里面。

  1. 要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:

    xml 复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    	<comment>IK Analyzer 扩展配置</comment>
    	<!--用户可以在这里配置自己的扩展字典 -->
    	<entry key="ext_dict">ext.dic</entry>
    	 <!--用户可以在这里配置自己的扩展停止词字典-->
    	<entry key="ext_stopwords">stopword.dic</entry>
    	<!--用户可以在这里配置远程扩展字典 -->
    	<!-- <entry key="remote_ext_dict">words_location</entry> -->
    	<!--用户可以在这里配置远程扩展停止词字典-->
    	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
  2. 然后在名为ext.dicstopword.dic的文件中,添加想要拓展的词语即可(没有记得在config目录下创建):

    java 复制代码
    曼诺尔
    雷迪亚兹
    白嫖
  3. 重启(docker restart es)测试

    java 复制代码
    GET /_analyze
    {
      "analyzer": "ik_smart",
      "text": "曼诺尔雷迪亚兹真是个可恶的白嫖的人"
    }
    json 复制代码
    {
      "tokens" : [
        {
          "token" : "曼诺尔",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "雷迪亚兹",
          "start_offset" : 3,
          "end_offset" : 7,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "真是",
          "start_offset" : 7,
          "end_offset" : 9,
          "type" : "CN_WORD",
          "position" : 2
        },
        {
          "token" : "个",
          "start_offset" : 9,
          "end_offset" : 10,
          "type" : "CN_CHAR",
          "position" : 3
        },
        {
          "token" : "可恶",
          "start_offset" : 10,
          "end_offset" : 12,
          "type" : "CN_WORD",
          "position" : 4
        },
        {
          "token" : "白嫖",
          "start_offset" : 13,
          "end_offset" : 15,
          "type" : "CN_WORD",
          "position" : 5
        },
        {
          "token" : "的人",
          "start_offset" : 15,
          "end_offset" : 17,
          "type" : "CN_WORD",
          "position" : 6
        }
      ]
    }
相关推荐
geneculture31 分钟前
从智力仿真到认知协同:人机之间的价值对齐与共生框架
大数据·人工智能·学习·融智学的重要应用·信智序位
无代码专家1 小时前
设备巡检数字化闭环解决方案:从预防到优化的全流程赋能
大数据·人工智能
神算大模型APi--天枢6462 小时前
合规与高效兼得:国产全栈架构赋能行业大模型定制,从教育到工业的轻量化落地
大数据·前端·人工智能·架构·硬件架构
云和数据.ChenGuang4 小时前
Logstash配置文件的**语法解析错误**
运维·数据库·分布式·rabbitmq·jenkins
飞飞传输4 小时前
守护医疗隐私,数据安全摆渡系统撑起内外网安全伞!
大数据·运维·安全
Guheyunyi4 小时前
视频安全监测系统的三大核心突破
大数据·运维·服务器·人工智能·安全·音视频
秋饼4 小时前
【三大锁王争霸赛:Java锁、数据库锁、分布式锁谁是卷王?】
java·数据库·分布式
Elasticsearch4 小时前
使用 OpenLit、 OpenTelemetry 和 Elastic 的 AI Agent 可观测性
elasticsearch
阿里云大数据AI技术5 小时前
1TB数据,ES却收到了2TB?揪出那个客户端中的“隐形复读机”
大数据·elasticsearch
初恋叫萱萱5 小时前
【TextIn大模型加速器 + 火山引擎】文件智能体构建全路径指南
大数据·数据库·火山引擎