ES 分词器

分词器:

  • ES在创建倒排索引时需要对文档分词。
  • 在搜索时,需要对用户输入内容分词。

但默认的分词规则对中文处理并不友好。

在kibana的DevTools中测试:

POST /_analyze
{
"analyzer": "standard",
"text": "张三老铁学习java!"
}

post代表请求方式。
/_analyze代表分词分析。
analyzer分词类型,这里是默认的standard分词器。
text要分词的内容。

中文都直接被拆分成了一个个汉字,所以不能此分词器,要用lk分词器。

安装ik分词器
在线安装,不推荐较慢

# 进入容器内部
docker exec -it elasticsearch /bin/bash

# 在线下载并安装
./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

#退出
exit
#重启容器
docker restart elasticsearch

离线安装,推荐

# 查看elasticsearch的plugins目录位置
docker volume inspect es-plugins

ES 分词器_第1张图片
说明plugins目录被挂载到了

/var/lib/docker/volumes/es-plugins/_data 

上传离线包到此目录
然后重启

docker restart es
# 查看日志
docker logs -f es

回到kibana中测试
ik分词器包含两种模式:
ik_smart:最少切分,分词少,但占用内存低一些
ik_max_word:最细切分,分词多,但占用内存多

ik_smart

POST /_analyze
{
"analyzer": "ik_smart",
"text": "张三老铁学习java!"
}

返回

{
  "tokens" : [
    {
      "token" : "张",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "三老",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "铁",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "CN_CHAR",
      "position" : 2
    },
    {
      "token" : "学习",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "java",
      "start_offset" : 6,
      "end_offset" : 10,
      "type" : "ENGLISH",
      "position" : 4
    }
  ]
}


ik_max_word

POST /_analyze
{
"analyzer": "ik_max_word",
"text": "张三老铁学习java!"
}

返回

{
  "tokens" : [
    {
      "token" : "张三",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "三老",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "三",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "TYPE_CNUM",
      "position" : 2
    },
    {
      "token" : "老",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
      "token" : "铁",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "CN_CHAR",
      "position" : 4
    },
    {
      "token" : "学习",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "java",
      "start_offset" : 6,
      "end_offset" : 10,
      "type" : "ENGLISH",
      "position" : 6
    }
  ]
}


分词器原理
分词器有对应的字典,分词时匹配字典,如果有就分词。

对于字典中不存在的,想在使用,就需要个性化设置,也就是拓展。

拓展与停用
修改ik分词器目录中的config目录中的ikAnalyzer.cfg.xml文件:



	IK Analyzer 扩展配置
	
	ext.dic
	 
	stopword.dic
	
	
	
	


指定拓展与停止文件后,在当前目录下新建ext.dic与stopword.dic
ext.dic

老铁

stopword.doc
有现在的文件,不需要新建,直接追加

的
了
哦
啊
嗯

替换文件后,重启ES

docker restart es

再测试

POST /_analyze
{
"analyzer": "ik_smart",
"text": "张三的老铁学习java!"
}

返回中有【老铁】分词,【的】也去掉了

{
  "tokens" : [
    {
      "token" : "张三",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "老铁",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "学习",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "java",
      "start_offset" : 7,
      "end_offset" : 11,
      "type" : "ENGLISH",
      "position" : 3
    }
  ]
}

你可能感兴趣的:(elasticsearch,elasticsearch)