一、拼音分词器:
当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图:
这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。
GET /_analyze
{"text":"我爱螺蛳粉","analyzer": "pinyin"
}
这个错误表明 Elasticsearch 在使用全局分析器 pinyin
时遇到了问题,因为它无法找到这个全局分析器。可能是由于缺少配置或插件问题导致的。你需要确保已正确配置了 pinyin
分析器,并且相关的插件已经正确安装和配置:
正确结果会是这样的:
1.1、在线安装拼音分词器:
# 进入容器内部
docker exec -it es /bin/bash# 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.12.1/elasticsearch-analysis-pinyin-7.12.1.zip#退出
exit
#重启容器
docker restart es
说明:安装的链接怎么获得
[root@db301601 ~]# docker exec -it es bash
[root@877298bbcfdf elasticsearch]# cd /usr/share/elasticsearch/bin
[root@877298bbcfdf bin]# ls
elasticsearch elasticsearch-cli elasticsearch-env-from-file elasticsearch-node elasticsearch-setup-passwords elasticsearch-sql-cli-7.12.1.jar x-pack-env
elasticsearch-certgen elasticsearch-croneval elasticsearch-keystore elasticsearch-plugin elasticsearch-shard elasticsearch-syskeygen x-pack-security-env
elasticsearch-certutil elasticsearch-env elasticsearch-migrate elasticsearch-saml-metadata elasticsearch-sql-cli elasticsearch-users x-pack-watcher-env
[root@877298bbcfdf bin]# cd /usr/share/elasticsearch
[root@877298bbcfdf elasticsearch]# ls
LICENSE.txt NOTICE.txt README.asciidoc bin config data jdk lib logs modules plugins
[root@877298bbcfdf elasticsearch]# cd /usr/share/elasticsearch/plugins
[root@877298bbcfdf plugins]# ls
analysis-ik[root@db301601 ~]# docker exec -it es /bin/bash
[root@877298bbcfdf elasticsearch]# ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.12.1/elasticsearch-analysis-pinyin-7.12.1.zip[root@877298bbcfdf elasticsearch]# ls
LICENSE.txt NOTICE.txt README.asciidoc bin config data jdk lib logs modules plugins
[root@877298bbcfdf elasticsearch]# cd plugins
[root@877298bbcfdf plugins]# ls
analysis-ik analysis-pinyin
./
是指当前目录的简写。在Linux和类Unix系统中,.
表示当前目录,..
表示上一级目录。因此,./
表示当前目录下的文件或目录。在你的命令中,./elasticsearch-plugin
意味着你希望在当前目录中执行名为elasticsearch-plugin
的可执行文件。- 使用正确的命令来删除 Elasticsearch 中的插件。正确的命令是
elasticsearch-plugin remove analysis-ik
。这个命令会将名为analysis-ik
的插件从 Elasticsearch 中移除。 elasticsearch-plugin
命令会将插件安装到 Elasticsearch 的插件目录中。通常情况下,插件目录位于 Elasticsearch 安装目录的plugins
文件夹下。具体位置可能因操作系统和安装方式而异,但通常在/usr/share/elasticsearch/plugins
或/opt/elasticsearch/plugins
等位置。
1.2、离线安装拼音分词器:
安装插件需要知道elasticsearch的plugins目录位置,而我们用了数据卷挂载,因此需要查看elasticsearch的数据卷目录,通过下面命令查看数据卷目录:
docker volume inspect es-plugins
[root@db301601 ~]# docker restart es
es
[root@db301601 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
877298bbcfdf elasticsearch:7.12.1 "/bin/tini -- /usr/l…" 41 hours ago Up 2 seconds 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp es
881f28a337e6 kibana:7.12.1 "/bin/tini -- /usr/l…" 42 hours ago Up 42 hours 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp kibana
[root@db301601 ~]# docker volume ls
DRIVER VOLUME NAME
local 03b04390f4eefc2da60368f67dbc266b76ccb710fe4275535f77a2067204da11
local 7df7ad63d90a9a6c2e3440b37e261039402950dd96f11677c8936dacd2c03210
local ece02e3c8db3e86860f63fcc1fe9eb0a7c6f42a2b10d7a6c93d7172017886f40
local ef6b9cdbe2110ec4802b5941d87d83250d1eb12a547a61ed342a59776fa94184
local es-data
local es-logs
local es-plugins
local root_data01
local root_data02
local root_data03
[root@db301601 ~]# docker volume inspect es-plugins
[{"CreatedAt": "2024-04-26T16:46:19+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/es-plugins/_data","Name": "es-plugins","Options": null,"Scope": "local"}
]
[root@db301601 ~]# cd /var/lib/docker/volumes/es-plugins/_data
[root@db301601 _data]# ls
py
说明plugins目录被挂载到了:/var/lib/docker/volumes/es-plugins/_data
这个目录中。
解压缩分词器安装包:把下载好的ik
分词器解压缩,重命名为ik:
上传到es
容器的插件数据卷中:
重启容器: docker restart es(容器名字)
二、自定义分词器
注意事项:
pinyin分词器默认时有很多缺点,比如每个字都拆分变成拼音,不符合一般需求,并且如果使用pinyin分词器,默认的中文索引就没了,只剩下pinyin索引了。所以,需要完善以下几点:
- 分词时不仅包含汉字,还需包含拼音
- 分词时按词分,不是字
- 使用汉字查询时,不会查询到同音词条目docs
如果只是单独使用拼音分词器,是没办法满足具体业务使用场景的,这时候就需要自定义分词器, 通过自定义分词器,将ik分词器与拼音分词器整合起来,来保证我们的搜索既满足汉字也满足拼音:
自定义分词器一定是在创建索引库的时候去设置,它只对你所指定的索引库test有效
在做mapping映射时,指定两个:analyzer是创建索引时用的,search_analyzer是在搜索时需要的