在博文elasticsearch分词器中提到elasticsearch能够快速的通过搜索词检索出对应的文章归功于倒排索引,下面通过中文举例看看倒排索引。
中文分词器是做什么的呢? what? 通过名字就知道了啊,为什么还要问。。。下面通过三个文档示例,看看它是如何分词的
注意:不同的分词规则,分词结果不一样,选择根据分词器提供的分词规则找到适合的分词规则
通过上面的分词结果,发现拆分的每个词都是我们熟知的词语, 但是如果不使用中文分词,就会发现上面的文档把每个字拆分成了一个词,对我们中文检索很不友好。
看到上面中文分词器结果,就会有新的疑问,使用中文分词器那样分词效果有什么好处呢? 答案就是根据分词建立词汇与文档关系的倒排索引。这步都是es帮我们做的,下面通过我,爱,祖国三个词看看倒排索引,如下图:
通过上图中的倒排索引,我们搜索祖国时,es通过倒排索引可以快速的检索出文档1和文档3。如果没有中文分词器,搜索祖国就会被拆分祖国两个词的倒排索引, 就会把包含祖的文档都检索出来,很明显就会和我们想要的结果大相径庭。
IKAnalyzer: 免费开源的java分词器,目前比较流行的中文分词器之一,简单,稳定,想要特别好的效果,需要自行维护词库,支持自定义词典
结巴分词: 开源的python分词器,github有对应的java版本,有自行识别新词的功能,支持自定义词典
Ansj中文分词: 基于n-Gram+CRF+HMM的中文分词的java实现,免费开源,支持应用自然语言处理
Ansj和hanlp均基于自然处理语言,分词准确度高,活跃度来讲hanlp略胜一筹
通过前面教程中,我们发现短语我爱祖国,会被分词为, 我,爱,祖国三个词, 如果按照上面词典定义后, 我爱祖国会被当成一个词语不被分词。
其中 location 是指一个 url,比如 ,该请求只需满足以下两点即可完成分词热更新。
1·该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
2·该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。
可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。
截止目前,hanlp词库是最大,分词效果是最好。使用hanlp分词插件之前,建议先点击此处学习一下hanlp
hanlp的elasticsearch插件众多,这里选用了这个,这个插件支持的分词模式要多一些,截止现在此插件最新支持6.3.2,由于插件中包含很大的词典文件,建议此插件采用离线安装
上面的警告需要修改一下插件配置, 本方法仅限于博主对应的版本哟,其他版本没去试验
3·根据词典名调整hanlp配置中的词典配置,尤其注意CustomDictionaryPath的配置,以前采用的应用名,现在采用的中文名称
1·在配置文件中key为root的值对应目录下找到目录custom,进入此目录
3·在myDic.txt文件中添加词,分隔符为换行符, 词典格式为: [单词] [词性A] [A的频次] ,如图:
一定要重启es!!!一定要重启es!!!一定要重启es!!!返回搜狐,查看更多