安装 elasticsearch-analysis-ik 中文分词器

ElasticSearch 默认的分词器对英文处理比较好,对中文的话,会将中文分成一个个字。

比如根据文章标题搜索,输入关键字"新中国万岁",会将这五字一个个展开,然后搜索标题中包含这几个字的,这会导致索引引擎的效果不明显。因为我们往往更希望,搜到“新中国”的排在前面,“万岁”的排在前面。而不是“新”排在前面。

 

一、分词器对比

我们通过 PostMan 发送请求

1.默认的分词器

POST http://127.0.0.1:9200/_analyze?pretty=true

  1. {
  2.     "text":"新中国万岁"
  3. }

采用默认的分析器 standard

结果如下

  1. {
  2.     "tokens": [
  3.         {
  4.             "token""新",
  5.             "start_offset"0,
  6.             "end_offset"1,
  7.             "type""<IDEOGRAPHIC>",
  8.             "position"0
  9.         },
  10.         {
  11.             "token""中",
  12.             "start_offset"1,
  13.             "end_offset"2,
  14.             "type""<IDEOGRAPHIC>",
  15.             "position"1
  16.         },
  17.         {
  18.             "token""国",
  19.             "start_offset"2,
  20.             "end_offset"3,
  21.             "type""<IDEOGRAPHIC>",
  22.             "position"2
  23.         },
  24.         {
  25.             "token""万",
  26.             "start_offset"3,
  27.             "end_offset"4,
  28.             "type""<IDEOGRAPHIC>",
  29.             "position"3
  30.         },
  31.         {
  32.             "token""岁",
  33.             "start_offset"4,
  34.             "end_offset"5,
  35.             "type""<IDEOGRAPHIC>",
  36.             "position"4
  37.         }
  38.     ]
  39. }

 

2.中文分词器

POST http://127.0.0.1:9200/_analyze?pretty=true

  1. {
  2.     "analyzer""ik_max_word",
  3.     "text":"新中国万岁"
  4. }

采用中文分词器

结果如下

  1. {
  2.     "tokens": [
  3.         {
  4.             "token""新中国",
  5.             "start_offset"0,
  6.             "end_offset"3,
  7.             "type""CN_WORD",
  8.             "position"0
  9.         },
  10.         {
  11.             "token""中国",
  12.             "start_offset"1,
  13.             "end_offset"3,
  14.             "type""CN_WORD",
  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"3,
  27.             "end_offset"4,
  28.             "type""TYPE_CNUM",
  29.             "position"3
  30.         },
  31.         {
  32.             "token""岁",
  33.             "start_offset"4,
  34.             "end_offset"5,
  35.             "type""COUNT",
  36.             "position"4
  37.         }
  38.     ]
  39. }

可见效果提高了不少。

 

二、安装中文分词器

我们的 ES 是6.5.0 版本的,对应下载分词器必须也是 6.5.0 版本

1.下载源码包

GitHub 地址:https://github.com/medcl/elasticsearch-analysis-ik

直接下载到本地

 

2.进入该目录

mvn clean package

打包完毕

在 target/releases 下有一个 elasticsearch-analysis-ik-6.5.0.zip 文件,将其复制,拷贝到 ES 目录下的 plugins 中

 

3.解压 elasticsearch-analysis-ik-6.5.0.zip,将其重命名为 ik

如图

安装 elasticsearch-analysis-ik 中文分词器

 

 

三、重启 ES,创建索引

重启 ElasticSearch

在终端输入 jps 可以查看 java 项目的pid,杀死 elasticsearch 的进程

启动 elasticsearch

bin/elasticsearch -d

 

创建带中文分词器的索引

  1. {
  2.     "settings": {
  3.          "analysis" : {
  4.             "analyzer" : {
  5.                 "ik" : {
  6.                     "tokenizer" : "ik_max_word"
  7.                 }
  8.             }
  9.         },
  10.         "number_of_shards"5,
  11.         "number_of_replicas"1
  12.     },
  13.     "mappings": {
  14.         "post": {
  15.             "properties": {
  16.                 "postId": {
  17.                     "type""long"
  18.                 },
  19.                 "userId": {
  20.                     "type""long"
  21.                 },
  22.                 "postTitle": {
  23.                     "type""text",
  24.                     "analyzer""ik_max_word"
  25.                 },
  26.                 "postSummary": {
  27.                     "type""text",
  28.                     "analyzer""ik_max_word"
  29.                 },
  30.                 "postThumbnail": {
  31.                     "type""keyword"
  32.                 },
  33.                 "postType": {
  34.                     "type""keyword"
  35.                 },
  36.                 "postStatus": {
  37.                     "type""integer"
  38.                 },
  39.                 "postViews": {
  40.                     "type""long"
  41.                 },
  42.                 "postLikes": {
  43.                     "type""long"
  44.                 },
  45.                 "commentSize": {
  46.                     "type""long"
  47.                 },
  48.                 "postDate": {
  49.                     "type""date"
  50.                 }
  51.             }
  52.         }
  53.     }
  54. }

 

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
言曌

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: