ES集成中文分词器: IK 3.0

 

1、集成分词器

IKAnalyzer是一个开源的,基于Java语言开发的轻量级中文分词器工具包,独立于Lucene项目, 同事提供了对Lucene的默认优化实现。

IK分词器3.0有下面几个特性: 

  1. 采用了特有的“正向迭代最细粒度切分算法”, 具有60万字/秒的告诉处理能力
  2. 采用了多子处理器分析模式, 支持: 英文字母(IP、 Email、URL)、数字(日期、常用中文数量词、罗马数字、科学计数法)、中文词汇(姓名、地名处理)等分词处理
  3. 支持个人词条优化的词典存储,更小的内存占用
  4. 支持用户词典扩展定义
  5. 针对lucene全文检索优化的查询分析器IKQueryParser; 采用歧义分析算法优化查询关键字的搜索排列组合, 极大提高Lucene检索的命中率

下载地址: 

<https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.3.0>

安装方式一: 下载插件并安装

(1) 在elasticsearch的bin目录下执行以下命令,es插件管理器会自动帮我们安装,然后等待安装完成:

/usr/elasticsearch/bin/elasticsearch-plugin install 
https://github.com/medcl/elasticsearch-analysis-
ik/releases/download/v7.3.0/elasticsearch-analysis-ik-7.3.0.zip

(2)下载完成后会提示: Continue with installation?  输入 y , 即可完成安装

(3)重启ES和Kibana

安装方式二: 上传安装包安装

(1)在ES安装目录的plugins目录下新建analysis-ik 目录

#新建analysis-ik文件夹
mkdir analysis-ik
#切换至 analysis-ik文件夹下
cd analysis-ik
#上传资料中的 elasticsearch-analysis-ik-7.3.0.zip 
#解压
unzip elasticsearch-analysis-ik-7.3.3.zip
#解压完成后删除zip
rm -rf elasticsearch-analysis-ik-7.3.0.zip

(2)重启 ES 和 Kibana

 

IK分词器的两种分词模式:ik_max_word 和 ik_smat

  1.  ik_max_word 是常用的分词器, 会将文本做最细粒度的拆分
  2. ik_smart 会做粗粒度的拆分

我们看一下两种分词对同一个文本的拆分差异:

使用ik_max_work 分词模式:

POST  _analyze
{
  "analyzer": "ik_max_word",
  "text": "南京市长江大桥"
}

运行得到的结果:

{
    "tokens": [{
            "token": "南京市",
            "start_offset": 0,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "南京",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "市长",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 2
        },
         {
            "token": "长江大桥",
            "start_offset": 3,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "长江",
            "start_offset": 3,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 4
        },
        {
            "token": "大桥",
            "start_offset": 5,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 5
        }
    ]
}

使用ik_smart分词模式:

POST  _analyze
{
  "analyzer": "ik_smart",
  "text": "南京市长江大桥"
}

运行得到的结果:

{
    "tokens": [{
            "token": "南京市",
            "start_offset": 0,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "长江大桥",
            "start_offset": 3,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 1
        }
    ]
}

如果现在假设江大桥是一个人名, 是南京人, 那么ik_smart 的拆分明显是不合理的。这种时候我们就需要用到扩展词典。

2、扩展词典使用

扩展词: 就是不想让哪些次被分开,让他们必须在一个词里, 如上面的江大桥。

自定义扩展词库:

(1)进入到 config/analysis-ik/(插件命令安装方式) 或 plugins/analysis-ik/config(安装包安装方式) 目录下, 新增自定义词典

vim lagou_ext_dict.dic

输入: 江大桥

(2)将我们自定义的扩展词典文件添加到: IKAnalyzer.cfg.xml配置中

vim IKAnalyzer.cfg.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">lagou_ext_dict.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">lagou_stop_dict.dic</entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry 
key="remote_ext_dict">http://192.168.211.130:8080/tag.dic</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

(3) 重启ES

3、停用词典的使用

注意这里不是停用上面我们设置的扩展词,而是定义一些停用的词,不让他们作为分词出现,如一些出现频率非常高,但又对文本的语义产生不了多大的影响。 如英文中的: a、 an、 the、of 等, 还有中文中的: 的、 了 、 呢 、 啊 等。将这样的词设为停用词,在分词时被过滤掉,不让他们被进行索引。

自定义停用词库: 

(1)进入到config/analysis-ik(插件命令安装方式)或 plugins/ayalysis-ik/config (安转包安装方式)目录下,新增自定义词典:

vim lagou_stop_dict.dic

输入:

的
了
呢

(2)将我们自定义的停用词典添加到IKAnalyzer.cfg.xml配置中(同扩展词库)

(3)重启ES

4、同义词典使用

在语言描述中有很多意思相同的同义词, 在搜索时可能会输入它的同义词进行查询,这时就需要我们设置同义词典。如馒头和馍表达的意思相同,那么我们在搜索馒头的时候,应该也要能查询到词为“馍”的文档

注意: 扩展词和停用词是在索引的时候使用,而同义词是检索的时候使用

配置IK同义词:

ES自带了一个名为synonym的同义词filter。为了能让IK和synonym同时工作,我们需要定义新的analyzer, 用IK做tokenizer, synonym做filter。

(1) 创建/config/analysis-ik/synonym.txt文件, 输入一些同义词并存储为utf-8格式, 如:

西红柿,番茄
馒头,馍
China,中国

(2) 创建索引时使用同义词配置

PUT /索引名称
{
    "settings": {
        "analysis": {
            "filter": {
                "word_sync": {
                    "type": "synonym",
                    "synonyms_path": "analysis-ik/synonym.txt"
                }
            },
            "analyzer": {
                "ik_sync_max_word": {
                    "filter": [
                        "word_sync"
                    ],
                    "type": "custom",
                    "tokenizer": "ik_max_word"
                },"ik_sync_smart": {
                    "filter": [
                        "word_sync"
                    ],
                    "type": "custom",
                    "tokenizer": "ik_smart"
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "字段名": {
                "type": "字段类型",
                "analyzer": "ik_sync_smart",
                "search_analyzer": "ik_sync_smart"
            }
        }
    }
}

以上配置定义了ik_sync_max_word和ik_sync_smart这两个新的 analyzer,对应 IK ik_max_word 和 ik_smart 两种分词策略。ik_sync_max_word和 ik_sync_smart都会使用 synonym filter 实现同义词转换 

(3)到此,索引创建模板中同义词配置完成,搜索时指定分词为ik_sync_max_word或ik_sync_smart。 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值