ElasticSearch6.2.2 ansj分词插件使用和其它比较

大纲

一、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插件。 
可参考:

2  ansj 
ansj_seg分词器个人觉得是开源分词器里最强悍功能最丰富的。ansj_seg基于中科院的 ictclas 中文分词算法,智能、高效。虽然现在已经有ictclas 的for java版本,但是 ansj_seg从实现到使用来说要强大的多,而且作者自产自销自用,很多细节和小功能都有考虑,在索引和自然语言分析方面都有很优秀的表现。ansj_seg可以作为ictclas 算法实现的分词器的代表出场。 
可参考:

3   IKanalyzer 
IKanalyzer采用的是“正向迭代最细粒度切分算法”,是比较常见而且很容易上手的分词器了。一般新手上路学习lucene或者solr都会用这个。优点是开源(其实java分词器多是开源的,毕竟算法都是业内熟知的)、轻量、目前来看没有太大的bug,源码简单易懂,做二次开发也很简单,即使遇到solr/Lucene版本更新,只需要自己稍微修改下实现类就可以通用。缺点是过于简单白痴,只是简单的根据配置好的词库进行分词,没有任何智能可言,连“和服”、“和服务器”这种老梗都破不了。IKanalyzer 有两种分词类型。

ik_max_word:会将文本做最细粒度的拆分,会穷尽各种可能的组合;

ik_smart:会做最粗粒度的拆分。

IKanalyzer可以作为非智能分词器的代表出场。 
可参考:

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

https://github.com/NLPchina/

 

发布了38 篇原创文章 · 获赞 25 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章