暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

跟我学ElasticSearch-中文分词篇

Java2B 2021-08-26
1897

ElasticSearch IK中文分词器

5.1 什么是分词器?为什么要分词器?

在上面的学习例子中我们使用的是Es默认的分词器,在中文的分词上并不友好,会将语句每个字进行分词作为索引,所以在使用Term关键字查询的时候多个汉字无法命中文档。这个时候就需要一个合理的分词规则,将一个完整的语句划分为多个比较复合表达逻辑的独立的词条。

分词器包含三个部分:

  • character filter:分词之前的预处理,过滤掉HTML标签、特殊符号转换(例如,将&符号转换成and、将|符号转换成or)等。

  • tokenizer:分词

  • token filter:标准化

5.2 ElasticSeach内置分词器

standard分词器:(默认的)它将词汇单元转换成小写形式,并去掉停用词(a、an、the等没有实际意义的词)和标点符号,支持中文采用的方法为单字切分(例如,‘你好’切分为‘你’和‘好’)。

simple分词器:首先通过非字母字符来分割文本信息,然后将词汇单元同一为小写形式。该分析器会去掉数字类型的字符。

Whitespace分词器:仅仅是去除空格,对字符没有lowcase(大小写转换)化,不支持中文;并且不对生成的词汇单元进行其他的标准化处理。

language分词器:特定语言的分词器,不支持中文。

5.3 IK分词器

5.3.1 IK分词器简介

IK分词器在是一款 基于词典和规则 的中文分词器,提供了两种分词模式:iksmart (智能模式)和ikmax_word (细粒度模式)

输入数据

  1. 数据:IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。

智能模式效果:

  1. ik  analyzer    一个  结合  词典  分词    文法  分词    中文  分词  开源  工具包    使  用了  全新    正向  迭代    细粒度  切分  算法

细粒度模式:

  1. ik analyzer 一个 结合 词典 分词 和文 文法 分词 中文 分词 开源 工具包 工具 使用 用了 全新 正向 迭代 细粒度 细粒 粒度 切分 算法

5.3.2 ElasticSearch集成Ik分词器

Ik分词器下载 https://github.com/medcl/elasticsearch-analysis-ik

安装包中提供了支持ES 7.0X的Ik压缩包,如果使用其他ES版本注意下载对应版本。

(不同版本的集成可能会有所区别)

解压后进行编译打包

mvn clean mvn compile mvn package

拷贝和解压release下的文件: #{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-*.zip 到你的 elasticsearch 插件目录, 如: plugins/ik并解压 重启elasticsearch



5.3.3 使用ElasticSearch中的 analyze 测试Ik分词效果

请求方式post

请求url http://127.0.0.1:9200/_analyze

请求参数:

  1. {

  2. "analyzer":"ik_smart",

  3. "text":"我们是一群牛逼的程序员"

  4. }

输出效果

  1. {


  2. "tokens": [


  3. {


  4. "token": "我们",


  5. "start_offset": 0,


  6. "end_offset": 2,


  7. "type": "CN_WORD",


  8. "position": 0


  9. },


  10. {


  11. "token": "是",


  12. "start_offset": 2,


  13. "end_offset": 3,


  14. "type": "CN_CHAR",


  15. "position": 1


  16. },


  17. {


  18. "token": "一群",


  19. "start_offset": 3,


  20. "end_offset": 5,


  21. "type": "CN_WORD",


  22. "position": 2


  23. },


  24. {


  25. "token": "牛",


  26. "start_offset": 5,


  27. "end_offset": 6,


  28. "type": "CN_CHAR",


  29. "position": 3


  30. },


  31. {


  32. "token": "逼",


  33. "start_offset": 6,


  34. "end_offset": 7,


  35. "type": "CN_CHAR",


  36. "position": 4


  37. },


  38. {


  39. "token": "的",


  40. "start_offset": 7,


  41. "end_offset": 8,


  42. "type": "CN_CHAR",


  43. "position": 5


  44. },


  45. {


  46. "token": "程序员",


  47. "start_offset": 8,


  48. "end_offset": 11,


  49. "type": "CN_WORD",


  50. "position": 6


  51. }


  52. ]


  53. }

5.3.4 Ik分词器停用词和扩展词

在实际使用过程中Ik分词算法的过程中,还有一些场景的分词规则是Ik无法设计的,比如之前的例子中"牛逼"作为一个网络用语没有被解析成一个词条,以及其中的“的”这样的助词往往在建立索引的时候是没有必要的。所以IK支持停用词和扩展词的配置。

需要修改配置文件




ext_dict填入扩展词文件

ext_stopwords填入停用词文件

文件以dic后缀结尾,需要和IKAnalyzer.cfg在同级目录。

dic文件每个词需要占一行。


文章转载自Java2B,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论