`
weitao1026
  • 浏览: 1053699 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Elasticsearch添加中文分词,对比分词器效果

 
阅读更多

Elasticsearch中,内置了很多分词器(analyzers),例如standard (标准分词器)、english (英文分词)和chinese (中文分词)。其中standard 就是无脑的一个一个词(汉字)切分,所以适用范围广,但是精准度低;english 对英文更加智能,可以识别单数负数,大小写,过滤stopwords(例如“the”这个词)等;chinese 效果很差,后面会演示。这次主要玩这几个内容:安装中文分词ik,对比不同分词器的效果,得出一个较佳的配置。关于Elasticsearch,之前还写过两篇文章:Elasticsearch的安装,运行和基本配置 和 备份和恢复,需要的可以看下。

 

安装中文分词ik

Elasticsearch的中文分词很烂,所以我们需要安装ik。首先从github上下载项目,解压:

 

  1. cd /tmp
  2. wget https://github.com/medcl/elasticsearch-analysis-ik/archive/master.zip
  3. unzip master.zip
  4. cd elasticsearch-analysis-ik/

 

然后使用mvn package 命令,编译出jar包 elasticsearch-analysis-ik-1.4.0.jar。

 

  1. mvn package

 

将jar包复制到Elasticsearch的plugins/analysis-ik 目录下,再把解压出的ik目录(配置和词典等),复制到Elasticsearch的config 目录下。然后编辑配置文件elasticsearch.yml ,在后面加一行:

 

  1. index.analysis.analyzer.ik.type :"ik"

 

重启service elasticsearch restart 。搞定。

如果上面的mvn搞不定的话,你可以直接从 elasticsearch-rtf 项目中找到编译好的jar包和配置文件(我就是怎么干的)。

2014-12-14晚更新,今天是星期天,我在vps上安装ik分词,同样的步骤,总是提示MapperParsingException[Analyzer [ik] not found for field [cn]],然后晚上跑到公司,发现我公司虚拟机上Elasticsearch的版本是1.3.2,vps上是1.3.4,猜是版本问题,直接把vps重新安装成最新的1.4.1,再安装ik,居然ok了……】

 

准备工作:创建索引,录入测试数据

先为后面的分词器效果对比做好准备,我的Elasticsearch部署在虚拟机 192.168.159.159:9200 上的,使用chrome的postman插件直接发http请求。第一步,创建index1 索引:

 

  1. PUT http://192.168.159.159:9200/index1
  2. {
  3. "settings":{
  4. "refresh_interval":"5s",
  5. "number_of_shards":1,//一个主节点
  6. "number_of_replicas":0//0个副本,后面可以加
  7. },
  8. "mappings":{
  9. "_default_":{
  10. "_all":{"enabled": false }//关闭_all字段,因为我们只搜索title字段
  11. },
  12. "resource":{
  13. "dynamic": false,//关闭“动态修改索引”
  14. "properties":{
  15. "title":{
  16. "type":"string",
  17. "index":"analyzed",
  18. "fields":{
  19. "cn":{
  20. "type":"string",
  21. "analyzer":"ik"
  22. },
  23. "en":{
  24. "type":"string",
  25. "analyzer":"english"
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }

 

为了方便,这里的index1 索引,只有一个shards,没有副本。索引里只有一个叫resource 的type,只有一个字段title ,这就足够我们用了。title 本身使用标准分词器,title.cn 使用ik分词器,title.en 自带的英文分词器。然后是用bulk api批量添加数据进去:

 

  1. POST http://192.168.159.159:9200/_bulk
  2. {"create":{"_index":"index1","_type":"resource","_id":1}}
  3. {"title":"周星驰最新电影"}
  4. {"create":{"_index":"index1","_type":"resource","_id":2}}
  5. {"title":"周星驰最好看的新电影"}
  6. {"create":{"_index":"index1","_type":"resource","_id":3}}
  7. {"title":"周星驰最新电影,最好,新电影"}
  8. {"create":{"_index":"index1","_type":"resource","_id":4}}
  9. {"title":"最最最最好的新新新新电影"}
  10. {"create":{"_index":"index1","_type":"resource","_id":5}}
  11. {"title":"I'm not happy about the foxes"}

 

注意bulk api要“回车”换行,不然会报错。

 

各种比较

1、对比ik分词,chinese分词和standard分词

 

  1. POST http://192.168.159.159:9200/index1/_analyze?analyzer=ik
  2. 联想召回笔记本电源线

 

ik测试结果:

 

  1. {
  2. "tokens":[
  3. {
  4. "token":"联想",
  5. "start_offset":0,
  6. "end_offset":2,
  7. "type":"CN_WORD",
  8. "position":1
  9. },
  10. {
  11. "token":"召回",
  12. "start_offset":2,
  13. "end_offset":4,
  14. "type":"CN_WORD",
  15. "position":2
  16. },
  17. {
  18. "token":"笔记本",
  19. "start_offset":4,
  20. "end_offset":7,
  21. "type":"CN_WORD",
  22. "position":3
  23. },
  24. {
  25. "token":"电源线",
  26. "start_offset":7,
  27. "end_offset":10,
  28. "type":"CN_WORD",
  29. "position":4
  30. }
  31. ]
  32. }

 

自带chinese和standard分词器的结果:

 

  1. {
  2. "tokens":[
  3. {
  4. "token":"联",
  5. "start_offset":0,
  6. "end_offset":1,
  7. "type":"<IDEOGRAPHIC>",
  8. "position":1
  9. },
  10. {
  11. "token":"想",
  12. "start_offset":1,
  13. "end_offset":2,
  14. "type":"<IDEOGRAPHIC>",
  15. "position":2
  16. },
  17. {
  18. "token":"召",
  19. "start_offset":2,
  20. "end_offset":3,
  21. "type":"<IDEOGRAPHIC>",
  22. "position":3
  23. },
  24. {
  25. "token":"回",
  26. "start_offset":3,
  27. "end_offset":4,
  28. "type":"<IDEOGRAPHIC>",
  29. "position":4
  30. },
  31. {
  32. "token":"笔",
  33. "start_offset":4,
  34. "end_offset":5,
  35. "type":"<IDEOGRAPHIC>",
  36. "position":5
  37. },
  38. {
  39. "token":"记",
  40. "start_offset":5,
  41. "end_offset":6,
  42. "type":"<IDEOGRAPHIC>",
  43. "position":6
  44. },
  45. {
  46. "token":"本",
  47. "start_offset":6,
  48. "end_offset":7,
  49. "type":"<IDEOGRAPHIC>",
  50. "position":7
  51. },
  52. {
  53. "token":"电",
  54. "start_offset":7,
  55. "end_offset":8,
  56. "type":"<IDEOGRAPHIC>",
  57. "position":8
  58. },
  59. {
  60. "token":"源",
  61. "start_offset":8,
  62. "end_offset":9,
  63. "type":"<IDEOGRAPHIC>",
  64. "position":9
  65. },
  66. {
  67. "token":"线",
  68. "start_offset":9,
  69. "end_offset":10,
  70. "type":"<IDEOGRAPHIC>",
  71. "position":10
  72. }
  73. ]
  74. }

 

结论不必多说,对于中文,官方的分词器十分弱。

 

2、搜索关键词“最新”和“fox”

测试方法:

 

  1. POST http://192.168.159.159:9200/index1/resource/_search
  2. {
  3. "query":{
  4. "multi_match":{
  5. "type":"most_fields",
  6. "query":"最新",
  7. "fields":["title","title.cn","title.en"]
  8. }
  9. }
  10. }

 

我们修改queryfields 字段来对比。

1)搜索“最新”,字段限制在title.cn 的结果(只展示hit部分):

 

  1. "hits":[
  2. {
  3. "_index":"index1",
  4. "_type":"resource",
  5. "_id":"1",
  6. "_score":1.0537746,
  7. "_source":{
  8. "title":"周星驰最新电影"
  9. }
  10. },
  11. {
  12. "_index":"index1",
  13. "_type":"resource",
  14. "_id":"3",
  15. "_score":0.9057159,
  16. "_source":{
  17. "title":"周星驰最新电影,最好,新电影"
  18. }
  19. },
  20. {
  21. "_index":"index1",
  22. "_type":"resource",
  23. "_id":"4",
  24. "_score":0.5319481,
  25. "_source":{
  26. "title":"最最最最好的新新新新电影"
  27. }
  28. },
  29. {
  30. "_index":"index1",
  31. "_type":"resource",
  32. "_id":"2",
  33. "_score":0.33246756,
  34. "_source":{
  35. "title":"周星驰最好看的新电影"
  36. }
  37. }
  38. ]

 

再次搜索“最新”,字段限制在titletitle.en 的结果(只展示hit部分):

 

  1. "hits":[
  2. {
  3. "_index":"index1",
  4. "_type":"resource",
  5. "_id":"4",
  6. "_score":1,
  7. "_source":{
  8. "title":"最最最最好的新新新新电影"
  9. }
  10. },
  11. {
  12. "_index":"index1",
  13. "_type":"resource",
  14. "_id":"1",
  15. "_score":0.75,
  16. "_source":{
  17. "title":"周星驰最新电影"
  18. }
  19. },
  20. {
  21. "_index":"index1",
  22. "_type":"resource",
  23. "_id":"3",
  24. "_score":0.70710677,
  25. "_source":{
  26. "title":"周星驰最新电影,最好,新电影"
  27. }
  28. },
  29. {
  30. "_index":"index1",
  31. "_type":"resource",
  32. "_id":"2",
  33. "_score":0.625,
  34. "_source":{
  35. "title":"周星驰最好看的新电影"
  36. }
  37. }
  38. ]

 

结论:如果没有使用ik中文分词,会把“最新”当成两个独立的“字”,搜索准确性低。

 

2)搜索“fox”,字段限制在titletitle.cn ,结果为空,对于它们两个分词器,fox和foxes不同。再次搜索“fox”,字段限制在title.en ,结果如下:

 

  1. "hits":[
  2. {
  3. "_index":"index1",
  4. "_type":"resource",
  5. "_id":"5",
  6. "_score":0.9581454,
  7. "_source":{
  8. "title":"I'm not happy about the foxes"
  9. }
  10. }
  11. ]

 

结论:中文和标准分词器,不对英文单词做任何处理(单复数等),查全率低。

 

我的最佳配置

其实最开始创建的索引已经是最佳配置了,在title 下增加cnen 两个fields,这样对中文,英文和其他什么乱七八糟文的效果都好点。就像前面说的,title 使用标准分词器,title.cn 使用ik分词器,title.en 使用自带的英文分词器,每次搜索同时覆盖。

分享到:
评论

相关推荐

    elasticsearch-ik中文分词器7.6.2.zip

    **Elasticsearch 7.6.2 中文分词器详解** Elasticsearch 是一个流行的开源全文搜索引擎,它提供了一种高效、灵活的方式来存储、搜索和分析大量数据。在处理中文文档时,为了实现准确的搜索和匹配,我们需要使用特定...

    elasticsearch-analysis-ik 7.10.0 分词器

    Elasticsearch-analysis-ik 是一个专为 Elasticsearch 设计的中文分词插件,它基于 Lucene 的 IK 分词器,旨在提供高效、准确的中文分词能力。 **IK 分词器介绍** IK (Intelligent Chinese Analyzer) 是一个针对...

    Elasticsearch中拼音分词器

    Elasticsearch默认并不包含中文分词器,但通过安装第三方插件,如`analyzer-pinyin`或`ik`分词器的扩展,我们可以添加拼音分词功能。这些插件可以将中文字符转换为拼音,使得搜索时不仅匹配原文,还能匹配对应的拼音...

    elasticsearch的ik中文分词器

    **Elasticsearch与IK中文分词器** Elasticsearch(ES)是一款强大的开源搜索引擎,它基于Lucene构建,提供实时、分布式、可扩展的搜索和分析能力。在处理中文文档时,由于中文句子中词语之间没有明显的分隔符,因此...

    es安装ik分词器

    它提供了多种内置分词器来处理文本数据,但在实际应用过程中,由于中文语言的复杂性,Elasticsearch 默认提供的分词器往往不能很好地满足中文分词的需求。因此,通常需要安装第三方的中文分词器插件来提高中文处理...

    7.17.1系列Elasticsearch的elasticsearch-analysis-ik分词器

    elasticsearch-analysis-ik 是一个常用的中文分词器,在 Elasticsearch 中广泛应用于中文文本的分析和搜索。下面是 elasticsearch-analysis-ik 分词器的几个主要特点: 中文分词:elasticsearch-analysis-ik 是基于...

    elasticsearch ik 7.4.2 分词器

    然而,对于中文处理,Elasticsearch的默认分词器并不理想,无法有效地对中文文本进行分词,这是由于中文的复杂性和独特的词汇结构。因此,为了优化对中文的支持,我们需要安装专门针对中文的分词器,如IK分词器。 *...

    elasticsearch7.6.1-ik分词器

    总之,IK 分词器是 Elasticsearch 在中文环境下的得力助手,通过合理的配置和使用,可以极大地提升中文文本的检索效果。对于开发人员来说,理解其工作原理和特点,以及如何根据业务需求进行定制和优化,是充分利用 ...

    es7.0 ik的分词器

    IK分词器(Intelligent Chinese Analyzer for Elasticsearch)是一款广泛应用于ES的中文分词插件,它能有效地对中文文本进行分词,提高中文搜索的准确性和效率。 **Elasticsearch分词器** 在Elasticsearch中,分词...

    Elasticsearch平台中文分词词库.txt

    Elasticsearch电商平台中文分词词库

    elasticsearch-analysis-pinyin-7.4.0 es拼音分词器7.4.0

    为此,Elasticsearch提供了多种分词器,其中elasticsearch-analysis-pinyin-7.4.0就是专门针对中文处理的拼音分词器,它将汉字转换为拼音,以提高中文搜索的准确性和便利性。 这个插件的核心功能在于将中文字符转化...

    elasticsearch-7.0.0 版本 ik 中文分词器

    **Elasticsearch 7.0.0 版本与 IK 中文分词器详解** Elasticsearch 是一款功能强大的开源搜索引擎,广泛应用于大数据分析、全文检索以及日志分析等领域。在处理中文文档时,为了实现精确的搜索和索引,我们需要使用...

    elasticsearch 中文分词器ik

    **Elasticsearch中文分词器IK** Elasticsearch(ES)是流行的全文搜索引擎,它基于Lucene库构建,提供了一个分布式、RESTful风格的搜索和分析引擎服务。然而,对于中文这种复杂的语言,Elasticsearch默认的分词器...

    elasticsearch7.17.10版本分词器插件安装包

    通过以上步骤,你就成功地为Elasticsearch 7.17.10安装了IK分词器,从而提升了中文处理能力,为日志收集和分析提供更精准的索引和搜索功能。在实际应用中,可以根据需求调整分词器参数,优化分词效果。

    elasticsearch7.8.0版本的IK分词器

    在中文处理方面,IK (Intelligent Chinese) 分词器是 Elasticsearch 的一个非常重要的插件,尤其对于中文文本的索引和搜索性能提升起到了关键作用。IK 分词器针对中文的特性进行了优化,能够有效地对中文文本进行...

    IK分词器elasticsearch-analysis-ik-7.17.16

    IK分词器是针对Elasticsearch设计的一款强大的中文分词插件,其全称为"elasticsearch-analysis-ik"。在Elasticsearch中,分词器的作用至关重要,它负责将用户输入的文本进行词汇切分,以便进行后续的搜索和分析操作...

    elasticsearch-7.14.0+分词器+head插件一键下载

    Elasticsearch 内置了多种分词器,如标准分词器(Standard Analyzer)、关键词分词器(Keyword Analyzer)和中文分词器(Smart Chinese Analyzer)等。这些分词器可以根据不同的语言和应用场景进行定制,以确保搜索...

    elasticsearch7.17.8版本分词器插件安装包

    1. 在Elasticsearch的配置文件`elasticsearch.yml`中,添加或修改以下配置以启用IK分词器: ``` analysis: analyzer: my_ik_analyzer: # 自定义的分词器名称 type: "ik_max_word" # 使用IK分词器的max_word模式...

    elasticsearch7.17.11版本分词器插件安装包

    IK分词器(Intelligent Chinese Analyzer for Elasticsearch)是为Elasticsearch设计的一款强大、灵活且高效的中文分词插件。它支持自定义扩展词典、同义词扩展、动态词典加载等功能,能更好地适应中文的复杂语境。 ...

    ElasticSearch 重写IK分词器源码设置mysql热词更新词库1

    总结来说,通过改造IK分词器源码并集成MySQL数据库,我们可以实现动态更新热词库,从而提高Elasticsearch的分词效果,满足实时性需求。这种方式不仅解决了内置词库和静态词库的不足,还提供了更大的灵活性,能够适应...

Global site tag (gtag.js) - Google Analytics