标准的Elasticsearch分词器对中文的支持实在是太烂了,搜索出来的结果简直没法看,尤其这样还真不如不用。后来才知道还需要安装中文分词器的插件。
从网上搜索的结果来看,基本上都是以ik为主,那就选它了。

一、版本之选

在《为MediaWiki安装高级搜索(AdvancedSearch)插件》一文中我记录了为安装Elasticsearch服务所经历的种种,版本卸了装卸了装,好不容易全部搞定以为天下太平了,没想到在安装ik分词器时又一次地遭遇到版本问题。
从github上作者发布的版本来看,对于6.X最高是支持到6.8.13的,而此时此刻我因为yum update的缘故,已将Elasticsearch版本自动更新到了6.8.14,所以系统给我的提示如下:

Exception in thread "main" java.lang.IllegalArgumentException: Plugin [analysis-ik] was built for Elasticsearch version 6.8.13 but version 6.8.14 is running

好吧,只能重新安装一遍Elasticsearch了。

# systemctl stop elasticsearch
# yum remove elasticsearch
# yum install -y elasticsearch-6.8.13

注意:内存小的服务器重装之后记得修改-Xms和-Xmx的值。

二、安装ik分词器

从作者的文档中能看到,安装分词器可以有两种方式,一种是在插件目录/usr/share/elasticsearch/plugins下手动创建一个ik目录并下载对应版本的压缩包并解压;而另一种方式相对简单一点,通过elasticsearch-plugin install命令进行安装。在这里我选择后者,代码如下:

# /usr/share/elasticsearch/bin/elasticsearch-plugin install  https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.13/elasticsearch-analysis-ik-6.8.13.zip

重启elasticsearch服务,并确认一下状态。

# sudo systemctl start elasticsearch
# sudo systemctl status elasticsearch

需要确认插件安装情况的话,输入以下代码:

# /usr/share/elasticsearch/bin/elasticsearch-plugin list

显示结果为analysis-ik
也可以通过下属代码检验:

# curl localhost:9200/_cat/plugins

返回结果为XXXX analysis-ik 6.8.13

三、测试分词器效果

安装作者的文档,首先要建立一个索引,在控制台中输入:

curl -XPUT localhost:9200/index

这里可能会报错,是因为之前我们已经建立过索引了。
接下来创建mapping

curl -XPOST localhost:9200/index/fulltext/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word"
            }
        }

}'

返回结果{"acknowledged":true}
满以为搞定了,来到心百科的主页,然后在搜索框中输入需要搜索的词语,结果跟没装分词器一个样。
用api中的cirrus-settings-dump查看配置,其中有部分显示如下:

"source_text_plain": {
    "filter": [
        "lowercase"
    ],
    "char_filter": [
        "word_break_helper_source_text"
    ],
    "type": "custom",
    "tokenizer": "standard"
},

分词器还是使用的标准分词器,同样打开维基百科的,此处使用的则是icu_normalizer
icu为何物?

icu_分词器 和 标准分词器 使用同样的 Unicode 文本分段算法,只是为了更好的支持亚洲语,添加了泰语、老挝语、中文、日文、和韩文基于词典的词汇识别方法,并且可以使用自定义规则将缅甸语和柬埔寨语文本拆分成音节。

那就试着安装一下icu_分词器,同样通过elasticsearch-plugin install命令进行安装:

bin/elasticsearch-plugin install analysis-icu

重启elasticsearch服务:

# sudo systemctl restart elasticsearch

再次按照CirrusSearch的配置方法做一遍,貌似效果好多了。
MediaWiki_CirrusSearch_result.png
注意:如果刚刚执行完CirrusSearch的方法,搜索结果不一定完整,仍在生成中,所以可以耐心等一下,隔一段时间刷新一下会发现搜索结果的数量在不断增加中。
对比了一下维基百科的效果才发现,其实是我一直高看了它,搜索结果也不甚理想,对比一下(前一张是我的,后一张是维基百科的)。
MindSeed_CirrusSearch_result.png
Wikipedia_CirrusSearch_result.png
我终于可以放心了。不过,ik是不是会好一点呢?暂时不知道怎么切换。

参考文章

https://github.com/medcl/elasticsearch-analysis-ik/tree/6.x
https://www.elastic.co/guide/cn/elasticsearch/guide/current/icu-tokenizer.html
https://www.elastic.co/guide/en/elasticsearch/plugins/6.8/analysis-icu.html#analysis-icu

最后修改:2022 年 01 月 23 日
如果觉得我的文章对你有用,请随意赞赏