大纲
一、elasticsearch6 ansj分词简介
二、elasticsearch6 ansj分词安装
三、elasticsearch6 ansj分词配置
四、elasticsearch6 ansj分词使用
五,总结
一 ansj介绍
nsj_seg分词器个人觉得是开源分词器里最强悍功能最丰富的。ansj_seg基于中科院的 ictclas 中文分词算法,智能、高效。虽然现在已经有ictclas 的for java版本,但是 ansj_seg从实现到使用来说要强大的多,很多细节和小功能都有考虑,在索引和自然语言分析方面都有很优秀的表现。ansj_seg可以作为ictclas 算法实现的分词器的代表。
ansj分词插件的说明
es5.0版本之前配置ansj均是在elasticsearch.yml中配置
es5.0版本及之后,均不支持配置文件方式,仅支持api方式进行设置
ansj分词插件的安装
分词插件的下载
从github开源网址下载
https://github.com/NLPchina/elasticsearch-analysis-ansj/releases/download/v6.2.2/elasticsearch-analysis-ansj-6.2.2.0-release.zip
二 ansj分词安装
分词插件的配置步骤
1 将下载下来的zip包,拷贝到es_home/plugins下
2 将zip解压到当前目录下
3 将之前的es-ansj的zip包删除掉。
4 重启es(使之加载分词器配置,使之具备分词的能力,此时还不能生效和使用)
三 ansj分词配置
通过es提供的api方式配置ansj分词插件
1、首先关闭索引服务(分词配置不支持动态设置,须关闭索引服务后才可以进行设置分词)
curl -XPOST ‘127.0.0.1:9200/_all/_close’
2、设置分词方式
curl -XPUT ‘http://127.0.0.1:9200/_all/_settings?preserve_existing=true’ -H ‘Content-Type: application/json’ -d ‘{
“index.analysis.analyzer.default.type” : “index_ansj”,
“index.analysis.analyzer.default_search.type” : “query_ansj”
}’
4 关于分词方式的说明、
索引分词
尽可能分出所有的分词结果,尽量提高召回率
召回率
官方定义:搜索结果的正确内容条目占文档中所有相关内容条目的比例
白话解释:应该被搜索出来的东西,尽可能都被搜索出来,即hit命中的比例
搜索分词
一定是索引分词的一个子集,尽量保证准确率
5 准确率
官方定义:搜索结果中的正确内容条目占搜索出来的内容条目的比例
白话解释:尽量保证搜索出来的内容条目,对的越多越好。
6 打开索引服务,对外正常提供搜索服务
curl -XPOST ‘127.0.0.1:9200/_all/_open’
7 ansj分词插件安装成功后的测试
web http请求接口说明
/_cat/ansj: 执行分词
/_cat/ansj/config: 显示全部配置
/_ansj/flush/config: 刷新全部配置
/_ansj/flush/dic: 更新全部词典。包括用户自定义词典,停用词典,同义词典,歧义词典,crf
web http请求接口测试
http://127.0.0.1:9200/_cat/ansj?text=长春市长春节讲话&type=index_ansj
问题发现
索引分词效果并不理想,分的不够细,会直接影响搜索效果。
主要原因:开源版es-ansj分词的配置有bug,没有加载完全词库导致的。
解决方法
a、下载ansj分词最新版,获取其最新分词库和配置文件
下载地址-1:https://github.com/NLPchina/ansj_seg/releases,找最新版即可
不知道是什么原因,半天没下下来。可以在git上只下载需要的文件即可。
b、解压缩后,拿到其library目录和ansj_library.properties文件
c、将如上2个文件,拷贝到es_home根目录下
d、重启es即可生效
web http请求接口再测试,依然以之前的示例作为比较,即可获取理想的索引和搜索分词的效果。
四 ansj分词使用
es-ansj插件使用介绍
通过head新建一个索引以及一个类型的mapping结构,并指定相关字段的分词设置
原生结构
curl -XPUT http://localhost:9200/test -H ‘Content-Type: application/json’ -d ‘{
“settings” : {
“number_of_shards” : 1,
“number_of_replicas” : 0
},
“mappings” : {
“student” : {
“_all” : { “enabled” : false },
“properties” : {
“name” : { “type” : “text”, “analyzer” : “index_ansj”, “search_analyzer” : “query_ansj” },
“classname” : { “type” : “text”, “analyzer” : “index_ansj”, “search_analyzer” : “query_ansj” },
“gender” : { “type” : “text” }
}
}
}
}’
通过head复合页面发送请求
{
“settings” : {
“number_of_shards” : 1,
“number_of_replicas” : 0
},
“mappings” : {
“student” : {
“_all” : { “enabled” : false },
“properties” : {
“name” : { “type” : “text”, “analyzer” : “index_ansj”, “search_analyzer” : “query_ansj” },
“classname” : { “type” : “text”, “analyzer” : “index_ansj”, “search_analyzer” : “query_ansj” },
“gender” : { “type” : “text” }
}
}
}
}
通过head向指定索引名称及其指定的type新建一条数据
原生结构
curl -XPUT ‘http://localhost:9200/test/student/1?pretty’ -H ‘Content-Type: application/json’ -d ‘
{
“name”: “张自强”,
“classname”: “计算机科技技术1班”,
“gender”: “男生”
}’
通过head复合页面发送请求
{
“name”: “张自强”,
“classname”: “计算机科技技术1班”,
“gender”: “男生”
}
//第2名
{
“name”: “李四”,
“classname”: “计算机科技技术2班”,
“gender”: “男生”
}
//第3名
{
“name”: “张萌萌”,
“classname”: “软件工程3班”,
“gender”: “女生”
}
五 总结
1 word分词器
word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。 同时提供了Lucene、Solr、ElasticSearch插件。
可参考:
- http://my.oschina.net/apdplat/blog/228615?p=1 里面对word分词器介绍得很详细
- word分词器的主页:https://github.com/ysc/word
2 ansj
ansj_seg分词器个人觉得是开源分词器里最强悍功能最丰富的。ansj_seg基于中科院的 ictclas 中文分词算法,智能、高效。虽然现在已经有ictclas 的for java版本,但是 ansj_seg从实现到使用来说要强大的多,而且作者自产自销自用,很多细节和小功能都有考虑,在索引和自然语言分析方面都有很优秀的表现。ansj_seg可以作为ictclas 算法实现的分词器的代表出场。
可参考:
- ansj分词器主页 https://github.com/NLPchina/ansj_seg
- ansj_seg中文分词实例 http://www.blogchong.com/post/78.html
3 IKanalyzer
IKanalyzer采用的是“正向迭代最细粒度切分算法”,是比较常见而且很容易上手的分词器了。一般新手上路学习lucene或者solr都会用这个。优点是开源(其实java分词器多是开源的,毕竟算法都是业内熟知的)、轻量、目前来看没有太大的bug,源码简单易懂,做二次开发也很简单,即使遇到solr/Lucene版本更新,只需要自己稍微修改下实现类就可以通用。缺点是过于简单白痴,只是简单的根据配置好的词库进行分词,没有任何智能可言,连“和服”、“和服务器”这种老梗都破不了。IKanalyzer 有两种分词类型。
ik_max_word:会将文本做最细粒度的拆分,会穷尽各种可能的组合;
ik_smart:会做最粗粒度的拆分。
IKanalyzer可以作为非智能分词器的代表出场。
可参考:
- IKanalyzer分词代码:http://git.oschina.net/wltea/IK-Analyzer-2012FF/tree/master
4 mmseg4j
mmseg4j用Chih-Hao Tsai 的MMSeg算法实现的中文分词器,并实现lucene的analyzer和solr的TokenizerFactory以方便在Lucene和Solr中使用。 MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex加了四个规则过虑。
可参考:
5 jcseg
jcseg分词器使用的是mmseg算法和fmm算法,这个分词器类似ansj_seg的很多地方,智能、人性化,个人感觉体验要超过同门师兄弟mmseg4j,所以可以作为mmseg算法实现的分词器的代表出场。
可参考:
参考文献
https://blog.csdn.net/erliang20088/article/details/81627737
https://blog.csdn.net/liyantianmin/article/details/59485799
https://www.cnblogs.com/chenmc/p/9525163.html