Elasticsearch-analysis-ik分词器的安装及使用

Elasticsearch-analysis-ik分词器的安装及使用

前面我们讲到了Elasticsearch的安装以及一些简单的操作语法。今天我们介绍一下怎么使用Elasticsearch-analysis-ik分词器实现一个简单的中文分词。

Elasticsearch 内置的分词器对中文不友好,会把中文分成单个字来进行全文检索,不能达到想要的结果,在全文检索及新词发展如此快的互联网时代,IK可以进行友好的分词及自定义分词。

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版,目前支持最新版本的ES6.X版本。

ik 带有两个分词器
ik_max_word :会将文本做最细粒度的拆分;尽可能多的拆分出词语
ik_smart:会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有

安装Elasticsearch-analysis-ik

Centos环境下:


$ cd /usr/share/elasticsearch-6.5.0/plugins

$ wget https://github.com/medcl/elasticsearch-analysis-ik/archive/v6.5.0.tar.gz

$ tar -xvzf v6.5.0.tar.gz
复制代码

安装成功后重启ES


$ ps -ef | grep elasticsearch

$ kill -9 [进程号]

$ su es 
$ cd /usr/share/elasticsearch/bin
$ ./elasticsearch -d
复制代码
简单测试
curl -H 'Content-Type:application/json' 'http://localhost:9200/index/_analyze?pretty=true' -d'
{ "analyzer": "ik_smart", "text": "中华人民共和国万岁万岁万万岁"}'
复制代码

看一下结果

{
  "tokens" : [
    {
      "token" : "中华人民共和国",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "万岁",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "万岁",
      "start_offset" : 9,
      "end_offset" : 11,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "万万岁",
      "start_offset" : 11,
      "end_offset" : 14,
      "type" : "CN_WORD",
      "position" : 3
    }
  ]
}
复制代码

可以看出。我们实现了简单的中文分词
但是我们想要一些特定的分词功能呢?比如说自己定义的一些名词,不想让分词器拆分怎么办呢?比如说这里的筱筱,我就不想让他拆分开怎么办呢?

curl -H 'Content-Type: application/json'  -XGET 'localhost:9200/_analyze?pretty' -d '{"analyzer":"ik_smart","text":"筱筱的公众号"}'
复制代码

看效果

{
  "tokens" : [
    {
      "token" : "筱",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "筱",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "的",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 2
    },
    {
      "token" : "公众",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "号",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "CN_CHAR",
      "position" : 4
    }
  ]
}
复制代码

遇到这种情况,我们可以使用analysis-ik 支持自定义词库;增加自定义词库。

analysis-ik自定义词库

进入ES安装目录下的config/analysis-ik目录。

$ cd /usr/share/elasticsearch/config/analysis-ik
复制代码

新建自定义词库文件

$ vi my.dic

筱筱
:wq
复制代码

修改IKAnalyzer.cfg.xml配置文件

$ vim IKAnalyzer.cfg.xml
复制代码

文件内容如下,将新建的my.dic文件放入ext_dict下。

"1.0" encoding="UTF-8"?>
"http://java.sun.com/dtd/properties.dtd">

    IK Analyzer 扩展配置
    
    "ext_dict">my.dic
     
    "ext_stopwords">
    
    
    
    

复制代码

重启ES

在进行验证刚刚的例子

 curl -H 'Content-Type: application/json'  -XGET 'localhost:9200/_analyze?pretty' -d '{"analyzer":"ik_smart","text":"筱筱的公众号"}'
复制代码

结果如下:

{
  "tokens" : [
    {
      "token" : "筱筱",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "的",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "公众",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "号",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "CN_CHAR",
      "position" : 3
    }
  ]
}
复制代码

从结果中可以看出,就不会把我自定义的词汇给拆分开了。简单的分词用法就写到这里。

如果有什么好的建议或者意见请关注公众号



转载于:https://juejin.im/post/5c1494a0e51d455fe8104542

你可能感兴趣的:(大数据,java,开发工具)