ElasticSearch6.5.0 【安装IK分词器】

不得不夸奖一下ES的周边资源,比如这个IK分词器,紧跟ES的版本,卢本伟牛逼!另外ES更新太快了吧,几乎不到半个月一个小版本就发布了!!目前已经发了6.5.2,估计我还没怎么玩就到7.0了。

下载

分词器:GitHub

点击release,下载对应的版本,他这个跟ES是一一对应的。

安装

他这个安装非常容易!业界良心啊!!

第一步:在elasticsearch-6.5.0主目录下的plugins目录新建一个ik文件夹

第二步:把从GitHub下载下来的压缩包解压到这个文件夹

启动

 进入ES主目录

[E:\elasticsearch-6.5.0]$ .\bin\elasticsearch.bat

准备数据

依赖:

1<dependency> 2 <groupId>org.apache.logging.log4j</groupId> 3 <artifactId>log4j-core</artifactId> 4 <version>2.11.1</version> 5 </dependency> 6 <dependency> 7 <groupId>org.apache.logging.log4j</groupId> 8 <artifactId>log4j-to-slf4j</artifactId> 9 <version>2.11.1</version> 10 </dependency> 11 <dependency> 12 <groupId>org.slf4j</groupId> 13 <artifactId>slf4j-api</artifactId> 14 <version>1.7.25</version> 15 </dependency> 16 17 <dependency> 18 <groupId>org.elasticsearch.client</groupId> 19 <artifactId>elasticsearch-rest-client</artifactId> 20 <version>6.5.0</version> 21 </dependency> 22 <dependency> 23 <groupId>org.elasticsearch.client</groupId> 24 <artifactId>elasticsearch-rest-high-level-client</artifactId> 25 <version>6.5.0</version> 26 </dependency>

连接:

1package com.demo.dao; 2 3import org.apache.http.HttpHost; 4import org.elasticsearch.client.RestClient; 5import org.elasticsearch.client.RestHighLevelClient; 6 7/** 8 * Java高级REST客户机在Java低级REST客户机之上工作。它的主要目标是公开特定于API的方法,这些方法接受请求对象作为参数并返回响应对象 9 * 可以同步或异步调用每个API。同步方法返回一个响应对象,而异步方法(其名称以async后缀结尾)需要一个侦听器参数 10 * 一旦接收到响应或错误,侦听器参数(在低层客户机管理的线程池上)将被通知。 11 * Java高级REST客户机依赖于Elasticsearch核心项目。它接受与TransportClient相同的请求参数,并返回相同的响应对象。 12 * Java高级REST客户机需要Java 1.8 13 * 客户机版本与开发客户机的Elasticsearch版本相同 14 * 6.0客户端能够与任意6.X节点通信,6.1客户端能够与6.1、6.2和任意6.X通信 15 */ 16public class RestClientFactory { 17 18 private RestClientFactory(){} 19 20 private static class Inner{ 21 private static final RestClientFactory instance = new RestClientFactory(); 22 } 23 24 public static RestClientFactory getInstance(){ 25 return Inner.instance; 26 } 27 28 public RestHighLevelClient getClient(){ 29 RestHighLevelClient client = new RestHighLevelClient( 30 RestClient.builder( 31 //new HttpHost("localhost", 9201, "http"), 32 new HttpHost("localhost", 9200, "http") 33 ) 34 ); 35 return client; 36 } 37 38}

代码:

1/** 2 * 创建索引 3 * @return 4 * @throws IOException 5 */ 6 public static RestHighLevelClient createIndexForIk() throws IOException { 7 RestHighLevelClient client = RestClientFactory.getInstance().getClient(); 8 CreateIndexRequest request = new CreateIndexRequest("test_ik_index"); 9 request.settings(Settings.builder() 10 .put("index.number_of_shards", 1) 11 .put("index.number_of_replicas", 1)) 12 // 设置mapping 13 .mapping("social", "content1","type=text", "content2", "type=text,analyzer=ik_smart","content3", "type=text,analyzer=ik_max_word") 14 // 创建超时 15 .timeout(TimeValue.timeValueMinutes(2)) 16 // 连接到主节点超时时间 17 .masterNodeTimeout(TimeValue.timeValueMinutes(1)); 18 CreateIndexResponse indexResponse = client.indices().create(request, RequestOptions.DEFAULT); 19 boolean acknowledged = indexResponse.isAcknowledged(); 20 boolean shardsAcknowledged = indexResponse.isShardsAcknowledged(); 21 System.out.println(acknowledged + "," + shardsAcknowledged); 22 return client; 23 } 24 25 /** 26 * 准备数据 27 * @return 28 * @throws IOException 29 */ 30 public static RestHighLevelClient bulkAddForIk() throws IOException { 31 RestHighLevelClient client = RestClientFactory.getInstance().getClient(); 32 BulkRequest request = new BulkRequest(); 33 request.add(new IndexRequest("test_ik_index", "social", "1") 34 .source(XContentType.JSON,"content1", "富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善", 35 "content2", "“富强、民主、文明、和谐”,是我国社会主义现代化国家的建设目标,也是从价值目标层面对社会主义核心价值观基本理念的凝练,在社会主义核心价值观中居于最高层次,对其他层次的价值理念具有统领作用", 36 "content3", "富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善")); 37 request.add(new IndexRequest("test_ik_index", "social", "2") 38 .source(XContentType.JSON,"content1", "以热爱祖国为荣,以危害祖国为耻", 39 "content2", "1978年12月,党的十一届三中全会重新恢复和确立了实事求是的思想路线,坚持把马克思主义与改革开放和我国社会主义建设伟大实践相结合,科学继承了***思想,创立了邓小平理论、“三个代表”重要思想、科学发展观等马克思主义中国化最新成果,马克思主义在意识形态领域的指导地位不断巩固", 40 "content3", "“自由、平等、公正、法治”,是对美好社会的生动表述,也是从社会层面对社会主义核心价值观基本理念的凝练")); 41 request.add(new IndexRequest("test_ik_index", "social", "3") 42 .source(XContentType.JSON,"content1", "以服务人民为荣,以背离人民为耻", 43 "content2", "新中国的建立,确立了以社会主义基本政治制度、基本经济制度的确立和以马克思主义为指导思想的社会主义意识形态,为社会主义核心价值体系建设奠定了政治前提、物质基础和文化条件", 44 "content3", "“爱国、敬业、诚信、友善”,是公民基本道德规范,是从个人行为层面对社会主义核心价值观基本理念的凝练")); 45 BulkResponse bulk = client.bulk(request, RequestOptions.DEFAULT); 46 System.out.println("Status:" + bulk.status().name() + ",hasFailures:" + bulk.hasFailures()); 47 MultiGetRequest multiGetRequest = new MultiGetRequest() 48 .add(new MultiGetRequest.Item("test_ik_index", "social", "1")) 49 .add(new MultiGetRequest.Item("test_ik_index", "social", "2")) 50 .add(new MultiGetRequest.Item("test_ik_index", "social", "3")); 51 MultiGetResponse response = client.mget(multiGetRequest, RequestOptions.DEFAULT); 52 MultiGetItemResponse[] itemResponses = response.getResponses(); 53 for(MultiGetItemResponse r : itemResponses){ 54 System.out.println(r.getResponse().getSourceAsString()); 55 } 56 return client; 57 }

执行

1public static void main(String[] args) throws IOException, ExecutionException, InterruptedException { 2 createIndexForIk().close(); 3 bulkAddForIk().close(); 4 }

我有三个字段:content1--用的默认分词器;content2:用的ik_smart;content3:用的ik_max_word

测试(在Kibana控制台里)

 第一个查询:(可见默认的没有正确分词,看highlight字段

1GET /test_ik_index/_search 2{ 3 "query" : { 4 "match": { "content1": "中国" } 5 }, 6 "highlight" : { 7 "pre_tags" : ["<tag1>"], 8 "post_tags" : ["</tag1>"], 9 "fields" : { 10 "content1": {} 11 } 12 } 13} 14 15------------------------------- 16{ 17 "took" : 3, 18 "timed_out" : false, 19 "_shards" : { 20 "total" : 1, 21 "successful" : 1, 22 "skipped" : 0, 23 "failed" : 0 24 }, 25 "hits" : { 26 "total" : 2, 27 "max_score" : 0.68320733, 28 "hits" : [ 29 { 30 "_index" : "test_ik_index", 31 "_type" : "social", 32 "_id" : "2", 33 "_score" : 0.68320733, 34 "_source" : { 35 "content1" : "以热爱祖国为荣,以危害祖国为耻", 36 "content2" : "1978年12月,党的十一届三中全会重新恢复和确立了实事求是的思想路线,坚持把马克思主义与改革开放和我国社会主义建设伟大实践相结合,科学继承了***思想,创立了邓小平理论、“三个代表”重要思想、科学发展观等马克思主义中国化最新成果,马克思主义在意识形态领域的指导地位不断巩固", 37 "content3" : "“自由、平等、公正、法治”,是对美好社会的生动表述,也是从社会层面对社会主义核心价值观基本理念的凝练" 38 }, 39 "highlight" : { 40 "content1" : [ 41 "以热爱祖<tag1>国</tag1>为荣,以危害祖<tag1>国</tag1>为耻" 42 ] 43 } 44 }, 45 { 46 "_index" : "test_ik_index", 47 "_type" : "social", 48 "_id" : "1", 49 "_score" : 0.40610588, 50 "_source" : { 51 "content1" : "富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善", 52 "content2" : "“富强、民主、文明、和谐”,是我国社会主义现代化国家的建设目标,也是从价值目标层面对社会主义核心价值观基本理念的凝练,在社会主义核心价值观中居于最高层次,对其他层次的价值理念具有统领作用", 53 "content3" : "富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善" 54 }, 55 "highlight" : { 56 "content1" : [ 57 "富强、民主、文明、和谐,自由、平等、公正、法治,爱<tag1>国</tag1>、敬业、诚信、友善" 58 ] 59 } 60 } 61 ] 62 } 63}

第二个:(ok)

1GET /test_ik_index/_search 2{ 3 "query" : { 4 "match": { "content2": "马克思主义" } 5 }, 6 "highlight" : { 7 "pre_tags" : ["<tag1>"], 8 "post_tags" : ["</tag1>"], 9 "fields" : { 10 "content2": {} 11 } 12 } 13} 14 15------------------------------- 16{ 17 "took" : 6, 18 "timed_out" : false, 19 "_shards" : { 20 "total" : 1, 21 "successful" : 1, 22 "skipped" : 0, 23 "failed" : 0 24 }, 25 "hits" : { 26 "total" : 2, 27 "max_score" : 0.71390307, 28 "hits" : [ 29 { 30 "_index" : "test_ik_index", 31 "_type" : "social", 32 "_id" : "2", 33 "_score" : 0.71390307, 34 "_source" : { 35 "content1" : "以热爱祖国为荣,以危害祖国为耻", 36 "content2" : "1978年12月,党的十一届三中全会重新恢复和确立了实事求是的思想路线,坚持把马克思主义与改革开放和我国社会主义建设伟大实践相结合,科学继承了***思想,创立了邓小平理论、“三个代表”重要思想、科学发展观等马克思主义中国化最新成果,马克思主义在意识形态领域的指导地位不断巩固", 37 "content3" : "“自由、平等、公正、法治”,是对美好社会的生动表述,也是从社会层面对社会主义核心价值观基本理念的凝练" 38 }, 39 "highlight" : { 40 "content2" : [ 41 "1978年12月,党的十一届三中全会重新恢复和确立了实事求是的思想路线,坚持把<tag1>马克思主义</tag1>与改革开放和我国社会主义建设伟大实践相结合,科学继承了***思想,创立了邓小平理论、“三个代表”重要思想、科学发展观等<tag1>马克思主义</tag1>中国化最新成果", 42 ",<tag1>马克思主义</tag1>在意识形态领域的指导地位不断巩固" 43 ] 44 } 45 }, 46 { 47 "_index" : "test_ik_index", 48 "_type" : "social", 49 "_id" : "3", 50 "_score" : 0.50678647, 51 "_source" : { 52 "content1" : "以服务人民为荣,以背离人民为耻", 53 "content2" : "新中国的建立,确立了以社会主义基本政治制度、基本经济制度的确立和以马克思主义为指导思想的社会主义意识形态,为社会主义核心价值体系建设奠定了政治前提、物质基础和文化条件", 54 "content3" : "“爱国、敬业、诚信、友善”,是公民基本道德规范,是从个人行为层面对社会主义核心价值观基本理念的凝练" 55 }, 56 "highlight" : { 57 "content2" : [ 58 "新中国的建立,确立了以社会主义基本政治制度、基本经济制度的确立和以<tag1>马克思主义</tag1>为指导思想的社会主义意识形态,为社会主义核心价值体系建设奠定了政治前提、物质基础和文化条件" 59 ] 60 } 61 } 62 ] 63 } 64}

第三个:(ok)

1GET /test_ik_index/_search 2{ 3 "query" : { 4 "match": { "content3": "富强" } 5 }, 6 "highlight" : { 7 "pre_tags" : ["<tag1>"], 8 "post_tags" : ["</tag1>"], 9 "fields" : { 10 "content3" : {} 11 } 12 } 13} 14 15----------------------------------- 16{ 17 "took" : 2, 18 "timed_out" : false, 19 "_shards" : { 20 "total" : 1, 21 "successful" : 1, 22 "skipped" : 0, 23 "failed" : 0 24 }, 25 "hits" : { 26 "total" : 1, 27 "max_score" : 1.2146692, 28 "hits" : [ 29 { 30 "_index" : "test_ik_index", 31 "_type" : "social", 32 "_id" : "1", 33 "_score" : 1.2146692, 34 "_source" : { 35 "content1" : "富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善", 36 "content2" : "“富强、民主、文明、和谐”,是我国社会主义现代化国家的建设目标,也是从价值目标层面对社会主义核心价值观基本理念的凝练,在社会主义核心价值观中居于最高层次,对其他层次的价值理念具有统领作用", 37 "content3" : "富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善" 38 }, 39 "highlight" : { 40 "content3" : [ 41 "<tag1>富强</tag1>、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善" 42 ] 43 } 44 } 45 ] 46 } 47}

 你也可以单独验证分词器

1GET test_ik_index/_analyze 2{ 3 "analyzer": "ik_max_word", 4 "text": "中央高度重视培育和践行社会主义核心价值观" 5} 6 7----------------------- 8{ 9 "tokens" : [ 10 { 11 "token" : "中央", 12 "start_offset" : 0, 13 "end_offset" : 2, 14 "type" : "CN_WORD", 15 "position" : 0 16 }, 17 { 18 "token" : "高度重视", 19 "start_offset" : 2, 20 "end_offset" : 6, 21 "type" : "CN_WORD", 22 "position" : 1 23 }, 24 { 25 "token" : "高度", 26 "start_offset" : 2, 27 "end_offset" : 4, 28 "type" : "CN_WORD", 29 "position" : 2 30 }, 31 { 32 "token" : "重视", 33 "start_offset" : 4, 34 "end_offset" : 6, 35 "type" : "CN_WORD", 36 "position" : 3 37 }, 38 { 39 "token" : "培育", 40 "start_offset" : 6, 41 "end_offset" : 8, 42 "type" : "CN_WORD", 43 "position" : 4 44 }, 45 { 46 "token" : "和", 47 "start_offset" : 8, 48 "end_offset" : 9, 49 "type" : "CN_CHAR", 50 "position" : 5 51 }, 52 { 53 "token" : "践行", 54 "start_offset" : 9, 55 "end_offset" : 11, 56 "type" : "CN_WORD", 57 "position" : 6 58 }, 59 { 60 "token" : "行社", 61 "start_offset" : 10, 62 "end_offset" : 12, 63 "type" : "CN_WORD", 64 "position" : 7 65 }, 66 { 67 "token" : "社会主义", 68 "start_offset" : 11, 69 "end_offset" : 15, 70 "type" : "CN_WORD", 71 "position" : 8 72 }, 73 { 74 "token" : "社会", 75 "start_offset" : 11, 76 "end_offset" : 13, 77 "type" : "CN_WORD", 78 "position" : 9 79 }, 80 { 81 "token" : "主义", 82 "start_offset" : 13, 83 "end_offset" : 15, 84 "type" : "CN_WORD", 85 "position" : 10 86 }, 87 { 88 "token" : "核心", 89 "start_offset" : 15, 90 "end_offset" : 17, 91 "type" : "CN_WORD", 92 "position" : 11 93 }, 94 { 95 "token" : "价值观", 96 "start_offset" : 17, 97 "end_offset" : 20, 98 "type" : "CN_WORD", 99 "position" : 12 100 }, 101 { 102 "token" : "价值", 103 "start_offset" : 17, 104 "end_offset" : 19, 105 "type" : "CN_WORD", 106 "position" : 13 107 }, 108 { 109 "token" : "观", 110 "start_offset" : 19, 111 "end_offset" : 20, 112 "type" : "CN_CHAR", 113 "position" : 14 114 } 115 ] 116}

 还可以通过Java API

1public static RestHighLevelClient analyze() throws IOException { 2 RestHighLevelClient client = RestClientFactory.getInstance().getClient(); 3 AnalyzeRequest request = new AnalyzeRequest(); 4 request.text("高通指控苹果侵犯其两项专利", "高通再次将苹果告上法庭,起诉苹果拖欠专利费 70 亿美元"); 5 request.analyzer("ik_smart"); 6 AnalyzeResponse response = client.indices().analyze(request, RequestOptions.DEFAULT); 7 List<AnalyzeResponse.AnalyzeToken> tokens = response.getTokens(); 8 9 for(AnalyzeResponse.AnalyzeToken t : tokens){ 10 int endOffset = t.getEndOffset(); 11 int position = t.getPosition(); 12 int positionLength = t.getPositionLength(); 13 int startOffset = t.getStartOffset(); 14 String term = t.getTerm(); 15 String type = t.getType(); 16 System.out.println("Start:" + startOffset + ",End:" + endOffset + ",Position:" + position + ",Length:" + positionLength + 17 ",Term:" + term + ",Type:" + type); 18 } 19 return client; 20 }

结果:

1Start:0,End:1,Position:0,Length:1,Term:,Type:CN_CHAR 2Start:1,End:2,Position:1,Length:1,Term:,Type:CN_CHAR 3Start:2,End:4,Position:2,Length:1,Term:指控,Type:CN_WORD 4Start:4,End:6,Position:3,Length:1,Term:苹果,Type:CN_WORD 5Start:6,End:8,Position:4,Length:1,Term:侵犯,Type:CN_WORD 6Start:8,End:9,Position:5,Length:1,Term:,Type:CN_CHAR 7Start:9,End:11,Position:6,Length:1,Term:两项,Type:CN_WORD 8Start:11,End:13,Position:7,Length:1,Term:专利,Type:CN_WORD 9Start:14,End:15,Position:8,Length:1,Term:,Type:CN_CHAR 10Start:15,End:16,Position:9,Length:1,Term:,Type:CN_CHAR 11Start:16,End:18,Position:10,Length:1,Term:再次,Type:CN_WORD 12Start:18,End:19,Position:11,Length:1,Term:,Type:CN_CHAR 13Start:19,End:21,Position:12,Length:1,Term:苹果,Type:CN_WORD 14Start:21,End:22,Position:13,Length:1,Term:,Type:CN_CHAR 15Start:22,End:23,Position:14,Length:1,Term:,Type:CN_CHAR 16Start:23,End:25,Position:15,Length:1,Term:法庭,Type:CN_WORD 17Start:26,End:28,Position:16,Length:1,Term:起诉,Type:CN_WORD 18Start:28,End:30,Position:17,Length:1,Term:苹果,Type:CN_WORD 19Start:30,End:32,Position:18,Length:1,Term:拖欠,Type:CN_WORD 20Start:32,End:35,Position:19,Length:1,Term:专利费,Type:CN_WORD 21Start:36,End:38,Position:20,Length:1,Term:70,Type:ARABIC 22Start:39,End:40,Position:21,Length:1,Term:亿,Type:TYPE_CNUM 23Start:40,End:42,Position:22,Length:1,Term:美元,Type:CN_WORD

 到此为止,分词器安装完毕

 小插曲:文本有***不让发布。。。。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )