相信你们在开发博客,在线商城的时候会涉及到搜索功能。而近几年火起来的 ElasticSearch(ES)凭借其稳定、可靠、快速的实时搜索广泛受到你们的好评,连 Github、SoundCloud 也都将 ES 做为其核心搜索组件。html
可是 ES 自己对中文分词和搜索比较局限。由于内置的分析器在处理中文分词时,只有两种方式:一种是单字(unigrams)形式,即简单粗暴的将中文的每个汉字做为一个词(token)分开;另外一种是两字(bigrams)的,也就是任意相邻的两个汉字做为一个词分开。这两种方式都不能很好的知足如今的中文分词需求,进而影响了搜索结果。git
举个例子:
假设咱们的 index 里面存储了3篇 documents 以下:github
id | content |
---|---|
1 | 美称中国武器商很神秘 花巨资海外参展却一声不响 |
2 | 在第一界国际锦标赛中 国家表明李雷勇夺冠军 |
3 | 国武公司近日上市 |
Case 1:查询“中国”,指望只获得 id 为1的 document。json
用 unigram 的分析器(即默认的 Standard Analyzer)查询结果为 id 1和 id 2的content;bigram 的分析器(名为cjk)的结果为id 1。Standard Analyzer 没有给出预期结果是由于它把“中国”切分为“中”、“国”2个 token,所以误给出了 id 2的结果。api
Case 2:查询“国武”这一家公司,指望只获得 id 为3的 document。bash
Standard Analyzer 和 cjk 的查询结果都会同时给出 id 1和 id 3的 document,可是 id 1 的 document 中的“国武”并非所指的公司。elasticsearch
(注:以上查询均用query_string)测试
所以咱们能够发现内置的分析器有它的局限性,并不能知足复杂或者特定的搜索需求。为此,玻森数据开发了一款基于玻森中文分词的 ES 插件(Elasticsearch-Analysis-BosonNLP),方便你们对中文数据进行更精确的搜索。插件
如今已有一些成熟的 ES 中文分词插件,但在分词引擎准确率上,相信 BosonNLP 的中文分词能知足你们不一样领域上多样化的需求。有兴趣的朋友能够查看11款开放中文分词引擎大比拼。3d
接下来,3分钟教会你们如何安装使用玻森 ES 中文分词插件 Beta 版(以 ES 2.2.0 版本为例):
安装
只需以下一个命令。
$ sudo bin/plugin install https://github.com/bosondata/elasticsearch-analysis-bosonnlp/releases/download/1.3.0-beta/elasticsearch-analysis-bosonnlp-1.3.0-beta.zip
注:对于其余不一样版本的 ES,只须要在命令里更换对应的插件版本号便可。
使用
须要在elasticsearch.yml
文件中的 analyzer 里配置好玻森 bosonnlp analyzer(须要配置 API_TOKEN 以及分词的参数)。详情解释请查看 Github 上的README。
bosonnlp: type: bosonnlp API_URL: http://api.bosonnlp.com/tag/analysis API_TOKEN: *PUT YOUR API TOKEN HERE*
完成以上步骤以后即可以使用玻森 ES 分词插件了。
对比以前 Case 2 的查询: 查询“国武”这一家公司,指望只获得 id 为3的 document。玻森ES分词插件搜索结果:
{ "took" : 70, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.15342641, "hits" : [ { "_index" : "bosonnlp_test", "_type" : "text", "_id" : "3", "_score" : 0.15342641, "_source": { "content":"国武公司近日上市" } } ] } }
固然,若是对分词有特定需求的小伙伴能够在配置里修改对应的参数。目前,玻森数据对于中文分词提供了繁简转换、新词发现等功能,能知足不一样领域的搜索需求。
但愿这款插件能提高你的工做效率!