如何开发自己的搜索帝国之安装ik分词器

   Elasticsearch默认提供的分词器,会把每个汉字分开,而不是我们想要的根据关键词来分词,我是中国人 不能简单的分成一个个字,我们更希望 “中国人”,“中国”,“我”这样的分词,这样我们就需要安装中文分词插件,ik就是实现这个功能的。

  elasticsearch-analysis-ik 是一款中文的分词插件,支持自定义词库。

  现在开始安装ik分词器,安装之前,先说明一些变化:

  1. 之前可以在node节点上配置index默认的分词器,如果是多节点,那么在每个节点上都配置就行了。这个有点不灵活,所以。5.0之后,ES已经不再支持在elasticsearch.yml中配置分词器,改而在新建索引时,使用settings去配置,这个会在后面的编程中说到。
  2. 之前使用delete-by-query插件来实现type的整个删除。这个插件也是从5.0开始没有了,被整合到了ES的Core中

  3.从5.0开始ik的tokenizer发生了变化,提供了两种,一种为ik_smart,一种为ik_max_word。直接一点,ik_max_word会尽量从输入中拆分出更多  token,而ik_smart则相反,个人感觉,ik_max_word就是原来的ik,ik_smart是新加的。

下载

  有两种方式,一个是下载源码自己编译好后再上传到ES的插件库,第二种方法是直接下载编译好的上传。

1.源码安装

  源码地址:https://github.com/medcl/elasticsearch-analysis-ik,git clone下来。 

 

cd elasticsearch-analysis-ik
mvn clean
mvn compile
mvn package

  拷贝和解压release下的文件:
  #{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-*.zip 到你的 elasticsearch 插件目录,
  如: plugins/ik 重启elasticsearch

2.安装编译版

  直接下载elasticsearch-analysis-ik-5.3.0.zip ,网站地址为:https://github.com/medcl/elasticsearch-analysis-ik/releases

  只需要把elasticsearch-analysis-ik-5.3.0.zip解压,然后拷贝到ES安装目录下的plugins文件夹内,并把elasticsearch-analysis-ik-5.3.0文件夹名修改为ik。这样,就安装好了。正如前面说的,安装完插件,现在不需要在配置文件中配置了,需要在新建索引的时候指定分词器。

  重启启动ES,可以看到如下log

  用kibana查看一下,后续会谈到如何这样做。

  至此ES+Kibana+IK安装好了。从2.4.1到5.X版本号跨度很大,很多地方也发生了很多变化,总体来说,更简便了。

配置IKAnalyzer.cfg.xml

  IKAnalyzer.cfg.xml 在{conf}/analysis-ik/config/IKAnalyzer.cfg.xml 或 {plugins}/elasticsearch-analysis-ik-*/config/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">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
     <!--用户可以在这里配置远程扩展字典 -->
    <entry key="remote_ext_dict">location</entry>
     <!--用户可以在这里配置远程扩展停止词字典-->
    <entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>

热更新 IK 分词使用方法

  目前该插件支持热更新 IK 分词,通过上文在 IK 配置文件中提到的如下配置

     <!--用户可以在这里配置远程扩展字典 -->
    <entry key="remote_ext_dict">location</entry>
     <!--用户可以在这里配置远程扩展停止词字典-->
    <entry key="remote_ext_stopwords">location</entry>

   其中 location 是指一个 url,比如 http://yoursite.com/getCustomDict,该请求只需满足以下两点即可完成分词热更新。

  1. 该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
  2. 该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。

  满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。

  可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。

官网例子测试

1.创建一个索引

curl -XPUT http://localhost:9200/index

2.创建一个mapping

curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word"
            }
        }

}'

 

3.录入数据

curl -XPOST http://localhost:9200/index/fulltext/1 -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}
'
curl -XPOST http://localhost:9200/index/fulltext/2 -d'
{"content":"公安部:各地校车将享最高路权"}
'
curl -XPOST http://localhost:9200/index/fulltext/3 -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
'
curl -XPOST http://localhost:9200/index/fulltext/4 -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'

 

4.查询

curl -XPOST http://localhost:9200/index/fulltext/_search  -d'
{
    "query" : { "match" : { "content" : "中国" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}
'

 

结果

{
    "took": 14,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 2,
        "hits": [
            {
                "_index": "index",
                "_type": "fulltext",
                "_id": "4",
                "_score": 2,
                "_source": {
                    "content": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
                },
                "highlight": {
                    "content": [
                        "<tag1>中国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首 "
                    ]
                }
            },
            {
                "_index": "index",
                "_type": "fulltext",
                "_id": "3",
                "_score": 2,
                "_source": {
                    "content": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
                },
                "highlight": {
                    "content": [
                        "均每天扣1艘<tag1>中国</tag1>渔船 "
                    ]
                }
            }
        ]
    }
}

参考官方的常见问题

1.自定义词典为什么没有生效?

请确保你的扩展词典的文本格式为 UTF8 编码

2.分词测试失败 请在某个索引下调用analyze接口测试,而不是直接调用analyze接口 如:http://localhost:9200/your_index/_analyze?text=中华人民共和国MN&tokenizer=my_ik

3.ik_max_word 和 ik_smart 什么区别?

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

 

时间: 2024-11-01 05:56:34

如何开发自己的搜索帝国之安装ik分词器的相关文章

ElasticSearch 安装 ik 分词插件

       在搜索领域,中文分词一直都是难题.经过很多大牛的不懈努力,还是出现了一些很不错的中文分词器,比如本文提到的IK.本文主要基于ES,安装ik分词插件.        一.IK简介     IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件.从3.0版本开 始,IK发展为面向Java的公用分

如何在Elasticsearch中安装中文分词器(IK+pinyin)

如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. 这是因为使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题. 本篇文章按照下面的内容进行描述: 分词器的作用 安装IK 简单的测试 模拟测试 安装elasticsearch-analysis-piny

如何开发自己的搜索帝国之Elasticsearch

搜索引擎是什么? 搜索引擎是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统.搜索引擎包括全文索引.目录索引.元搜索引擎.垂直搜索引擎.集合式搜索引擎.门户搜索引擎与免费链接列表等. Elasticsearch是什么? Elasticsearch一个高可扩展的开源的全文本搜索和分析工具.它允许你以近实时的方式快速存储.搜索.分析大容量的数据.Elasticsearch不仅提供全文检索功能,还能提供高效的分

Ubuntu16.04安装后开发环境配置和常用软件安装

Ubuntu16.04安装后1.安装常用软件搜狗输入法+编辑器Atom+浏览器Chome+视频播放器vlc+图像编辑器GIMP Image Editor安装+视频录制软件RcordMyDesktop安装.2.开发环境配置.JDK环境配置+scala环境配置+nodejs环境配置+开发工具intellij IDEA安装+Python数据分析环境配置+Jupyter开发工具安装+Python多版同时支持. 1.Ubuntu16.04安装常用软件(搜狗输入法+编辑器Atom+浏览器Chome+视频播放

FlexPaper二次开发问题及搜索高亮显示

原文:FlexPaper二次开发问题及搜索高亮显示 最近有个需求,做一个IT知识库,类似于文库,说到文库肯定会用到在线浏览文档了,所有在网上翻阅了一下类似豆丁的在线浏览器插件的资料,将其进行了二次开发,在这跟需要用到的朋友分享一下,下面部分内容用到有些前辈的博客内容,首次写博,写的不好之处请见谅...高手勿喷,O(∩_∩)O谢谢 1.前期准备工作 1.首先二次开发,当然前提是需要一份FlexPaper的源码.源码下载地址: http://files.cnblogs.com/yimiao/Flex

在android开发中如何搜索下载国外精美的图标资源

问题描述 在android开发中如何搜索下载国外精美的图标资源 在安卓开发中,图标是我们经常和必须用到的东西,但是自己设计图标又不在行,只能在网上搜索,但是国内很多网站的图标资源是收费的,如何找到国外的图标资源站,谢谢! 解决方案 https://www.iconfinder.com/

Ubuntu开发自己的包格式和安装程序

Canonical开发者正在开发自己的软件包格式和安装程序,补充而不是替代Debian的软件包管理工具apt/dpkg.新的软件包格式和安装程序仅用于新发行的软件包,也就是运行在Ubuntu Phone/Tablet上的第三方应用,其最主要特性是应用程序之间没有依赖关系-- 即应用程序所需要的库都捆绑在软件包内,每个程序都安装在自己的目录下,整个包格式将纯粹是说明性的.Canonical开发者Colin Watso强调,他们会继续用 dpkg和apt构建Ubuntu操作系统,同步Debian.

软件开发-安装的调试器不能被识别出来

问题描述 安装的调试器不能被识别出来 开发-安装的调试器不能被识别出来-调试器开发"> 解决方案

iOS 蓝牙开发时,搜索蓝牙是,蓝牙名称有时候为空,有时候有值求大神解疑

问题描述 iOS 蓝牙开发时,搜索蓝牙是,蓝牙名称有时候为空,有时候有值求大神解疑 iOS 蓝牙开发时,搜索蓝牙是,蓝牙名称有时候为空,有时候有值求大神解疑