前言
分词是es进行搜索的一个核心内容,将输入内容分词之后,进行倒排索引的建立
那么有常见的有哪些呢?
- Standard Analyzer:默认分词器,适用于大多数语言,按空格和标点分词。
- IK Analyzer:适用于中文,提供轻量和智能两种模式,分词精度高。
- NGram Analyzer:通过生成字符 n-gram 来分词,适用于模糊匹配和拼音输入。
- Edge NGram Analyzer:生成字符前缀 n-gram,适用于自动补全和搜索提示。
- Whitespace Analyzer:只按空格分词,适用于简单的英文文本。
- Custom Analyzer:用户自定义分析器,灵活组合分词器和过滤器。
- Language-specific Analyzers:针对特定语言优化的分词器,如英文、法文等。
- Pattern Analyzer:使用正则表达式进行分词,适用于特定模式文本。
- Snowball Analyzer:支持多语言的词干提取,适合信息检索。
- Keyword Analyzer:不进行分词,适合精确匹配场景。
- Pinyin Analyzer:Elasticsearch 可以通过插件支持拼音分词器,常见的插件是
<font style="color:rgb(36, 41, 47);background-color:rgb(244, 246, 248);">elasticsearch-analysis-pinyin</font>
。该分词器会将中文汉字转换为拼音,并生成对应的拼音索引,以便进行拼音查询。
而在国内实际使用的业务的话,一般就是中文分词器IK Analyzer、拼音分词器Pinyin Analyzer、以及默认的标准分词器Standard Analyzer。
我们也以这其中的使用的比较多的中文分词器IK Analyzer、拼音分词器Pinyin Analyzer作为讲解
中文分词器IK Analyzer
默认的分词器是标准分词器,它会将文本分割为单词,并去除停用词(如“的”、“是”等),在生产实际使用过程中,是不符合国内的业务的
所以我们需要引入中文分词器 ik
- IK Analyzer:一个流行的中文分词插件,支持细粒度和粗粒度两种分词模式,适合处理中文文本。
安装步骤
注意:安装的版本需要跟es的版本保持一致,我这里使用的7.3.2的
下载
- 方式一:如果需要的ik是7.3.2 ,否则可以选择其他的方式
- 公众号获取,回复
ik<font style="color:rgb(26, 27, 28);">分词器</font>
- 方式二:github下载
https://github.com/infinilabs/analysis-ik/tags
找到自己需要的版本
例如我需要下载v7.3.2
下载zip的方式
上传,解压
# 切换到es下的plugins 这里根据自己es的安装目录
cd elasticsearch-7.3.2/plugins
# 上传
rz
# 解压
unzip elasticsearch-analysis-ik-7.3.2.zip -d ik
# 删除压缩包,否则启动会报错
rm -rf elasticsearch-analysis-ik-7.3.2.zip
重启es
<font style="color:rgb(36, 41, 47);background-color:rgb(244, 246, 248);">ps -ef|grep elasticsearch</font>
查看es的pid
- 杀死程序 kill -9 pid
- 进入es的bin目录,执行
<font style="color:rgb(36, 41, 47);background-color:rgb(244, 246, 248);">./elasticsearch -d</font>
分词测试
使用kibana进行查看
- 标准分词器测试
POST /_analyze
{
"tokenizer": "standard",
"text": "Elasticsearch分词器测试"
}
- ik分词器测试
POST /_analyze
{
"tokenizer": "ik_max_word",
"text": "Elasticsearch分词器测试"
}
可以看出二者的区别
拼音分词器Pinyin Analyzer
安装步骤
下载
方式一:
不过我的版本是7.3.2
关注I am Walker
回复pinyin
即可获取
方式二:
https://github.com/infinilabs/analysis-pinyin/tags
注意:需要注意,和自己es的版本需要一致,以我的版本为例 7.3.2
之后下载zip压缩包
上传插件
注意:先切换到es的启动用户,例如我的是esuser
su esuser
将zip压缩包上传es的plugins路径下
rz
# 解压
unzip elasticsearch-analysis-pinyin-7.3.2.zip -d pinyin
# 删除压缩包
rm -rf elasticsearch-analysis-pinyin-7.3.2.zip
重启
进入es目录,执行bin/elasticsearch -d
验证
GET /_analyze
{
"analyzer": "pinyin",
"text": "大帅哥就是我"
}
可以看到执行结果:
Springboot+EasyEs实现多分词器
针对详细的实现,具体可以参考
Easy-es 太绝了!
依赖
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<!--这里Latest Version是指最新版本的依赖,比如2.0.0,可以通过下面的图片获取-->
<version>2.0.0</version>
</dependency>
类的属性
@MultiIndexField(mainIndexField = @IndexField(fieldType = FieldType.KEYWORD),
otherIndexFields = {@InnerIndexField(suffix = "zh", fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART),
@InnerIndexField(suffix = "pinyin", fieldType = FieldType.TEXT, analyzer = Analyzer.PINYIN)})
private String multiField;
搜索的时候
LambdaEsQueryWrapper<AlarmRecordEntity> wrapper = new LambdaEsQueryWrapper<>();
// 补充多分词查询
if(StrUtil.isNotEmpty(form.getMultiField())){
wrapper.like(AlarmRecordEntity::getMultiField,form.getMultiField())
.or()
.like("multiField.zh",form.getMultiField())
.or()
.like("multiField.pinyin",form.getMultiField());
}
然后进行测试验证也是ok的
参考文档
https://www.jianshu.com/p/653f7b33e63c