1.5 中文分词插件
汉语自动分词是中文自然语言处理的重要一环。只有构建于分词之上,各种后续语言分析手段才有展示身手的舞台。例如,Ansj是基于ICTCLAS中文分词算法而开发的开源的Java中文分词工具;IK Analyzer是一个开源的基于Java语言开发的轻量级的中文分词工具包;MMSEG是基于中文分词之最大匹配法扩展而来的中文分词工具。几种分词算法各有优势。在Elasticsearch的RTF版本的plugins文件夹中就是已经安装好的插件。
例如,在RTF版本中,可选择Elasticsearch使用的中文分词器。打开config/elasticsearch.yml文件,在该文件index.analysis.analyzer.default.type部分指定使用的中文分词器。如下代码段1.1是选择使用IK分词器并对其进行设置(注:在Elasticsearch、Logstash、Kibana等相关的配置文件中用“#”表示注释信息。为便于统一表述形式,本书均用“//”表示注释说明信息,第7章部分位置用“#”表示注释说明信息)。
:YML是一种简单的数据描述语言,语法比XML简单,适合表达或编辑数据结构、各种设定等。YML配置文件多数内容是被#注释起来的,需要修改某部分时可删掉注释标记并进行相关配置。YML要求严格执行规定的缩进格式。Elasticsearch的配置文件中,elasticsearch.yml负责设置服务器的默认配置;logging.yml定义将多少信息写入系统日志、定义日志文件,并定期创建新文件。当需要适配监视环境或备份解决方案,或在系统调试时,可能需要更改该文件。
//代码段1.1: 在RTF版本的elasticsearch.yml中设置中文分词算法
index:
analysis:
analyzer:
ik:
alias:
- ik_analyzer
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true
index.analysis.analyzer.ik.type : ik
index.analysis.analyzer.default.type: ik
:在文本被索引前需要经过分词处理,这项工作一般由Analyzer类完成。Analyzer类是个抽象类,对应不同语言的文本,应该从Analyzer派生出特定的Analyzer。IK Analyzer是一个开源的基于Java语言开发的轻量级的中文分词工具包。最初它是以开源项目Lucene为应用主体的、结合词典分词和文法分析算法的中文分词组件。从IK Analyzer 3.0起,发展为面向Java的公用分词组件,且独立于Lucene项目。
在Elasticsearch 2.1.1版本中,安装使用IK分词器的步骤如下:
首先,在https://github.com/medcl/elasticsearch-analysis-ik上下载源码包。解压,在文件夹根目录下执行mvn package,如图1.14所示。
图1.14 安装过程
第二,将生成的target/releases/elasticsearch-analysis-ik-{version}.zip复制到Elasticsearch根目录下的plugins/ik中。
第三,将源码包里config文件夹下的ik文件夹整个放入Elasticsearch的config文件夹,如图1.15所示,之后重启Elasticsearch。
图1.15 安装完毕后的plugins和config目录
最后,新建一个索引,并将其分词器配置为采用刚安装好的IK分词。代码段1.2是我们设置的Mapping信息(注:这里仅是一个示例,有关代码的含义详见后续章节的说明)。
//代码段1.2: 设置Mapping
{
"passage": {
"_all": {
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"term_vector": "no",
"store": "false"
},
"properties": {
"content": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"include_in_all": "true",
"boost": 3
}
}
}
}
构建好Mapping后,就可以测试效果了。添加一条新闻标题文字,在代码段1.3中完成检索。
//代码段1.3: 完成检索
{
"took": 96, //搜索耗时
"timed_out": false, //是否超时
"_shards": {
"total": 5,
"successful": 2,
"failed": 0
},
"hits": { //命中的文档集合
"total": 1, //总共命中多少文档
"max_score": 0.15342641,
"hits": [ //命中的文档
{
"_index": "mylizi", //属于哪个index
"_type": "passage", //属于哪里type
"_ID": "1", //当前文档ID
"_score": 0.15342641, //得分
"_source": { //文档内容
"content": "中共中央总书记、国家主席、中央军委主席习近平出席会议并发表重要讲话。"
},
"highlight": { //高亮字段
"content": [
"中共中央总<em>书记</em>、国家主席、中央军委主席习近平出席会议并发表重要讲话。"
]
}
}
]
}
}