ES 的默认分词器(standard)不支持中文分词,满足不了平时的需求,所以需要用能够支持中文分词的 IK 分词器。而且 IK 分词器也是支持英文分词的。

本文介绍下IK分词器的安装、基本使用方法;专有名词、同义词的使用;英文驼峰分词的实现。

下载与安装

中文IK分词器下载地址:Releases · medcl/elasticsearch-analysis-ik · GitHub

  1. 选择一个版本下载,然后解压。
  2. 在 elasticsearch 的 plugins 目录中新建文件夹 "ik"
  3. 将解压出来的所有东西都放到"ik"目录
  4. 修改 "plugin-descriptor.properties" 中的 "elasticsearch.version" 为你使用的 elasticsearch 版本(版本不一致的话启动会失败)
  5. 重启 elasticsearch
  6. 如果已经建了索引的话,索引也需要重建

重启后,IK分词器就生效了。

基本使用

IK分词器有两种分词模式:"ik_max_word" 和 "ik_smart"

  1. ik_max_word:会做最细粒度的拆分,把能拆分的词都拆出来
  2. ik_smart:会做最粗粒度的拆分,贪心算法,尽可能把词分得长

所以,建索引的时候建议用 ik_max_word,查询的时候用 ik_smart

"name":{
    "type": "text",
    "analyzer": "ik_max_word", "search_analyzer": "ik_smart"
},

通过 "_analyze" 查看分词结果:

专有名词

实际使用 IK 分词器时,有些专有名词也分不了,这时就需要自定义词典了。

比如宝可梦中有个叫"达克莱伊",这种专属词汇,IK分词器默认就分不了:

在 plugins/ik/config 目录中新增 "my.dic" 文件(名称自己定义),在 "my.dic" 中加入我们需要使用的专属词汇:

然后修改 "IKAnalyzer.cfg.xml" 文件,在 "ext_dict" 模块,增加 "my.dic"。

这里可以配置多个 dic 文件,多个之间用 ";" 分隔。

注意:集群中每个节点都要修改!

重启 es 后查看效果:分词器可以识别此专属词汇了

同义词

当我们在淘宝、京东上搜索"苹果"时,既能搜索出来iphone,又能搜出来真实吃的苹果。或者"西红柿"和"番茄",就是同一个东西。这种就要用到同义词了。

我想实现的效果:

  1. 不管输入【西红柿】还是【番茄】,都能同时搜出【西红柿 & 番茄】
  2. 在输入【苹果】时,能同时搜索出【苹果&iphone】,但是在输入【iphone】时,只能搜索出【iphone】

首先在 "plugins/ik/config" 目录下新建 "analysis" 目录,然后在 "analysis" 目录下新建文件 "synonym.txt"。之后在 "synonym.txt" 文件中添加同义词。

注意:是英文逗号!且集群中每个节点都要添加此配置!

这里使用了两种写法:

  1. 第一种是使用【逗号分隔】,平等看待所有的同义词
  2. 第二种是使用【类型扩展】,不平等地看待同义词

之后重启 es,然后创建索引时,对分词器进行扩展。同时,在需要的字段中设置使用扩展后的分词器:

"settings":{
    "analysis": {
      "analyzer": {
        "synonym_smart": {
      "type": "custom",
      "tokenizer": "ik_smart",
      "filter": ["synonym_filter"]
    },
    "synonym_max_word": {
      "type": "custom",
      "tokenizer": "ik_max_word",
      "filter": ["synonym_filter"]
    }
      },
      "filter": {
        "synonym_filter": {
          "type": "synonym",
      "synonyms_path": "/usr/share/elasticsearch/plugins/ik/config/analysis/synonym.txt" 
        }
      }
    }
}

"name":{
    "type": "text",
    "analyzer": "ik_max_word", "search_analyzer": "synonym_smart"
},

注意:这里虽然定义了 "synonym_max_word",但其实没有使用到它,建立索引时使用的分词器仍然是 "ik_max_word",而在搜索时使用了 "synonym_smart"。

因为如果在建立索引时使用了 "synonym_max_word",在输入 【iphone】时,也会搜索出来 【苹果】,而这不是我想要的效果。

具体可以参考官方文档关于【类型扩展】的说明:

扩展或收缩 | Elasticsearch: 权威指南 | Elastic

之后插入点数据,然后测试查询。

1)输入 "土豆" 或者 "马铃薯",都能同时搜到"土豆"与"马铃薯"

2)输入"苹果",能同时搜到"苹果"与"iphone"

3)输入"iphone",只能搜到"iphone"

英文驼峰形式分词

IK分词器默认也是不支持英文驼峰形式的分词的。比如 "PersonAndVehicleDetection" 这个字符串,使用 IK 分词器分析出来的结果,仍然是 "PersonAndVehicleDetection"

GET /book/_analyze
{
 "field": "description",
 "text": "PersonAndVehicleDetection"
}

分析结果:
{
  "tokens" : [
    {
      "token" : "personandvehicledetection",
      "start_offset" : 0,
      "end_offset" : 25,
      "type" : "ENGLISH",
      "position" : 0
    }
  ]
}

此时,根据字符串 "person" 来查,是查不到的:

但是业务需要,在输入 person 或者 vehicle 时,也想要查询出此条数据时怎么办呢?那就需要对分词器做一些扩展,在创建索引时,在 settings 中的 analysis 里配置自己的分词器,然后在 mappings 中的字段中引用该分词器:

"settings":{
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "ik_max_word",
          "char_filter": [
            "camel_case_filter"
          ]
        }
      },
      "char_filter": {
        "camel_case_filter": {
          "type": "pattern_replace",
          "pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
          "replacement": " "
        }
      }
    }
}

"description":{
    "type": "text",
    "analyzer": "my_analyzer", "search_analyzer": "ik_smart"
}

使用了新的 analyzer 之后再分析看结果:

然后再查询发现能查询到了:

elasticsearch IK分词器的安装、使用与扩展相关推荐

  1. ElasticSearch IK分词器安装

    2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch 默认是带分词器了,对英文是按固定的英文的空格,或者"-"进行分词,但是对中文分 ...

  2. Elasticsearch(二) ik分词器的安装 以及 自定义分词

    ik分词器作为elasticsearch的一个插件,则是安装在es插件中. ik分词器的安装 1,创建ik分词目录上传与es相同版本的ik分词器插件,不同版本可能es启动 报错 在elasticsea ...

  3. 04.ElasticSearch之IK分词器的安装与使用

    ElasticSearch之IK分词器的安装与使用 前言 安装 离线安装 在线安装 ik分词器测试 扩展(停用)词(典) 测试数据 概念 配置词典 1.修改配置文件 2.新建词典 3.自定义内容 4. ...

  4. ElasticSearch IK 分词器快速上手

    简介: ElasticSearch IK 分词器快速上手 一.安装 IK 分词器 1.分配伪终端 我的 ElasticSearch 是使用 Docker 安装的,所以先给容器分配一个伪终端.之后就可以 ...

  5. ElasticSearch——IK分词器的下载及使用

    ElasticSearch--IK分词器的下载及使用 1.什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器 分词方式 StandardAnalyzer 单字分词 CJKAna ...

  6. 【Elasticsearch】es IK分词器的安装

    1.概述 [Elasticsearch]es 7.8.0 唐诗三百首写入 Elasticsearch 会发生什么 之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字 ...

  7. ES入门学习:ElasticSearch、Kibana、ik分词器的安装、简单使用及SpringBoot集成

    前言 es是采用Java语言开发,因此,想要安装运行es需要提前准备好jdk环境,关于linux配置jdk在前文linux配置jdk 本文主要介绍es的安装.kibana的安装和简单使用及ik分词器的 ...

  8. elastic ik分词搜索_php环境下使用elasticSearch+ik分词器进行全文搜索

    php中文网最新课程 每日17点准时技术干货分享 首先需要说明的一点是,如果需要启用ik分词器,那么分词器的版本必须与es版本一致,即6.3.0的分词器需要同样6.3.0版本的es支持. 安装java ...

  9. ik分词器 mysql php_php环境下使用elasticSearch+ik分词器进行全文搜索

    首先需要说明的一点是,如果需要启用ik分词器,那么分词器的版本必须与es版本一致,即6.3.0的分词器需要同样6.3.0版本的es支持. 安装java win-64bit的安装包需要去java英文官网 ...

最新文章

  1. 分享 10 道 Nodejs 进程相关面试题
  2. Play 2.0 用户指南 - 模版引擎 -- 针对Scala开发者
  3. 解决VSCode终端中禁止运行脚本问题的一种方式
  4. Docker学习——Dockerfile 指令详解(五)
  5. STL源码剖析 deque双端队列 概述
  6. tableview或scrollview Y轴发生变化解决方案
  7. MySQL初识-架构-安装-初始化-连接-管理工具-数据文件
  8. 开发过程中任何一个时刻,只关注解决当前面临的问题。
  9. SQL语句取得最大件数(MSSQL ORACLE Postgre,top rownum,limit)
  10. APP开发难吗?澳大利亚10岁儿童已开发5个手机App
  11. pvremore删除物理卷
  12. Java开发 明华usbkey_v3 明华二次开发包,usbkey 内有很多demo程序。 USB develop 238万源代码下载- www.pudn.com...
  13. C++通配符模糊匹配
  14. 来聊聊我的阿里云P7面试经历
  15. InnoDB中的页合并与分裂
  16. 胆囊炎以及胆结石的朋友注意了
  17. BZOJ3838 : [Pa2013]Raper
  18. 《数据结构与算法基础 严蔚敏版》第三章 堆栈与队列
  19. 如何解决微信端直接跳WAP端
  20. java 开发微型公众账号应用

热门文章

  1. GeForce 1080Ti显卡驱动+cuda8.0+cudnn6.0 外加TensorFlow-GPU
  2. springboot 自定义属性文件加载(ConfigDataLocationResolver)
  3. Sentinel key not found (H0007)
  4. Linux进程间通信详解(四) —— 共享内存及函数
  5. element ui el-input输入框type=number去掉上下箭头
  6. 从零开始读懂Web3:一起走进新一代互联网世界
  7. 入行软件测试3个月,每天平平无奇,感觉在浪费时间怎么办
  8. CorelDRAW2023新品发布会重磅来袭!CDR2023软件新功能抢先看!
  9. 2018下半年阿拉丁小程序白皮书发展8大预测 日活有望达到4亿
  10. 剖析抖音书单号的赚钱原理和运营技巧