Elasticsearch 获取中文分词
本小节为用户呈现了直接调用 Elasticsearch API 的中文分词使用方式,为了在 Elasticsearch 中获取更好的中文分词效果,ELK 集成了 IK Analysis 中文分词插件,并为该插件提供了结巴分词的词库和 IK 自带的搜狗词库,同时还支持用户上传自定义词典。IK Analysis 插件用法请参考 IK Analysis plugin。
操作步骤
-
把自定义字典上传到可访问到的 HTTP 服务器上,本示例将通过如下命令上传到某个 Logstash 节点,用户也可以放在其他任意 HTTP 服务器,只要 Elasticsearch 节点可以访问到即可:
说明:
URL最后的
/
不能省略。curl -F "file=@-;filename=mydict.dic" $LS_IP/dicts/ <<- EOF 中国 EOF
上传成功后可通过访问 $LS_IP/dicts/mydict.dic 来查看上传的字典文件。
-
在集群详情页面中切换到配置参数标签页,选择"Elasticsearch节点"进行参数配置,设置
remote_ext_dict
设置项为用户自定义字典的可访问 URL(如示例的http://$LS_IP/dicts/mydict.dic
)后保存, 然后在集群列表页面 重启 集群中的 Elasticsearch 节点。 -
执行如下命令测试中文分词功能:
INDEX=chinese-news # 可根据实际情况调整 MAPPING_TYPE=_doc # 创建 $INDEX 索引 curl -XPUT $ES_IP:9200/$INDEX; echo URL=$ES_IP:9200/$INDEX # ELK 6.8.6 及以下版本请使用如下地址 # URL=$ES_IP:9200/$INDEX/$MAPPING_TYPE # 创建 mapping curl -s -H "Content-Type: application/json" $URL/_mapping -d' { "properties": { "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" } } }'; echo # 索引 一些 文档 postData() { local url=$ES_IP:9200/$INDEX/$MAPPING_TYPE curl -H "Content-Type: application/json" -d'{"content":"'$1'"}' $url; echo } sampleData=" 美国留给伊拉克的是个烂摊子吗 公安部:各地校车将享最高路权 " for data in $sampleData; do postData "$data"; done # 高亮查询 query() { curl -s -H "Content-Type: application/json" $ES_IP:9200/$INDEX/$MAPPING_TYPE/_search -d@- <<- EOF | { "query" : { "match" : { "content" : "$1" }}, "highlight" : { "pre_tags" : ["<tag1>", "<tag2>"], "post_tags" : ["</tag1>", "</tag2>"], "fields" : { "content" : {} } } } EOF grep --color "<tag1>[^<]*</tag1>" } words=" 中国 " sleep 5; for word in $words; do query "$word"; done
-
查看中文分词结果,即"中国"被当做固定的中文分词表示。
-
可根据实际需要随时更新用户自定义字典,Elasticsearch 会自动检测 HTTP 响应头中的 Last-Modified 和 ETag 的变化,来进行分词字典的热更新。