分词器是es当中的一个组件,通俗来讲,就是将搜索的条件按照语义进行拆分,分词为多个词语,es会讲text格式的字段按照分词器的结果进行分词,并编排成倒排索引,正因为如此,es的查询速度才会很快,es当中本身就内置了很多分词器

分词器 作用
Standard ES的默认分词器,按单词分类并进行大小写处理
Simple 按照非字母区分,然后去除非字母并按小写进行处理
Stop 按照停顿词进行过滤并进行小写处理,停用词包括the a is
Whitespace 按照空格进行拆分
Patter 按照正则进行拆分,默认是\W+ ,代表非字母
Keyword 不进行分词,作为一个整体输出
es的默认分词器为Standard,对中文分词时会全部拆分为单个字并过滤掉特殊字符
说到分词器,不得不提及中文分词器ik,这里只描述es中的ik分词器

ik分词器

ikAnalyzrer是一个开源的,基于java语言开发的轻量级的中文分词工具包,新版本的ik分词器发展为面向java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认实现
ik分词器默认有两种分词模式:
ik_max_word(常用模式)将文本做最细粒度拆分
ik_smart 将文本做粗粒度拆分
ik_smart分词

GET book/_analyze
{
  "analyzer": "ik_smart",
  "text": ["武当山上张三丰"]
}
{
  "tokens" : [
    {
      "token" : "武当",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "山上",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "张三丰",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

使用ik_max_word分词

GET book/_analyze
{
  "analyzer": "ik_max_word",
  "text": ["武当山上张三丰"]
}
{
  "tokens" : [
    {
      "token" : "武当山",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "武当",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "山上",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "张三丰",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "张三",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "三",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "TYPE_CNUM",
      "position" : 5
    },
    {
      "token" : "丰",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "CN_CHAR",
      "position" : 6
    }
  ]
}

可以明显的看到ik_max_word拆分的更细一些,实际使用时一般写入数据时使用ik_max_word,查询数据时使用ik_smart(如果没有search_analyzer,默认使用analyzer)
一般安装了ik中文分词器可以满足大部分的场景,但是很多使用用户并不一定搜的是中文,输入法的原因可能输入的拼音,为了满足用户也为了搜索更加精准,扩展的分词器有拼音分词器、同义字分词器、繁体字转简体字等等,这里总结一下es使用拼音分词器
项目地址:https://github.com/medcl/elasticsearch-analysis-pinyin
源码大致原理为调用nlp工具包https://github.com/NLPchina
1、下载完项目之后需要根据自己当前的es版本选择代码分支
elasticsearch添加拼音分词搜索-小白菜博客
这里我的版本是7.17.4所以使用7.x这个分支的代码
2、修改pom.xml中的elasticsearch.version为自己的版本
elasticsearch添加拼音分词搜索-小白菜博客
3、mvn install之后在target文件夹elasticsearch-analysis-pinyin-xxx.jar复制到es安装目录plugins目录底下,解压之后后看到elasticsearch-analysis-pinyin-7.17.4.jar、 plugin-descriptor.properties和nlp-lang-1.7.jar
elasticsearch添加拼音分词搜索-小白菜博客
4、重启es,线上环境要注意
安装完成我们可以重构索引,使用pinyin分词器