拼音搜索在中文搜索环境中是经常使用的一种功能,用户只需要输入关键词的拼音全拼或者拼音首字母,搜索引擎就可以搜索出相关结果。在国内,中文输入法基本上都是基于汉语拼音的,这种在符合用户输入习惯的条件下缩短用户输入时间的功能是非常受欢迎的。
在ES中可以使用拼音分析器插件进行拼音搜索,插件的项目地址为https://github.com/medcl/elasticsearch-analysis-pinyin,该插件对较新的ES版本并不支持,需要用户自行进行编译安装。
首先使用Git命令从互联网中复制该项目,命令如下:
git clone https://github.com/medcl/elasticsearch-analysis-pinyin
然后进入该项目,修改目录中的pom.xml文件,将elasticsearch.version选项的值修改成当前ES版本的值,如下图所示:
修改完成后保存文件并退出,使用mvn命令进行编译:
mvn install
安装完成后会在${PROJECT_PATH}/target/releases/目录下生成目标文件elasticsearch analysis-pinyin-7.13.2.zip。
在{ES_HOME}/plugins/目录下创建一个名称为pinyin-analysis的子目录,然后将上面的文件复制到该目录下,命令如下:
cp target/releases/elasticsearch-analysis-pinyin-7.13.2.zip /home/es/elasticsearch-7.13.2/plugins/ pinyin-analysis/
进入{ES_HOME}/plugins/pinyin-analysis目录,将elasticsearch-analysis-pinyin-7.10.2.zip文件解压缩。
重启ES,如果输出如下图所示的日志,表示安装成功。
拼音分析器提供的分析器为pinyin,另外还提供了与其同名的分词器和分词过滤器。安装完成后,可以使用pinyin分析器或分词器进行验证。
下面使用pinyin分析器对待测试文本进行分析,DSL如下:
- POST _analyze
- {
- "analyzer": "pinyin",
- "text":"天安门"
- }
也可以将拼音分析器应用到索引的字段中。以下示例中将自定义的ik_pinyin_analyzer分析器设置为旅馆索引中title字段的默认分析器,DSL如下:
- PUT /hotel
- {
- "settings": {
- "analysis": {
- "analyzer": { //自定义分词器
- "ik_pinyin_analyzer":{
- "tokenizer":"ik_max_word",//设置分词器
- "filter":["pinyin_filter"] //设置分词过滤器
- }
- },
- "filter": {
- "pinyin_filter":{ //定义分词过滤器
- "type":"pinyin",//封装拼音分词过滤器
- "keep_first_letter":true,//设置保留拼音的首字母
- "keep_full_pinyin":false,//设置保留拼音的全拼
- "keep_none_chinese":true//设置不保留中文
- }
- }
- }
- },
- "mappings": {
- "properties": {
- "title":{
- "type":"text",
- "analyzer": "ik_pinyin_analyzer"//设置使用自定义分析器
- }
- }
- }
- }
搜索关键词wy,目的是想搜索“文雅”相关的旅馆,DSL如下:
- GET /hotel/_search
- {
- "query": {
- "match": {
- "title": "wy"
- }
- }
- }
使用带有拼音词语过滤器的分析器后,就可以匹配查询词中的拼音首字母了。正如上面的一些示例,使用拼音分析器时,有很多的选项可以设置。例如,是否显示单字拼音的首字母、是否显示组合词的首字母、是否显示查询词的全部拼音等,具体的设置内容可以参考官网说明