前言
分词是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 可以通过插件支持拼音分词器,常见的插件是elasticsearch-analysis-pinyin。该分词器会将中文汉字转换为拼音,并生成对应的拼音索引,以便进行拼音查询。
而在国内实际使用的业务的话,一般就是中文分词器IK Analyzer、拼音分词器Pinyin Analyzer、以及默认的标准分词器Standard Analyzer。
我们也以这其中的使用的比较多的中文分词器IK Analyzer、拼音分词器Pinyin Analyzer作为讲解
中文分词器IK Analyzer
默认的分词器是标准分词器,它会将文本分割为单词,并去除停用词(如“的”、“是”等),在生产实际使用过程中,是不符合国内的业务的
所以我们需要引入中文分词器 ik
- IK Analyzer:一个流行的中文分词插件,支持细粒度和粗粒度两种分词模式,适合处理中文文本。
安装步骤
注意:安装的版本需要跟es的版本保持一致,我这里使用的7.3.2的
下载
-
方式一:如果需要的ik是7.3.2 ,否则可以选择其他的方式
-
公众号获取,回复
ik分词器
- 方式二:github下载
找到自己需要的版本
例如我需要下载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
ps -ef|grep elasticsearch查看es的pid
-
杀死程序 kill -9 pid
-
进入es的bin目录,执行
./elasticsearch -d
分词测试
使用kibana进行查看
- 标准分词器测试
POST /_analyze
{
"tokenizer": "standard",
"text": "Elasticsearch分词器测试"
}
- ik分词器测试
POST /_analyze
{
"tokenizer": "ik_max_word",
"text": "Elasticsearch分词器测试"
}
可以看出二者的区别
拼音分词器Pinyin Analyzer
安装步骤
下载
方式一:
如果你觉得github下载比较慢的话,可以关注公众号获取
不过我的版本是7.3.2
关注I am Walker 回复pinyin即可获取
方式二:
注意:需要注意,和自己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实现多分词器
针对详细的实现,具体可以参考
依赖
<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的
如果需要源码,可以关注一下公众号,回复项目源码即可
参考文档
本文使用 文章同步助手 同步