Elasticsearch中IK分词器使用及详解

2,837

安装IK分词器

1.下载(找自己es对应版本)
https://github.com/medcl/elasticsearch-analysis-ik/tags

2.创建目录ik,将下载的包解压在ik目录
cd elasticsearch-7.8.0/plugins/
mkdir ik
unzip xxxxx.zip
rm xxxxx.zip(务必删除)

3.重启es
./elasticsearch-7.8.0-3/bin/elasticsearch -d

查看分词器效果

//没安装分词器,使用默认
POST /index3/_analyze
{
  "text": "中国上海市", 
  "analyzer": "standard"
}

image.png

//使用IK分词器的ik_smart,分词力度粗
POST /index3/_analyze
{
  "text": "中国上海市", 
  "analyzer": "ik_smart"
}

image.png

//使用IK分词器的ik_max_word,分词力度细(推荐)
POST /index3/_analyze
{
  "text": "中国上海市", 
  "analyzer": "ik_max_word"
}

image.png

说明:在没使用IK分词器,默认按照一个汉字作为分割单元,这样导致数据落入es,都是按照单个汉字建立的倒排索引,这样并不满足中文搜索场景,导致结果就是搜索中文很不准确。使用IK分词器以后,完全使用IK分词器进行分割,IK分词器有一套自己中文词库,分割后的作为用来建立倒排索引,达到检索中文的目的

案例

//环境准备,建立一个新闻news索引
PUT news
{
  "mappings": {
    "properties": {
      "title":{
         "type": "text",
        "analyzer": "ik_max_word"
      },
      "text":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

说明:指定字段使用的分词器

//插入两条数据
POST news/_doc
{
  "title":"抚州米粉",
  "text":"江西抚州米粉很好吃,其中泡粉是当地人必备早餐"
}

POST news/_doc
{
  "title":"桂林米粉",
  "text":"广西人也喜欢吃米粉,其中广西桂林米粉也有点名气"
}

//搜索
POST news/_search
{
  "query": {
    "match": {
      "text": "抚州早餐必备"
    }
  }
}

说明:这条搜索的分数会高一点,因为分词器会把‘抚州早餐必备’ 分词为‘抚州’,‘早餐’,‘必备’中了三次在原文doc中

POST news/_search
{
  "query": {
    "match": {
      "text": "抚州早餐吃什么"
    }
  }
}

说明:这条搜索的分数会低一点,因为分词器会把‘抚州早餐吃什么’ 分词为‘抚州’,‘早餐’,‘吃’,‘吃什么’ 
中了两次次在原文doc中,原文没有 ‘吃’,‘吃什么’

场景:假设你来抚州玩,头天晚上开车到了抚州,第二天很早就起床,那么第一件事肯定是看看当地特色早餐,
然后你搜索了‘抚州早餐必备’,‘抚州早餐吃什么’,就能顺利搜到抚州米粉了。

总结

1.分词器的作用,其实就是对某种语言合理切割,这样符合某种语言的检索
2.分词器切割后的词语作为建立倒排索引的依据,使用不当的分词器会影响检索结果
3.IK分词器作为一个插件存在,详细词库配置,可配置在config目录中
4.由于网络中有一些新词汇出现,词库是应该不断更新,否则不能正常分词,影响检索效果, 有些方案可用热更新词库,这样避免重启es集群