4 ElasticSearch分词器

4.1 内置分词器

ElasticSearch 核心功能就是数据检索,首先通过索引将文档写入es。查询分析主要分为两个步骤:

  1. 词条化:分词器将输入的文本转化为词条流。
  2. 过滤:比如停用词过滤器会从词条中去除不相干的词条(的,嗯,啊,呢);另外还有同义词过滤器、小写过滤器等。

ElasticSearch 中内置了多种分词器可以供使用:

分词器 作用
Standard Analyzer 标准分词器
Simple Analyzer 简单分词器,基于非字母字符进行分词,单词会被转化为小写字母
Whitespace Analyzer 空格分词器
Stop Analyzer 类似于简单分词器,但是增加了停用词的功能
Keyword Analyzer 关键词分词器,输入文本等于输出文本
Pattern Analyzer 利用正则表达式对文本进行切分,支持停用词
Language Analyzer 针对特定语言进行的分词器
Fingerprint Analyzer 指纹分析仪分词器,通过创建标记进行检测

4.2 中文分词器

在 Es 中,使用较多的中文分词器是 elasticsearch-analysis-ik,这个是 es 的一个第三方插件,代码托管在 GitHub 上:

https://github.com/medcl/elasticsearch-analysis-ik

4.2.1 安装

  1. 首先打开分词器官网:https://github.com/medcl/elasticsearch-analysis-ik。
  2. https://github.com/medcl/elasticsearch-analysis-ik/releases 页面找到最新的正式版,下载下来。我们这里的下载链接是 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip。
  3. 将下载文件解压。
  4. 在 es/plugins 目录下,新建 ik 目录,并将解压后的所有文件拷贝到 ik 目录下。
  5. 重启 es 服务。

4.2.2 测试

  • 使用elastic-head:

请求体
POST http://192.168.19.10:9200/first_test/_analyze
{
"analyzer":"ik_smart",
"text":"我想查询中国人"
}
// first_test为索引

{
	"tokens": [
		{
			"token": "我",
			"start_offset": 0,
			"end_offset": 1,
			"type": "CN_CHAR",
			"position": 0
		},
		{
			"token": "想",
			"start_offset": 1,
			"end_offset": 2,
			"type": "CN_CHAR",
			"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
		}
	]
}
  • 使用kibana测试

请求体
GET first_test/_analyze
{
"analyzer": "ik_max_word",
"text": "我是中国人"
}
analyzer说明:指定分词方式

  1. ik_max_word:会将文本做最细粒度的拆分
  2. ik_smart: 会做最粗粒度的拆分
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "中国人",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "中国",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "国人",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}

4.3 自定义扩展词库

4.3.1 本地自定义

在 es/plugins/ik/config 目录下,新建 ext.dic 文件(文件名任意),在该文件中可以配置自定义的词库。

ext.dic

我是中国人
我是男人

如果有多个词,换行写入新词即可。

然后在 es/plugins/ik/config/IKAnalyzer.cfg.xml 中配置扩展词典的位置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict">ext_dict</entry>
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords"></entry>
	<!--用户可以在这里配置远程扩展字典 -->
	<!-- <entry key="remote_ext_dict">words_location</entry> -->
	<!--用户可以在这里配置远程扩展停止词字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

4.2.3.2 远程词库

也可以配置远程词库,远程词库支持热更新(不用重启 es 就可以生效)。热更新只需要提供一个接口,接口返回扩展词即可。

posted on 2021-11-10 15:45  --工具人  阅读(299)  评论(0编辑  收藏  举报