拼音搜素在中文搜索环境中是经常使用的一种功能,用户只需输入关键词的拼音全拼或者拼音首字母,搜索引擎就可以搜索出相关结果。ES提供拼音分析器插件来满足拼音搜索的需求。
安装maven
安装拼音分析器插件前,先安装maven:
1、官网下载apache-maven-3.9.0-bin.zip压缩包:https://maven.apache.org/download.cgi
2、新建系统变量:
变量名:MAVEN_HOME
变量值:C:apache-maven-3.9.0
3、编辑系统变量path:
%MAVEN_HOME%bin
4、然后测试是否配置成功
C:WINDOWSsystem32>mvn -v
Apache Maven 3.9.0 (9b58d2bad23a66be161c4664ef21ce219c2c8584)
Maven home: C:apache-maven-3.9.0
Java version: 19.0.2, vendor: Oracle Corporation, runtime: C:Program FilesJavajdk-19
Default locale: zh_CN, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
可能出现错误信息:The JAVA_HOME environment variable is not defined correctly,this environment。查明原因未安装JDK,JDK安装方式参考:安装JMeter测试工具文章。
安装拼音分析器插件
1、首先使用git命令复制该插件到本地,命令如下:
$ git clone https://github.com/medcl/elasticsearch-analysis-pinyin
2、进入该项目,修改目录中的pom . xml文件,将elasticsearch.version选项修改成当前es版本的值,如下所示:
<properties>
<elasticsearch.version>8.5.0</elasticsearch.version>
<maven.compiler.target>1.8</maven.compiler.target>
修改完成后,使用mvn命令进行编译:
C:elasticsearch-analysis-pinyin>mvn install
安装完成后会在elasticsearch-analysis-pinyin目录下生成target文件夹,进入C:elasticsearch-analysis-pinyintargetreleases文件夹下会看到生成elasticsearch-analysis-pinyin-8.5.0.zip文件,解压该文件。lasticsearch-analysis-pinyin-8.5.0目录有如下文件:
3、进入ES的安装目录C:elasticsearch-8.5.0plugins,创建一个名称为pinyin-analysis的子目录,然后将elasticsearch-analysis-pinyin-8.5.0文件夹的文件复制到该目录下。
4、重启es,有如下输出信息,表示安装成功:
[2023-03-14T23:59:23,361][INFO ][o.e.p.PluginsService ] [LAPTOP-OVFTH3H5] loaded plugin [analysis-pinyin]
拼音分析器插件使用
拼音分析器提供的分析器为pinyin,另外还提供了与其同名的分词器和分词过滤器。安装完成后,可以使用pinyin分析器或分词器进行验证。下面使用pinyin分析器对测试文本进行分析:
POST _analyze
{
"analyzer": "pinyin",
"text": "王府井"
}
分析结果如下:
{
"tokens": [
{
//王的拼音形式
"token": "wang",
"start_offset":0,
"end_offset":0,
"type": "word",
"position": 0
},{
//王府井的拼音形式
"token": "wfj",
"start_offset":0,
"end_offset":0,
"type": "word",
"position": 0
},{
//府的拼音形式
"token": "fu",
"start_offset":0,
"end_offset":0,
"type": "word",
"position": 1
},{
//井的拼音形式
"token": "fu",
"start_offset":0,
"end_offset":0,
"type": "word",
"position": 2
}
]
}
在上面的代码中,王府井被切分成拼音wang、fu、jing及首字母wfj。
也可以将拼音分析器应用到索引的字段中。以下示例中将自定义的ik_pinyin_analyzer分析器设置为酒店索引中title字段的默认分析器,如下所示:
PUT /hotel
{
"settings": {
"analysis": {
"analyzer": { //自定义分析器
"ik_pinyin_analyzer": {
"tokenizer": "ik_max_word", //设置分词器为ik_max_word
"filter":["pinyin_filter"] //设置分词过滤器为pinyin_filter
}
},
"filter": { //定义分词过滤器
"pinyin_filter": {
"type": "pinyin", //封装pinyin分词过滤器
"keep_first_letter": true, //设置保留拼音的首字母
"keep_full_pinyin": false, //设置保留拼音的全拼
"keep_none_chinese": true, //设置不保留中文
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_pinyin_analyzer" //设置使用自定义分析器
}
}
}
}
为演示方便,下面向酒店索引中写入如下数据:
POST /_bulk
{"index":{"_index":"hotel","_id":"001"}}
{"title": "文雅假日酒店"}
{"index":{"_index":"hotel","_id":"002"}}
{"title": "北京金都嘉怡酒店"}
{"index":{"_index":"hotel","_id":"003"}}
{"title": "天津金都欣欣酒店"}
{"index":{"_index":"hotel","_id":"004"}}
{"title": "金都酒店"}
{"index":{"_index":"hotel","_id":"005"}}
{"title": "文雅精选酒店"}
搜索关键词wy,目的是想搜索“文雅”相关的酒店如下所示:
GET /hotel/_search
{
"query": { //搜索匹配wy的文档
"match": {
"title": "wy"
}
}
}
搜索结果如下:
{
…
"hits" : {
…
"hits" : [
{
"_index" : "hotel",
"_type" : "_doc",
"_id" : "005",
"_score" : 0.919734,
"_source" : {
"title" : "文雅精选酒店" //字段中的“文雅”和查询词wy匹配
}
},
{
"_index" : "hotel",
"_type" : "_doc",
"_id" : "001",
"_score" : 0.816522,
"_source" : {
"title" : "文雅假日酒店" //字段中的“文雅”和查询词wy匹配
}
}
]
}
}
由此可见,使用带有拼音词语过滤器的分析器后,就可以匹配查询词中的拼音首字母了。正如上面的一些示例,使用拼音分析器时,有很多的选项可以设置。例如:是否显示单字拼音的首字母、是否显示组合词的首字母、是否显示查询词的全部拼音等,具体的设置内容可以参考官网说明。
原文始发于微信公众号(面试技术):Elasticsearch拼音分析器使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/186871.html