Elasticsearch实践(四):IK分词

环境:Elasticsearch 6.2.4 + Kibana 6.2.4 + ik 6.2.4

Elasticsearch默认也能对中文进行分词。

我们先来看看自带的中文分词效果:

curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d '{"analyzer": "default","text": "今天天气真好"}'
GET /_analyze
{
  "analyzer": "default",
  "text": "今天天气真好"
}

结果:

{
  "tokens": [
    {
      "token": "今",
      "start_offset": 0,
      "end_offset": 1,
      "type": "<IDEOGRAPHIC>",
      "position": 0
    },
    {
      "token": "天",
      "start_offset": 1,
      "end_offset": 2,
      "type": "<IDEOGRAPHIC>",
      "position": 1
    },
    {
      "token": "天",
      "start_offset": 2,
      "end_offset": 3,
      "type": "<IDEOGRAPHIC>",
      "position": 2
    },
    {
      "token": "气",
      "start_offset": 3,
      "end_offset": 4,
      "type": "<IDEOGRAPHIC>",
      "position": 3
    },
    {
      "token": "真",
      "start_offset": 4,
      "end_offset": 5,
      "type": "<IDEOGRAPHIC>",
      "position": 4
    },
    {
      "token": "好",
      "start_offset": 5,
      "end_offset": 6,
      "type": "<IDEOGRAPHIC>",
      "position": 5
    }
  ]
}

我们发现,是按照每个字进行分词的。这种在实际应用里肯定达不到想要的效果。当然,如果是日志搜索,使用自带的就足够了。

analyzer=default其实调用的是standard分词器。

接下来,我们安装IK分词插件进行分词。

安装IK

IK项目地址:https://github.com/medcl/elasticsearch-analysis-ik

首先需要说明的是,IK插件必须和 ElasticSearch 的版本一直,否则不兼容。

安装方法1:
https://github.com/medcl/elasticsearch-analysis-ik/releases 下载压缩包,然后在ES的plugins目录创建analysis-ik子目录,把压缩包的内容复制到这个目录里面即可。最终plugins/analysis-ik/目录里面的内容:

plugins/analysis-ik/
    commons-codec-1.9.jar
    commons-logging-1.2.jar
    elasticsearch-analysis-ik-6.2.4.jar
    httpclient-4.5.2.jar
    httpcore-4.4.4.jar
    plugin-descriptor.properties

然后重启 ElasticSearch。

安装方法2:

./usr/local/elk/elasticsearch-6.2.4/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip

如果已下载压缩包,直接使用:

./usr/local/elk/elasticsearch-6.2.4/bin/elasticsearch-plugin install file:///tmp/elasticsearch-analysis-ik-6.2.4.zip

然后重启 ElasticSearch。

IK分词

IK支持两种分词模式:

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

接下来,我们测算IK分词效果和自带的有什么不同:

curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'{"analyzer": "ik_smart","text": "今天天气真好"}'

结果:

{
  "tokens": [
    {
      "token": "今天天气",
      "start_offset": 0,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "真好",
      "start_offset": 4,
      "end_offset": 6,
      "type": "CN_WORD",
      "position": 1
    }
  ]
}

再试一下ik_max_word的效果:

{
  "tokens": [
    {
      "token": "今天天气",
      "start_offset": 0,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "今天",
      "start_offset": 0,
      "end_offset": 2,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "天天",
      "start_offset": 1,
      "end_offset": 3,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "天气",
      "start_offset": 2,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 3
    },
    {
      "token": "真好",
      "start_offset": 4,
      "end_offset": 6,
      "type": "CN_WORD",
      "position": 4
    }
  ]
}

设置mapping默认分词器

示例:

{
    "properties": {
        "content": {
            "type": "text",
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_max_word"
        }
    }
}

注:这里设置 search_analyzeranalyzer 相同是为了确保搜索时和索引时使用相同的分词器,以确保查询中的术语与反向索引中的术语具有相同的格式。如果不设置 search_analyzer,则 search_analyzeranalyzer 相同。详细请查阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html

自定义分词词典

我们也可以定义自己的词典供IK使用。比如:

curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'{"analyzer": "ik_smart","text": "去朝阳公园"}'

结果:

{
  "tokens": [
    {
      "token": "去",
      "start_offset": 0,
      "end_offset": 1,
      "type": "CN_CHAR",
      "position": 0
    },
    {
      "token": "朝阳",
      "start_offset": 1,
      "end_offset": 3,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "公园",
      "start_offset": 3,
      "end_offset": 5,
      "type": "CN_WORD",
      "position": 2
    }
  ]
}

我们希望朝阳公园作为一个整体,这时候可以把该词加入到自己的词典里。

新建自己的词典只需要简单几步就可以完成:
1、在elasticsearch-6.2.4/config/analysis-ik/目录增加一个my.dic:

$ touch my.dic
$ echo 朝阳公园 > my.dic

$ cat my.dic
朝阳公园

.dic为词典文件,其实就是简单的文本文件,词语与词语直接需要换行。注意是UTF8编码。我们看一下自带的分词文件:

$ head -n 5 main.dic
一一列举
一一对应
一一道来
一丁
一丁不识

2、然后修改elasticsearch-6.2.4/config/analysis-ik/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">my.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

增加了my.dic,然后重启ES。我们再看一下效果:

curl http://localhost:9200/_analyze/?analyzer=ik_smart&text=去朝阳公园

结果:

{
  "tokens": [
    {
      "token": "去",
      "start_offset": 0,
      "end_offset": 1,
      "type": "CN_CHAR",
      "position": 0
    },
    {
      "token": "朝阳公园",
      "start_offset": 1,
      "end_offset": 5,
      "type": "CN_WORD",
      "position": 1
    }
  ]
}

说明自定义词典生效了。如果有多个词典,使用英文分号隔开:

<entry key="ext_dict">my.dic;custom/single_word_low_freq.dic</entry>

另外,我们看到配置里还有个扩展停止词字典,这个是用来辅助断句的。我们可以看一下自带的一个扩展停止词字典

$ head -n 5 extra_stopword.dic
也
了
仍
从
以

也就是IK分词器遇到这些词就认为前面的词语不会与这些词构成词语。

IK分词也支持远程词典,远程词典的好处是支持热更新。词典格式和本地的一致,都是一行一个分词(换行符用 \n),还要求填写的URL满足:

该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。

详见:https://github.com/medcl/elasticsearch-analysis-ik 热更新 IK 分词使用方法 部分。

注意:上面的示例里我们改的是`elasticsearch-6.2.4/config/analysis-ik/目录下内容,是因为IK是通过方法2里elasticsearch-plugin安装的。如果你是通过解压方式安装的,那么IK配置会在plugins目录,即:elasticsearch-6.2.4/plugins/analysis-ik/config。也就是说插件的配置既可以放在插件所在目录,也可以放在Elasticsearch的config目录里面。

ES内置的Analyzer分析器

es自带了许多内置的Analyzer分析器,无需配置就可以直接在index中使用:

  • 标准分词器(standard):以单词边界切分字符串为terms,根据Unicode文本分割算法。它会移除大部分的标点符号,小写分词后的term,支持停用词。
  • 简单分词器(simple):该分词器会在遇到非字母时切分字符串,小写所有的term。
  • 空格分词器(whitespace):遇到空格字符时切分字符串,
  • 停用词分词器(stop):类似简单分词器,同时支持移除停用词。
  • 关键词分词器(keyword):无操作分词器,会输出与输入相同的内容作为一个single term。
  • 模式分词器(pattern):使用正则表达式讲字符串且分为terms。支持小写字母和停用词。
  • 语言分词器(language):支持许多基于特定语言的分词器,比如english或french。
  • 签名分词器(fingerprint):是一个专家分词器,会产生一个签名,可以用于去重检测。
  • 自定义分词器:如果内置分词器无法满足你的需求,可以自定义custom分词器,根据不同的character filters,tokenizer,token filters的组合 。

详见文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html

参考

1、medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.
https://github.com/medcl/elasticsearch-analysis-ik
2、ElesticSearch IK中文分词使用详解 - xsdxs的博客 - CSDN博客
https://blog.csdn.net/xsdxs/article/details/72853288

原文地址:https://www.cnblogs.com/52fhy/p/10046823.html

时间: 2024-08-28 20:42:19

Elasticsearch实践(四):IK分词的相关文章

elasticsearch集群&&IK分词器&&同义词

wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.3/elasticsearch-2.3.3.tar.gz 集群安装: 三个节点:master,slave1,slvae2 vi elasticsearch.yml cluster.name: my-application node.name: node-3(节点独有的名称,注意唯一性

Elasticsearch 7.x - IK分词器插件(ik_smart,ik_max_word)

一.安装IK分词器 Elasticsearch也需要安装IK分析器以实现对中文更好的分词支持. 去Github下载最新版elasticsearch-ik https://github.com/medcl/elasticsearch-analysis-ik/releases 将ik文件夹放在elasticsearch/plugins目录下,重启elasticsearch. Console控制台输出: [2019-09-04T08:50:23,395][INFO ][o.e.p.PluginsSer

elasticsearch插件之ik分词器

ES默认对英文文本的分词器支持较好,但和lucene一样,如果需要对中文进行全文检索,那么需要使用中文分词器,同lucene一样,在使用中文全文检索前,需要集成IK分词器. 可以从GitHub上获取:https://github.com/medcl/elasticsearch-analysis-ik 因为是源码,我们要用到maven对其进行打包,因此你需要安装maven. 环境:centos6.9.elasticsearsh5.6.5.java1.8 1.下载 在GitHub上获取与eastic

elasticsearch入门 (三 ik 分词器安装)

ik git 地址 https://github.com/medcl/elasticsearch-analysis-ik readme 包含各个版本ik对应的 es 版本 下载对应的ikzip包 命令如下 https://github.com/medcl/elasticsearch-analysis-ik/archive/v1.5.0.zip 解压后 执行maven打包命令(默认系统已经安装maven) mvn package 编译成功后进入target下有一个编译好的elasticsearch

ElasticSearch安装ik分词插件

一.IK简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件.从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现.在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化. 二.安装IK分词插件 1.获取分词的依赖包 通过git clone https://g

Elasticsearch入门之从零开始安装ik分词器

起因 需要在ES中使用聚合进行统计分析,但是聚合字段值为中文,ES的默认分词器对于中文支持非常不友好:会把完整的中文词语拆分为一系列独立的汉字进行聚合,显然这并不是我的初衷.我们来看个实例: POST http://192.168.80.133:9200/my_index_name/my_type_name/_search { "size": 0, "query" : { "range" : { "time": { "

ElasticSearch、IK分词器、Head Master安装-----Windows

ElasticSearch安装运行前提条件:配置好Jdk Head-Master运行前提条件:node 一.下载 地址:https://www.elastic.co/cn/downloads/elasticsearch 历史版本:找到下面这句话 然后双击 Not the version you're looking for? View past releases. 二.IK分词器下载 地址:https://github.com/medcl/elasticsearch-analysis-ik/re

ElasticSearch的ik分词插件开发

摘要 本文主要介绍如何开发ElasticSearch的ik分词插件.很多时候,网上开源的分词插件不能满足业务需求,只能自己定义开发一套ik分词,let's go! ik插件,说白了,就是通过封装ik分词器,与ElasticSearch对接,让ElasticSearch能够驱动该分词器.那么,具体怎么与ElasticSearch对接呢?从下往上走,总共3步: 一.封装IK分析器 与ElasticSearch集成,分词器的配置均从ElasticSearch的配置文件读取,因此,需要重载IKAnaly

ElasticSearch 用ik分词器建立索引(java API)

ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,作为当前流行的企业级搜索引擎,用于云计算中,能够达到实时搜索,并且具有稳定,可靠,快速安装,使用方便等多种优点,得到大多数企业的青睐. ElasicSearch可以通过终端建立索引,但是本人在做项目的时候用终端建立的索引,然后使用Java API进行数据的插入,始终得不到分词,最终的解决办法就是通过Java API