springboot整合elasticsearch实现全文检索
版本说明,不同的springboot版本也对应着不同的elasticsearch版本,如果版本不对应客户端和服务端都会报相应的错误,对应关系请自行百度,本次测试的版本如下:springboot版本:2.3.1.RELEASE,elasticsearch版本:7.6.0
demo下载参考:springboot+elasticsearch demo
开始前请阅读 : elasticsearch官方文档
项目pom文件添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
application.yml配置文件
spring:
elasticsearch:
repositories:
enabled: true
rest:
uris: 192.168.166.130:9200
#cluster-nodes: 192.168.166.130:9300 #配置集群节点
#cluster-name: my-application #配置集群节点
创建索引库的实体类
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
@Data
@Accessors(chain = true)
@Document(indexName = "blog", type = "java")
public class BlogModel implements Serializable {
private static final long serialVersionUID = 6320548148250372657L;
@Id
private Integer id;//id
private String title;//标题
private String content;//内容
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date time;//时间
}
创建用于查询的接口
该接口的实现会帮你自动实现,你只要按照规则定义好方法就行。
定义方法请参考:官方文档
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface BlogRepository extends ElasticsearchRepository<BlogModel, String> {
BlogModel findTop1ById(String id);//根据id查询一条
List<BlogModel> findByTitleLike(String keyword);//更具title模糊查询
//根据title和content字段模糊查询
List<BlogModel> findByTitleLikeOrContentLike(String title,String content);
//查询分页
List<BlogModel> findByTitleLikeOrContentLike(String title, String content, Pageable pageable);
//查询分页 根据时间排序
List<BlogModel> findByTitleLikeOrContentLikeOrderByTimeDesc(String title, String content, Pageable pageable);
//查询分页 根据时间排序
List<BlogModel> findByTitleLikeOrContentLikeOrderByTimeAsc(String title, String content, Pageable pageable);
}
返回实体类
import lombok.Data;
@Data
public class Result<T> {
private int code;
private String message;
private T data;
public Result(int code,String message,T data){
this.code=code;
this.message=message;
this.data=data;
}
public static <T> Result<T> ok(T data){
return new Result<T>(0,null,data);
}
public static <T> Result<T> ok(T data,String message){
return new Result<T>(0,message,data);
}
public static <T> Result<T> ok(String message){
return new Result<T>(0,message,null);
}
public static <T> Result<T> err(String message){
return new Result<T>(1,message,null);
}
}
测试控制器
import com.elasticsearch.entity.Result;
import com.elasticsearch.model.BlogModel;
import com.elasticsearch.model.BlogRepository;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
/**
* 测试
*/
@RestController
public class SearchController {
@Autowired
private BlogRepository blogRepository;
/**
* 删除
* @return
*/
@RequestMapping("delete")
public Result deleteAll(){
blogRepository.deleteAll();
return Result.ok("删除成功");
}
/**
* 根据id进行查找
* @param id
* @return
*/
@RequestMapping("selectById")
public Result selectById(String id){
BlogModel b=blogRepository.findTop1ById(id);
return Result.ok(b);
}
/**
* 根据id修改
* @param id
* @return
*/
@RequestMapping("update")
public Result update(String id){
BlogModel b=blogRepository.findTop1ById(id);
if(b!=null){
b.setContent("我已经修改了");
blogRepository.save(b);
}
return Result.ok(b,"修改成功");
}
/**
* 多字段进行查找(方法1)
* @param key
* @return
*/
@RequestMapping("test2")
public Result test2(String key){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchQuery("title",key));
boolQueryBuilder.should(QueryBuilders.matchQuery("content",key));
Page<BlogModel> page = blogRepository.search(boolQueryBuilder, PageRequest.of(0,10));
return Result.ok(page.getContent());
}
/**
* 多字段进行查找(方法1)
* @param key
* @return
*/
@RequestMapping("test3")
public Result test3(String key){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchQuery("title",key));
boolQueryBuilder.should(QueryBuilders.matchQuery("content",key));
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("title");
highlightBuilder.field("content");
highlightBuilder.preTags("<red>");
highlightBuilder.postTags("</red>");
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(PageRequest.of(0,10)).withHighlightBuilder(highlightBuilder).withQuery(boolQueryBuilder).build();
return Result.ok(null);
}
/**
* 多字段进行查找(方法2)
* @param key
* @return
*/
@RequestMapping("allLike")
public Result allLike(String key){
List<BlogModel> list = blogRepository.findByTitleLikeOrContentLike(key,key);
return Result.ok(list);
}
/**
* 多字段进行查找 并且分页(方法3)
* @param key
* @return
*/
@RequestMapping("allLikePage")
public Result allLikePage(String key,Integer page,Integer limit){
//page 当前第几页(从0开始)
//limit 限制行数
List<BlogModel> list = blogRepository.findByTitleLikeOrContentLike(key,key,PageRequest.of(page,limit));
return Result.ok(list);
}
/**
* 多字段进行查找 并且分页 并且排序(方法3)
* @param key
* @return
*/
@RequestMapping("allLikePageOrderBy")
public Result allLikePageOrderBy(String key,Integer page,Integer limit,Boolean desc){
if(desc){
return Result.ok(blogRepository.findByTitleLikeOrContentLikeOrderByTimeDesc(key,key,PageRequest.of(page,limit)));
}else{
return Result.ok(blogRepository.findByTitleLikeOrContentLikeOrderByTimeAsc(key,key,PageRequest.of(page,limit)));
}
}
/**
* 插入数据
* @param id
* @param title
* @param content
* @return
*/
@RequestMapping("insert")
public Result insert(Integer id,String title,String content){
blogRepository.save(new BlogModel().setId(id).setTitle(title).setContent(content).setTime(new Date()));
return Result.ok("插入成功");
}
/**
* 根据title查询
* @param title
* @return
*/
@RequestMapping("selectByTitle")
public Result selectByTitle(String title){
List<BlogModel> list = blogRepository.findByTitleLike(title);
return Result.ok(list);
}
}
linux系统安装elasticsearch服务器 http://www.jiajiajia.club/blog/artical/AXnwhI/377
评论区
请写下您的评论...
猜你喜欢
java框架
1378
springboot整合elasticsearch框架实现全文索引demo配置说明参考:http://www.jiajiajia.club/blog/artical/Ja4t7X/378
blog
lucene全文检索(搜索)
框架
1217
lucene全文检索依赖jardependencygroupIdorg.apache.lucene/groupIdartifactIdlucene-highlighter
blog
全文检索笔记
工具
1887
全文检索流程分析图索引库中是如何存储的?数据库的一行数据会存储为一个document对象,一条记录的一列会存储为一个field,不会将数据库的所有数据都存储到索引库。索引是如何创建过程流程图1.分析
blog
springboot整合mybatis
框架
2780
springboot整合mybatis1.创建maven项目2.sql文件SETNAMESutf8mb4;SETFOREIGN_KEY_CHECKS=0
框架
2917
1.配置springboot支持websocketpackagecom.example.demo.websocket
blog
全国车辆归属地检索表
其他
2015
一、表格
省
简称
省市
河北
冀A
河北石家庄
河北
冀B
河北唐山
河北
冀C
河北秦皇岛
河北
冀D
河北邯郸
河北
冀E
河北邢台
河北
冀F
河北保定
河北
冀G
河北张家口
河北
冀H
河北承德
河北
冀J
河北沧州
河北
冀R
河北廊坊
河北
冀T
河北衡水
山西
晋A
山西太原
山西
晋B
山西大同
山西
晋C
山西
weblog
1225
pomparent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.1.3.RELEASE/version /parentdependencies dependency groupIdorg.springframework.boot/group
blog
springboot整合shiro权限
框架
1687
1.pom文件dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-spring/artifactIdversion1.4.0
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。