大数据搜索与日志挖掘及可视化方案:ELK Stack:Elasticsearch、Logstash、Kibana (第2版)
上QQ阅读APP看书,第一时间看更新

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>、国家主席、中央军委主席习近平出席会议并发表重要讲话。"
              ]
            }
          }
        ]
       }
     }