概述
Elaticsearch在保存数据时,会根据创建索引的mapping映射对于每个字段的数据进行分词。同时在查询索引数据的时候会对于检索词进行分词,然后再检索。因此分词对于数据库的查询效率和相关度的关系是非常大的。
分词器的作用
ES在创建索引和查询索引的时候都需要需要用到分词器进行分词,而分词器的作用:
分词器的作用是把一段文本中的词按照一定规则进行切分
由于检索和分词都需要用到分词器,因此务必保证使用的一致性,否则由于分词规则的不同导致检索不出来结果
因为分词器对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的。
也就是说不同的分词器分词的规则是不同的!
分词器的操作分析
标准分词器模式
使用kibana执行dsl语句测试
#测试分词器
POST /_analyze
{
"analyzer": "standard",
"text":"学习Elasticsearch数据库"
}
分词结果:
{
"tokens" : [
{
"token" : "学",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "习",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "elasticsearch",
"start_offset" : 2,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "数",
"start_offset" : 15,
"end_offset" : 16,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "据",
"start_offset" : 16,
"end_offset" : 17,
"type" : "<IDEOGRAPHIC>",
"position" : 4
},
{
"token" : "库",
"start_offset" : 17,
"end_offset" : 18,
"type" : "<IDEOGRAPHIC>",
"position" : 5
}
]
}
由结果可见,标准分词器模式对于中文的分词并不友好,因此需要使用ik分词器
ik分词器
ik_smart:最少切分(最粗粒度的切分模式)
#测试分词器
POST /_analyze
{
"analyzer": "ik_smart",
"text":"学习Elasticsearch数据库"
}
分词结果:
ik_max_word:最多切分(最细粒度的切分模式)
#测试分词器
POST /_analyze
{
"analyzer": "ik_max_word",
"text":"学习Elasticsearch数据库"
}
分词结果:
分词的扩展
在数据库安装目录,/plugins/elasticsearch-analysis-ik-7.8.0/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"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
新增扩展字典
首先查看未扩展之前的检索
在配置文件同目录下新增扩展词典:myext.dict
重启es数据库,可以看到加载了自定义的扩展分词
重新执行分词语句,可以看到作为一个‘奥利给’词语被切分
新增扩展停止词字典
停止词的概念:
有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响。文本经过分词之后,停止词通常被过滤掉,不会被进行索引。
在检索的时候,用户的查询中如果含有停止词,检索系统在分词处理会将其过滤掉。
例如:
英文停用词:a、an、the、of等
中文停用词:的、了、着、是、标点符号等
停止词的作用
排除停用词可以加快建立索引的速度,减小索引库文件的大小,并且还可以提高查询的准确度。
停止词的操作测试
在配置文件同级目录下增加停止词配置
重启es数据库,可以看到加载了自定义的扩展分词
切分中已经去除了停止词