springboot整合elasticsearch5.x以及IK分词器做全文检索
文章我会分三部分来讲解:
第一部分,window下搭建elasticsearch的环境,以及其他插件
第二部分,springboot整合elasticsearch(有一定的分词能力)
第三部分,springboot整合elasticsearch以及ik分词器,做全字段检索(完全分词)
(我的第二篇,《springboot2.x 整合 elasticsearch 创建索引的方式》有更实用的意义,弃用postman创建索引方式,附上项目GitHub地址)
一:window安装部署elasticsearch和elasticsearch-head
现在直接在window下安装部署elasticsearch5.5.3。
这里是下载elasticsearch的官网网址:Download Elasticsearch | Elastic
步骤如下:
接着到github主页,下载相应的版本的zip压缩包。
然后解压到磁盘的某个路径,路径不要包含中文字符。
然后进入bin目录下,双击elasticsearch.bat文件,启动elasticsearch。也可以用控制台,输入elasticsearch.bat,然后按回车键,启动elasticsearch。
启动完成后,在浏览器,输入localhost:9200。查看启动效果,如下图,则表示安装启动elasticsearch5.5.3成功。
接下来,对elasticsearch5.5.3进行一些配置,让elasticsearch-head可以访问elasticsearch。elasticsearch-head是让elasticsearch数据可视化的插件。
在window下使用elasticsearch-head插件,要有node.js环境
安装node.js: node.js下载:Download | Node.js
安装grunt:
- grunt是一个很方便的构建工具,可以进行打包压缩、测试、执行等等的工作,5.x里的head插件就是通过grunt启动的。因此需要安装grunt
- 注意:路径切到nodejs安装目录下,[我安装在C:\Program Files\nodejs],输入命令: npm install -g grunt-cli
- -g代表全局安装
- 查看版本号, 输入命令:grunt -version
elasticsearch-head的下载官网网址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster
同样下载zip包,然后指定路径解压,路径也不要有中文字符。(我是将elasticsearch和elasticsearch-head放在E盘路径下)。
①:修改elasticsearch-head配置,找到 elasticsearch-head-master下的Gruntfile.js,文件, 新增:hostname: '0.0.0.0'.
connect: { server: { options: { hostname: '0.0.0.0', port: 9100, base: '.', keepalive: true } } }
②: 修改elasticsearch的配置文件,进入elasticsearch的config目录下,修改elasticsearch.yml文件里面的配置。
cluster.name: elasticsearch
node.name: node-esnetwork.host: 127.0.0.1
http.port: 9200
transport.tcp.port: 9300# 增加新的参数,这样head插件就可以访问es
http.cors.enabled: true
http.cors.allow-origin: "*"
上面7行配置代码,全部都是需要往elasticsearch.yml新增的配置,我特意将它们分割三部分。第一部分的配置,可以在启动elasticsearch之后的页面直接能看到(如我上面启动后截图的①②所示)。 最后两个,http.cors.enabled: true, 和 http.cors.allow-origin: "*", 是让head插件访问链接用的配置,不可缺少。
重启elasticsearch。接着在elasticsearch-head-master的目录下,输入命令:grunt server,启动head插件
然后在浏览器输入: localhost:9100
到这里,elasticsearch和elasticsearch-head的安装与配置已经完成。
elasticsearch以及elasticsearch-head的安装与配置,推荐一个网址,这个哥们写得很好,我的配置都是按他的来配置的:在Windows上安装Elasticsearch 5.x - 秦岭过客 - 博客园
二:springboot整合elasticsearch
到springboot官网看你就知道,整合elasticsearch有三种方式:
- Connecting to Elasticsearch by REST clients
- Connecting to Elasticsearch by Using Jest
- Connecting to Elasticsearch by Using Spring Data
这里我是使用第三种方式,spring Data elasticsearch
新建一个springboot工程,我的springboot版本是2.0.0
我的pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>// 可以直接在这里修改你的springboot版本,我的springboot新建时是2.1.6的,然后在这里修改为2.0.0<version>2.0.0.RELEASE</version> <relativePath/></parent><groupId>com.gosuncn</groupId><artifactId>esdemo</artifactId><version>0.0.1-SNAPSHOT</version><name>esdemo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><elasticsearch.version>5.5.3</elasticsearch.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.5.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
然后可以看你springboot导入的elasticsearch.jar的版本
因为spring data elasticsearch 与elasticsearch是要进行版本适配的,不匹配,是不能进行连接的。
细心的朋友,可能已经发现,我的elasticsearch已经存在一个local_library索引了。那我们就以这个索引为例。
这里,我先说明一下,我的local_library索引是怎样创建的。使用postman,提交PUT请求,即可创建local_library索引,以及这个索引下的book类型。
body实体里面的内容如下:在local_library索引下,创建一个book类型。
{"mappings":{"book":{"properties":{"book_id":{"type":"long","fields":{"keyword":{"type":"keyword"}}},"book_code":{"type":"text","fields":{"keyword":{"type":"keyword"}}},"book_name":{"type":"text","fields":{"keyword":{"type":"keyword"}}},"book_price":{"type":"integer","fields":{"keyword":{"type":"keyword"}}},"book_author":{"type":"text","fields":{"keyword":{"type":"keyword"}}},"book_desc":{"type":"text","fields":{"keyword":{"type":"keyword"}}}}}}
}
在elasticsearch-head查看效果如下:(备注:)
接着,有索引,有类型了,可以开始插入数据。插入数据有两种方式,第一种是用postman, 第二种是在springboot工程的测试类中插入。
①:用postman插入数据示例:
插入的效果,可以看上面数据截图。
②:用实体类插入数据(包括新增、查询)
新建一个Library实体类:(备注,实体类已经使用lombok插件了)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "local_library", type = "book")
public class Library {/*** index:是否设置分词* analyzer:存储时使用的分词器* ik_max_word* ik_word* searchAnalyze:搜索时使用的分词器* store:是否存储* type: 数据类型*/@Idprivate Integer book_id;private String book_code; private String book_name; private Integer book_price; private String book_author; private String book_desc;}
然后编写一个LibraryRepository:
@Repository
public interface LibraryRepository extends ElasticsearchRepository<Library, Long> {
}
然后在测试类中,插入数据:
import com.gosuncn.esdemo.domin.Library;
import com.gosuncn.esdemo.repository.LibraryRepository;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class EsdemoApplicationTests {@AutowiredElasticsearchTemplate elasticsearchTemplate;@AutowiredLibraryRepository libraryRepository;/*** 插入数据*/@Testpublic void testInsert(){libraryRepository.save(new Library(42, "A00042", "明史简述", 59, "吴晗", "吴晗背景uniworsity厉害"));libraryRepository.save(new Library(43, "A00043", "傅雷家书", 99, "傅聪", "都是NB,class大家u"));libraryRepository.save(new Library(24, "A00942", "时间简史", 169, "霍金", "教授宇宙大爆发的59年历史"));libraryRepository.save(new Library(25, "A00925", "我的前半生", 39, "方舟89子", "都是生活,每晚9点"));libraryRepository.save(new Library(29, "A00029", "围9城", 139, "钱钟书", "你想出城?不存在的"));}
}
到此,这是第二种插入数据的方式。
然后数据有了,就可以进行查询了。查询代码如下:
// 全字段查询,不分页@Testpublic void testSearch(){try {String searchStr = "三西阿";QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchStr);Iterable<Library> search = libraryRepository.search(builder);Iterator<Library> iterator = search.iterator();while (iterator.hasNext()){System.out.println("--> 数据:"+iterator.next());}}catch (Exception e){System.out.println("---> 异常信息: "+e);}}// 全字段查询, 已经分页@Testpublic void testSearchByPage(){try {String searchStr = "三西阿";QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchStr);Iterable<Library> search = libraryRepository.search(builder, PageRequest.of(0,2));Iterator<Library> iterator = search.iterator();while (iterator.hasNext()){System.out.println("--> 数据:"+iterator.next());}}catch (Exception e){System.out.println("---> 异常信息: "+e);}}
运行第一个test的结果是:
--> 数据:Library{book_id=3, book_code='A0003', book_name='西游记', book_price=99, book_author='吴承恩', book_desc='冒险小说!'}
--> 数据:Library{book_id=6, book_code='A0006', book_name='欢乐颂', book_price=399, book_author='阿耐', book_desc='都是生活真实隐射!'}
--> 数据:Library{book_id=7, book_code='A0007', book_name='都挺好', book_price=299, book_author='阿耐', book_desc='折射现实家庭矛盾!'}
--> 数据:Library{book_id=5, book_code='A0005', book_name='三国演义', book_price=198, book_author='罗贯中', book_desc='三国霸王游戏!'}
--> 数据:Library{book_id=18, book_code='A00018', book_name='编译原理', book_price=79, book_author='赵建华', book_desc='三十多小时,98.5'}
--> 数据:Library{book_id=1, book_code='A0001', book_name='琴帝', book_price=180, book_author='唐家三少', book_desc='最好看的玄幻小说!'}
--> 数据:Library{book_id=12, book_code='A00012', book_name='三重门', book_price=69, book_author='韩寒', book_desc='这是一个批评现实的真实故事'}
三:IK分词器的使用
前面的都是小case,到这里才是我们做全文检索的重点。
3.1:为什么要使用IK分词器
ik分词器,会将你的查询条件语句拆分成一个一个词。比如:查询语句是“我爱中华人民共和国”,使用ik_max_word来分词,则会出现下面的结果: 【“我”,“爱”,“中华人民共和国”,“中华人民”,“中华”,“华人”,“人民共和国”,“人民”,“人民共和国”,“共和”,“国”】。具体看下图:(使用postman)
body结果代码如下:
{"tokens": [{"token": "我","start_offset": 0,"end_offset": 1,"type": "CN_CHAR","position": 0},{"token": "爱","start_offset": 1,"end_offset": 2,"type": "CN_CHAR","position": 1},{"token": "中华人民共和国","start_offset": 2,"end_offset": 9,"type": "CN_WORD","position": 2},{"token": "中华人民","start_offset": 2,"end_offset": 6,"type": "CN_WORD","position": 3},{"token": "中华","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 4},{"token": "华人","start_offset": 3,"end_offset": 5,"type": "CN_WORD","position": 5},{"token": "人民共和国","start_offset": 4,"end_offset": 9,"type": "CN_WORD","position": 6},{"token": "人民","start_offset": 4,"end_offset": 6,"type": "CN_WORD","position": 7},{"token": "共和国","start_offset": 6,"end_offset": 9,"type": "CN_WORD","position": 8},{"token": "共和","start_offset": 6,"end_offset": 8,"type": "CN_WORD","position": 9},{"token": "国","start_offset": 8,"end_offset": 9,"type": "CN_CHAR","position": 10}]
}
补充说明一下的区别:ik_max_word 和 ik_smart
ik_max_word 会将文本做最细粒度的拆分。
ik_smart 会做最粗粒度的拆分。
ik_max_word 和 ik_smart 是两个不同类型的分词器。
3.2 安装ik分词器
ik分词器的下载与安装:(备注:ik分词器的版本,必须与elasticsearch版本一致)
GitHub下载地址: Releases · medcl/elasticsearch-analysis-ik · GitHub
找到5.5.3版本的
点击下载elasticsearch-analysis-ik-5.5.3.zip 包,然后解压,打开解压后的文件夹,里面有如下文件
接着,把这里的所有文件复制到elasticsearch的plugins目录下,自己新建的ik文件夹里面(说明: ik文件夹是自己新建的,至于为什么要新建一个ik文件夹。其实到后来,你会在使用elasticsearch时添加很多的插件,每一个插件都是放在plugins目录下的,所以建一个文件夹,单独存放某个插件,会有一个很清晰的文件目录)
然后重启elasticsearch。
出现红圈所示,则说明插件安装成功。
检验效果:启动elasticsearch成功后,直接在浏览器输入:http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我爱中华人民共和国
备注:
如果是ik分词插件是6.x版本的,只能用postman测试,而且查询条件要放在body体内,如下图:
如果直接在url加上查询条件,如: http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=大胆爱,不用地阿达女,加
会抛出异常:
{"error": {"root_cause": [{"type": "parse_exception","reason": "request body or source parameter is required"}],"type": "parse_exception","reason": "request body or source parameter is required"},"status": 400
}
3.3 自定义分词器
上面说的ik_max_word 和ik_smart 这两种分词器,其实不是我想要的效果。比如我要查询“cla好好学习,15成功”。
浏览器输入:http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=cla好好学习,15成功
我想要将查询条件分拆成:【"c", "l", "a", "好", "好", "学", "习", ",", "1", "5", "成", "功"】这种,单个字,单个词,单个数字的最小粒度。但是ik_max_word 已经是不能满足我的需求了,那我们就自定义一个分词器(analyzer)
使用NGram 来定义一个分词器: 官网:NGram Tokenizer | Elasticsearch Guide [6.4] | Elastic
这个网址里面的内容很重要,看不懂英文的小伙伴,可以用浏览器的插件,将它翻译成中文。
这句话:They are useful for querying languages that don’t use spaces or that have long compound words, like German.
意思是:它们对于查询不使用空格或具有长复合词的语言非常有用,比如德语。
我就直接使用官网的例子进行说明:输入的查询条件是:“Quick Fox”.
POST _analyze
{"tokenizer": "ngram","text": "Quick Fox"
}
分词后的结果是:
[ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " ", " F", F, Fo, o, ox, x ]
可以给 ngram 配置下面三个参数:
①:min_gram :字符的最小长度,默认是1.
②:max_gram:字符的最大长度,默认是2.
③:token_chars: 可以理解为elasticsearch分割字符的点。其中又可以包含5个属性。letter
,digit
,whitespace
,punctuation
,symbol
。
知道这些配置后,开始实例:(实例里面,自定义一个 myanalyzer 分词器,并创建my_user索引,和user类型)
PUT localhost:9200/my_user/{"settings": {"analysis": {"analyzer": {"myanalyzer": {"tokenizer": "mytokenizer"}},"tokenizer": {"mytokenizer": {"type": "ngram","min_gram": 1,"max_gram": 2,"token_chars": ["letter","digit","whitespace","punctuation","symbol"]}}}},"mappings":{"user":{"properties":{"id":{"type":"long","store": true,"index": false,"fields":{"keyword":{"type":"keyword"}}},"username":{"type":"text","store": true,"index": true,"analyzer": "myanalyzer","fields":{"keyword":{"type":"keyword"}}},"password":{"type":"text","store": true,"index": true,"analyzer": "myanalyzer","fields":{"keyword":{"type":"keyword"}}},"age":{"type":"integer","fields":{"keyword":{"type":"keyword"}}},"ip":{"type":"text","store": true,"index": true,"analyzer": "myanalyzer","fields":{"keyword":{"type":"keyword"}}}}}}
}
postman截图:
或者可以使用这种方式:
POST localhost:9200/my_user/_analyze?analyzer=myanalyzer&pretty=true{"text": "2 Quick Fo18陈xes姥爷."
}
接着用postman查询构建的这个my_user索引,类型为user。
POST localhost:9200/my_user/_analyze{"analyzer": "myanalyzer","text": "2 Quick Fo18陈xes姥爷."
}// 结果
{"tokens": [{"token": "2","start_offset": 0,"end_offset": 1,"type": "word","position": 0},{"token": "2 ","start_offset": 0,"end_offset": 2,"type": "word","position": 1},{"token": " ","start_offset": 1,"end_offset": 2,"type": "word","position": 2},{"token": " Q","start_offset": 1,"end_offset": 3,"type": "word","position": 3},{"token": "Q","start_offset": 2,"end_offset": 3,"type": "word","position": 4},{"token": "Qu","start_offset": 2,"end_offset": 4,"type": "word","position": 5},{"token": "u","start_offset": 3,"end_offset": 4,"type": "word","position": 6},{"token": "ui","start_offset": 3,"end_offset": 5,"type": "word","position": 7},{"token": "i","start_offset": 4,"end_offset": 5,"type": "word","position": 8},{"token": "ic","start_offset": 4,"end_offset": 6,"type": "word","position": 9},{"token": "c","start_offset": 5,"end_offset": 6,"type": "word","position": 10},{"token": "ck","start_offset": 5,"end_offset": 7,"type": "word","position": 11},{"token": "k","start_offset": 6,"end_offset": 7,"type": "word","position": 12},{"token": "k ","start_offset": 6,"end_offset": 8,"type": "word","position": 13},{"token": " ","start_offset": 7,"end_offset": 8,"type": "word","position": 14},{"token": " F","start_offset": 7,"end_offset": 9,"type": "word","position": 15},{"token": "F","start_offset": 8,"end_offset": 9,"type": "word","position": 16},{"token": "Fo","start_offset": 8,"end_offset": 10,"type": "word","position": 17},{"token": "o","start_offset": 9,"end_offset": 10,"type": "word","position": 18},{"token": "o1","start_offset": 9,"end_offset": 11,"type": "word","position": 19},{"token": "1","start_offset": 10,"end_offset": 11,"type": "word","position": 20},{"token": "18","start_offset": 10,"end_offset": 12,"type": "word","position": 21},{"token": "8","start_offset": 11,"end_offset": 12,"type": "word","position": 22},{"token": "8陈","start_offset": 11,"end_offset": 13,"type": "word","position": 23},{"token": "陈","start_offset": 12,"end_offset": 13,"type": "word","position": 24},{"token": "陈x","start_offset": 12,"end_offset": 14,"type": "word","position": 25},{"token": "x","start_offset": 13,"end_offset": 14,"type": "word","position": 26},{"token": "xe","start_offset": 13,"end_offset": 15,"type": "word","position": 27},{"token": "e","start_offset": 14,"end_offset": 15,"type": "word","position": 28},{"token": "es","start_offset": 14,"end_offset": 16,"type": "word","position": 29},{"token": "s","start_offset": 15,"end_offset": 16,"type": "word","position": 30},{"token": "s姥","start_offset": 15,"end_offset": 17,"type": "word","position": 31},{"token": "姥","start_offset": 16,"end_offset": 17,"type": "word","position": 32},{"token": "姥爷","start_offset": 16,"end_offset": 18,"type": "word","position": 33},{"token": "爷","start_offset": 17,"end_offset": 18,"type": "word","position": 34},{"token": "爷.","start_offset": 17,"end_offset": 19,"type": "word","position": 35},{"token": ".","start_offset": 18,"end_offset": 19,"type": "word","position": 36}]
}
postman截图:
得到的结果是:分词成功。
3.4 重新构建springboot使用myanalyzer分词器,做全文检索
新建一个User实体:(对应elasticsearch中的my_user索引,和user类型)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "my_user", type = "user")
public class User {/*** index:是否设置分词* analyzer:存储时使用的分词器* searchAnalyze:搜索时使用的分词器* store:是否存储* type: 数据类型*/@Id@Field(store = true, index = false, type =FieldType.Integer)private Integer id;@Field(store = true, index = true, type = FieldType.keyword, analyzer = "myanalyzer", searchAnalyzer = "myanalyzer")private String username;@Field(store = true, index = true, type = FieldType.keyword, analyzer = "myanalyzer", searchAnalyzer = "myanalyzer")private String password;@Field(store = true, index = true, type = FieldType.Integer, analyzer = "myanalyzer", searchAnalyzer = "myanalyzer")private Integer age;@Field(store = true, index = true, type = FieldType.keyword, analyzer = "myanalyzer", searchAnalyzer = "myanalyzer")private String ip;}
新建UserRepository接口。
@Repository
public interface UserRepository extends ElasticsearchRepository<User, Long> {
}
在测试类中进行测试: (插入数据)
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {@AutowiredUserRepository userRepository;// 插入数据@Testpublic void testInsert(){userRepository.save(new User(3, "高新兴", "gao45", 18, "我登录的ip地址是:127.145.0.11"));userRepository.save(new User(4, "神州@数码", "shen18", 18, "我登录的ip地址是:127.124.0.11"));userRepository.save(new User(6, "西南大学", "xida", 18, "我登录的ip地址是:127.126.0.11"));userRepository.save(new User(7, "北京大学", "beida", 18, "我记录的ip地址是:127.127.0.11"));userRepository.save(new User(8, "姚#明", "yao210", 18, "我登录的@#%ip地址是:127.248.0.11"));userRepository.save(new User(9, "邓紫棋", "dengml", 18, "我使用的ip地址是:127.249.0.11"));userRepository.save(new User(10, "李荣浩", "li06", 18, "我使用的@ip地址是:127.234.0.11"));userRepository.save(new User(11, "陈奕迅", "19ch8en", 18, "我登录的ip地址是:127.219.0.11"));userRepository.save(new User(12, "周杰伦", "xiayu2014", 18, "我登录的ip地址是:127.0.0.11"));userRepository.save(new User(13, "林俊杰", "zho99", 18, "我登录,的ip地址是:127.111.0.11"));userRepository.save(new User(137, "林薇因", "zho99", 18, "我登录,的ip地址是:127.111.0.11"));}
插入数据后, elasticsearch里面的数据显示如下:
查询数据:
@Testpublic void testQueryByStr(){try {String searchStr = "陈夏天u马立,@45";QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchStr);// 重点是下面这行代码builder.analyzer("myanalyzer").field("username").field("password").field("ip");Iterable<User> search = userRepository.search(builder);Iterator<User> iterator = search.iterator();while (iterator.hasNext()){System.out.println("---> 匹配数据: "+iterator.next());}}catch (Exception e){System.out.println("---> 异常信息 "+e);}}
查询结果:
---> 匹配数据: User(id=33, username=陈%喜华, password=gao45, age=18, ip=我登录的ip地址是:127.145.0.11)
---> 匹配数据: User(id=3, username=高新兴, password=gao45, age=18, ip=我登录的ip地址是:127.145.0.11)
---> 匹配数据: User(id=35, username=马@,#立志, password=ling009, age=18, ip=我记录的ip地址是:127.125.0.11)
---> 匹配数据: User(id=48, username=郭才莹, password=yao210, age=18, ip=我登录的,@#%ip地址是:127.248.0.11)
---> 匹配数据: User(id=126, username=夏雨, password=xiayu2014, age=18, ip=我登录的ip地址是:127.0.0.11)
---> 匹配数据: User(id=12, username=周杰伦, password=xiayu2014, age=18, ip=我登录的ip地址是:127.0.0.11)
---> 匹配数据: User(id=115, username=朱&@#%夏宇, password=19ch8en, age=18, ip=我登录的ip地址是:127.219.0.11)
---> 匹配数据: User(id=8, username=姚#明, password=yao210, age=18, ip=我登录的@#%ip地址是:127.248.0.11)
---> 匹配数据: User(id=10, username=李荣浩, password=li06, age=18, ip=我使用的@ip地址是:127.234.0.11)
---> 匹配数据: User(id=104, username=黄小群, password=li06, age=18, ip=我使用的@ip地址是:127.234.0.11)
---> 匹配数据: User(id=36, username=陈耀鹏, password=xida, age=18, ip=我登录的ip地址是:127.126.0.11)
---> 匹配数据: User(id=11, username=陈奕迅, password=19ch8en, age=18, ip=我登录的ip地址是:127.219.0.11)
---> 匹配数据: User(id=137, username=林薇因, password=zho99, age=18, ip=我登录,的ip地址是:127.111.0.11)
---> 匹配数据: User(id=13, username=林俊杰, password=zho99, age=18, ip=我登录,的ip地址是:127.111.0.11)
---> 匹配数据: User(id=4, username=神州@数码, password=shen18, age=18, ip=我登录的ip地址是:127.124.0.11)
---> 匹配数据: User(id=5, username=岭南师范, password=ling009, age=18, ip=我记录的ip地址是:127.125.0.11)
---> 匹配数据: User(id=9, username=邓紫棋, password=dengml, age=18, ip=我使用的ip地址是:127.249.0.11)
---> 匹配数据: User(id=34, username=钟楚莹, password=shen18, age=18, ip=我登录的ip地址是:127.124.0.11)
---> 匹配数据: User(id=49, username=黄群, password=dengml, age=18, ip=我使用的ip地址是:127.249.0.11)
到处,springboot整合elasticsearch以及ik分词器,做全文检索完成了。
先告一段落,文章写得不是很好。但希望你能看懂。如果有不懂的,底下留言。我会及时更新
希望此文帮助到你!
springboot整合elasticsearch5.x以及IK分词器做全文检索相关推荐
- 7安装ik分词器_Solr7全文检索+IK分词
1. 概述 介绍Solr之前,就不得不提业界大名鼎鼎的Lucene.Lucene是一个完全用Java编写 的高性能.跨平台的全文搜索引擎工具包,能满足几乎所有软件项目的搜索需求.Lucene是Apac ...
- ES入门学习:ElasticSearch、Kibana、ik分词器的安装、简单使用及SpringBoot集成
前言 es是采用Java语言开发,因此,想要安装运行es需要提前准备好jdk环境,关于linux配置jdk在前文linux配置jdk 本文主要介绍es的安装.kibana的安装和简单使用及ik分词器的 ...
- ik分词器实现原理_SpringBoot整合Elasticsearch实现商品搜索
本文主要介绍在Elasticsearch中实现商品搜索功能 中文分词器 Elasticsearch有默认的分词器,默认分词器只是将中文逐词分隔,并不符合我们的需求. get hanzo/_analyz ...
- 狂神聊 ElasticSearch(IK分词器+Rest+集成SpringBoot+实战爬虫项目+完整代码及资料)
Bilibili 搜索关注:狂神说 Java(和狂神一起学习,共同进步) 公众号:狂神说(文章日更) 狂神聊 ElasticSearch 版本:ElasticSearch 7.6.1(全网最新了) 6 ...
- Windows下Solr的安装与配置,附DIH全量导入MySQL数据、IK分词器配置详解——不用集成Tomcat
Solr是Apache开源的比较稳定的一款全文搜索引擎,也是市面上相对比较流行的一款全文搜索引擎,好不好用你用过之后自有判断.今天给大家分享一下它的安装与配置,我用的是7.7.2版本.废话不多说,开搞 ...
- “Elasticsearch + Kibana + ik分词器“介绍与使用
Elasticsearch 介绍 Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例. 作为 Elastic Stack 的核心,它集中存 ...
- 04.ElasticSearch之IK分词器的安装与使用
ElasticSearch之IK分词器的安装与使用 前言 安装 离线安装 在线安装 ik分词器测试 扩展(停用)词(典) 测试数据 概念 配置词典 1.修改配置文件 2.新建词典 3.自定义内容 4. ...
- 基于ik分词器和布隆过滤器实现敏感词过滤
文章目录 准备阶段 为何选用IK Analyzer 什么是布隆过滤器 开发过程 整合Ik 总结 <基于ik分词器和布隆过滤器实现敏感词过滤>首发 牧马人博客转发请加此提示 最近公司业务有个 ...
- Elasticsearch——分布式搜索引擎01(索引库、文档、RestAPI、RestClient、拼音分词器、IK分词器)
Elasticsearch--分布式搜索引擎01(索引库.文档.RestAPI.RestClient.拼音分词器.IK分词器) 一.初识 elesticsearch 1.1 简介 1.2 倒排索引(重 ...
- Elasticsearch5.3.1 IK分词,同义词/联想搜索设置
本文主要是记录Elasticsearch5.3.1 IK分词,同义词/联想搜索设置,本来是要写fscrawler的多种格式(html,pdf,word...)数据导入的,但是IK分词和同义词配置还是折 ...
最新文章
- Android之PullToRefresh控件源码解析
- 在Python中查找子字符串索引的5种方法
- 前端工程化开发方案app-proto
- 信息学奥赛一本通 2017:【例4.2】输出偶数
- Python之路【第五篇】:Python基本数据类型
- CentOS7 安装管理KVM虚拟机
- python的shutil模块
- Flutter实战之Android混合开发初探
- gjb150.16a-2009振动试验标准及介绍
- Exadata使用EXAchk进行健康检查
- php文本生成图片,php文本文字创建生成图片_PHP教程
- 平板电脑也可以学python吗?10 个Python 编辑器,,让编程更贴近生活~
- 前端扁平化数据转树形数据_javascript将扁平的数据转为树形结构的几种方法
- 网站使用第三方Steam帐号登录[OpenID]
- 初一学生上计算机教学内容,初一计算机教学工作计划.docx
- Py西游攻关之正则表达式
- Java的MessageDigest类、MD5算法
- 前端模板——家乡风景的介绍
- Vue 实现在文本溢出后浮现Tooltip、及文本展开收起效果
- Cypress入门-(一)如何安装Cypress