Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用

开发 开发工具
Elasticsearch-analysis-ik 则是将 IK Analyzer 集成 Elasticsearch 的插件,并支持自定义词典。

本文提纲

一、什么是 Elasticsearch-analysis-ik

二、默认配置 IK

三、使用 AnalyzeRequestBuilder 获取分词结果

四、小结

前言

《Elasticsearch 和插件 elasticsearch-head 安装详解》 文章中,我使用的是 Elasticsearch 5.3.x。这里我改成了 ElasticSearch 2.3.2。是因为版本对应关系 https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix:

  1. Spring Boot Version (x) Spring Data Elasticsearch Version (y) Elasticsearch Version (z)  
  2. x <= 1.3.5 y <= 1.3.4 z <= 1.7.2*  
  3. x >= 1.4.x 2.0.0 <=y < 5.0.0** 2.0.0 <= z < 5.0.0** 

* - 只需要你修改下对应的 pom 文件版本号

** - 下一个 ES 的版本会有重大的更新

这里可以看出,5.3.x 不在第二行范围内。因此这里我讲下,如何在 ElasticSearch 2.3.2 中默认配置 IK。

一、什么是 Elasticsearch-analysis-ik

了解什么是 Elasticsearch-analysis-ik,首先了解什么是 IK Analyzer。 IK Analyzer 是基于 lucene 实现的分词开源框架。官方地址:https://code.google.com/p/ik-analyzer/

Elasticsearch-analysis-ik 则是将 IK Analyzer 集成 Elasticsearch 的插件,并支持自定义词典。GitHub 地址:https://github.com/medcl/elasticsearch-analysis-ik。特性支持:

分析器 Analyzer: ik_smart 或 ik_max_word

分词器 Tokenizer: ik_smart 或 ik_max_word

二、默认配置 IK

在 Elasticsearch-analysis-ik 官网中可以看到,其中版本需要对应:

  1. IK版    ES版本 
  2. 主 5.x -> master 
  3. 5.3.2    5.3.2 
  4. 5.2.2    5.2.2 
  5. 5.1.2    5.1.2 
  6. 1.10.1    2.4.1 
  7. 1.9.5    2.3.5 
  8. 1.8.1    2.2.1 
  9. 1.7.0    2.1.1 
  10. 1.5.0    2.0.0 
  11. 1.2.6    1.0.0 
  12. 1.2.5    0.90.x 
  13. 1.1.3    0.20.x 
  14. 1.0.0    0.16.2 -> 0.19.0 

这里使用的是 Elasticsearch-analysis-ik 1.9.2,支持 ElasticSearch 2.3.2。下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v1.9.2/elasticsearch-analysis-ik-1.9.2.zip,下载成功后进行安装。

解压 zip 文件,复制里面的内容到 elasticsearch-2.3.2/plugins/ik。

  1. cd  elasticsearch-2.3.2/plugins 
  2. mkdir ik 
  3. cp ... 

在 elasticsearch-2.3.2/config/elasticsearch.yml 增加配置:

  1. index.analysis.analyzer.default.tokenizer : "ik_max_word"  
  2. index.analysis.analyzer.default.type: "ik" 

配置默认分词器为 ik,并指定分词器为 ik_max_word。

然后重启 ES 即可。验证 IK 是否成功安装,访问下

localhost:9200/_analyze?analyzer=ik&pretty=true&text=泥瓦匠的博客是bysocket.com

可以得到下面的结果集:

  1.     "tokens": [ 
  2.         { 
  3.             "token""泥瓦匠"
  4.             "start_offset": 0, 
  5.             "end_offset": 3, 
  6.             "type""CN_WORD"
  7.             "position": 0 
  8.         }, 
  9.         { 
  10.             "token""泥"
  11.             "start_offset": 0, 
  12.             "end_offset": 1, 
  13.             "type""CN_WORD"
  14.             "position": 1 
  15.         }, 
  16.         { 
  17.             "token""瓦匠"
  18.             "start_offset": 1, 
  19.             "end_offset": 3, 
  20.             "type""CN_WORD"
  21.             "position": 2 
  22.         }, 
  23.         { 
  24.             "token""匠"
  25.             "start_offset": 2, 
  26.             "end_offset": 3, 
  27.             "type""CN_WORD"
  28.             "position": 3 
  29.         }, 
  30.         { 
  31.             "token""博客"
  32.             "start_offset": 4, 
  33.             "end_offset": 6, 
  34.             "type""CN_WORD"
  35.             "position": 4 
  36.         }, 
  37.         { 
  38.             "token""bysocket.com"
  39.             "start_offset": 8, 
  40.             "end_offset": 20, 
  41.             "type""LETTER"
  42.             "position": 5 
  43.         }, 
  44.         { 
  45.             "token""bysocket"
  46.             "start_offset": 8, 
  47.             "end_offset": 16, 
  48.             "type""ENGLISH"
  49.             "position": 6 
  50.         }, 
  51.         { 
  52.             "token""com"
  53.             "start_offset": 17, 
  54.             "end_offset": 20, 
  55.             "type""ENGLISH"
  56.             "position": 7 
  57.         } 
  58.     ] 

记得在Docker 容器安装时,需要对应的端口开发。

三、使用 AnalyzeRequestBuilder 获取分词结果

ES 中默认配置 IK 后,通过 Rest HTTP 的方式我们可以进行得到分词结果。那么在 Spring Boot 和提供的客户端依赖 spring-data-elasticsearch 中如何获取到分词结果。

加入依赖 pom.xml

  1. <!-- Spring Boot Elasticsearch 依赖 --> 
  2.         <dependency> 
  3.             <groupId>org.springframework.boot</groupId> 
  4.             <artifactId>spring-boot-starter-data-elasticsearch</artifactId> 
  5.         </dependency> 

在 application.properties 配置 ES 的地址:

  1. # ES 
  2. spring.data.elasticsearch.repositories.enabled = true 
  3. spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300 

然后创建一个方法,入参是搜索词,返回的是分词结果列表。

  1. @Autowired 
  2.    private ElasticsearchTemplate elasticsearchTemplate; 
  3.    /** 
  4.     * 调用 ES 获取 IK 分词后结果 
  5.     * 
  6.     * @param searchContent 
  7.     * @return 
  8.     */ 
  9.    private List<String> getIkAnalyzeSearchTerms(String searchContent) { 
  10.        // 调用 IK 分词分词 
  11.        AnalyzeRequestBuilder ikRequest = new AnalyzeRequestBuilder(elasticsearchTemplate.getClient(), 
  12.                AnalyzeAction.INSTANCE,"indexName",searchContent); 
  13.        ikRequest.setTokenizer("ik"); 
  14.        List<AnalyzeResponse.AnalyzeToken> ikTokenList = ikRequest.execute().actionGet().getTokens(); 
  15.        // 循环赋值 
  16.        List<String> searchTermList = new ArrayList<>(); 
  17.        ikTokenList.forEach(ikToken -> { searchTermList.add(ikToken.getTerm()); }); 
  18.        return searchTermList; 
  19.    } 

indexName 这里是指在 ES 设置的索引名称。

从容器注入的 ElasticsearchTemplate Bean 中获取 Client ,再通过 AnalyzeRequestBuilder 分析请求类型中进行分词并获取分词结果 AnalyzeResponse.AnalyzeToken 列表。

四、小结

默认配置了 IK 分词器,则 DSL 去 ES 查询时会自动调用 IK 分词。

如果想要自定义词库,比如比较偏的领域性。

【本文为51CTO专栏作者“李强强”的原创稿件,转载请通过51CTO联系作者获取授权】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2021-04-12 08:17:12

ElasticSear分词中文

2021-09-03 11:26:39

分词器ElasticSear

2015-05-12 16:31:22

Elasticsear开源分布式搜索引擎

2023-11-10 08:17:01

分布式搜索引擎

2023-07-03 15:55:05

语法jpa状态

2009-06-26 17:37:37

JBOSS配置

2023-03-13 23:48:31

二进制包ES

2013-07-08 15:56:51

ForemanCentOS 6.4

2020-09-07 11:30:47

ElasticSear索引Linux

2021-09-08 15:09:29

鸿蒙HarmonyOS应用

2023-02-02 09:47:39

estext类型

2021-03-18 15:10:42

ElasticSearBeta日志

2010-10-29 09:36:18

ORACLE用户

2010-06-07 12:38:37

Cacti使用手册

2015-03-24 16:29:55

默认线程池java

2021-06-09 09:36:18

DjangoElasticSearLinux

2011-08-23 10:19:44

LuaEditplusSciTE

2015-12-02 10:52:11

PHPUnitWindows配置

2019-09-16 16:30:56

2019-12-24 10:12:09

数据库工具技术
点赞
收藏

51CTO技术栈公众号