SpringBoot整合Spring Data Elasticsearch的过程详解
作者:steakliu 发布时间:2023-01-25 22:39:41
Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射
elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多,
可以这样来对比elasticsearch和数据库
索引(indices)--------数据库(databases)
类型(type)------------数据表(table)
文档(Document)---------------- 行(row)
字段(Field)-------------------列(Columns )
整合:
1,在SprinBoot工程中引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2,配置文件
spring.data.elasticsearch.cluster-name=elasticsearch //名字必须和elasticsearch.yml里面的cluster.name相同
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.repositories.enabled=true
3,创建实体,并对类和属性进行标注
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)//标记为文档类型,ndexName:对应索引库名称type:对应在索引库中的类型,shards:分片数量,默认5,replicas:副本数量,默认1
public class Item {
@Id //主键
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word") //标记为成员变量FieldType,可以是text、long、short、date、integer等text:存储数据时候,会自动分词,并生成索引keyword:存储数据时候,不会分词建立索引analyzer:分词器名称
private String title; //标题
@Field(type = FieldType.Keyword)
private String category;// 分类
@Field(type = FieldType.Keyword)
private String brand; // 品牌
@Field(type = FieldType.Double)
private Double price; // 价格
@Field(index = false, type = FieldType.Keyword)//index:是否索引
private String images; // 图片地址
4.引入模板ElasticsearchTemplate
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
5.创建一个索引
//添加索引
@Test
public void addIndex() {
elasticsearchTemplate.createIndex(Item.class);
}
6.删除索引
//删除索引
@Test
public void delete(){
elasticsearchTemplate.deleteIndex("item");
}
7.新增对象
继承Repository提供的一些子接口,就能具备各种基本的CRUD功能,这里继承ElasticsearchCrudRepository
首先定义一个对象的接口
public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> {
}
然后注入ItemRepository
@Autowired
private ItemRepository itemRepository;
新增对象
//新增一个对象
@Test
public void insert(){
Item item = new Item(2L,"坚果R1","手机","锤子",2500.00,"http://image.baidu.com/13123.jpg");
//Order order = new Order(20180020,"菜单");
itemRepository.save(item);
}
批量新增
//批量新增
@Test
public void insertList(){
List<Item> list = new LinkedList<>();
list.add(new Item(9L,"华为p20","手机","华为",3500.00,"http://image.baidu.com/13123.jpg"));
list.add(new Item(10L,"华为p30","手机","华为",5450.00,"http://image.baidu.com/13123.jpg"));
list.add(new Item(11L,"华为p30 pro","手机","华为",6980.00,"http://image.baidu.com/13123.jpg"));
itemRepository.saveAll(list);
}
8.查询
//根据字段查询所有
@Test
public void queryAll(){
//升序,相应降序为dscending
Iterable<Item> items = this.itemRepository.findAll(Sort.by("price").ascending());
for (Item item : items){
System.out.println(item);
}
}
9.自定义查询方法
Spring Data 的另一个强大功能,是根据方法名称自动实现功能,你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。当然,方法名称要符合一定的约定:
上图是截取csdn上博主我要取一个响亮的昵称的图
根据手机名查找手机
//自定义方法,根据Title查询
@Test
public void findByTitle(){
Item item = this.itemRepository.findByTitle("坚果pro");
System.out.println(item);
}
区间查询
//根据区间查询
@Test
public void queryByPriceBetween(){
List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00);
for (Item item : list) {
System.out.println("item = " + item);
}
}
模糊查询
//模糊查询
@Test
public void queryLikeTitle(){
List<Item> list = this.itemRepository.findByTitleLike("R2");
for (Item item : list){
System.out.println(item);
}
}
使用自定义方法需要在接口里面申明方法
public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> {
Item findByTitle(String title);
List<Item> findByPriceBetween(double price1, double price2);
List<Item> findByTitleLike(String title);
}
10.自定义查询
//自定义查询,查询数目等
@Test
public void matchQuery(){
// 构建查询条件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分词查询
queryBuilder.withQuery(QueryBuilders.matchQuery("title","坚果"));
//获取结果
Page<Item> items = (Page<Item>) this.itemRepository.findAll();
//条数
long total = items.getTotalElements();
System.out.println("total = "+total);
for (Item item : items){
System.out.println(item);
}
}关键的是NativeSearchQueryBuilder这个类
分页查询
//分页查询
@Test
public void queryByPage(){
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("category","手机"));
int page = 0;
int size = 2;
nativeSearchQueryBuilder.withPageable(PageRequest.of(page,size));
Page<Item> items = (Page<Item>) this.itemRepository.findAll();
long total = items.getTotalElements();
int totalPage = items.getTotalPages();
int nowPage = items.getNumber();
int pageSize = items.getSize();
System.out.println("总条数 = "+total);
System.out.println("总页数 = "+totalPage);
System.out.println("当前页 = "+nowPage);
System.out.println("每页大小 = "+pageSize);
for (Item item : items){
System.out.println(item);
}
}
还有很多,就不意义列举
在elasticsearch-head上查看数据
关于安装elasticsearch-head,参考地址
Spring Data Elasticsearch文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.1.10.RELEASE/reference/html/
来源:https://www.cnblogs.com/steakliu/p/11553199.html


猜你喜欢
- 在java数组中,查找数组元素是比较基础的操作了,arrays类的binarySearch就是专门实现指定元素的。同时它也属于我们常说的二分
- using System.Drawing;using System.Drawing.Imaging;using System;using S
- 如何配置swagger?在使用项目中,我们希望去查看我们的webapi的测试,那么我们是需要去有一个集成的测试的。步骤1.在nutget管理
- 于是提出了kill process的方法,目前我见过的方法多是用进程创建时间筛选excel.exe进程,然后kill 。这样的方法
- 最好使用英文,不要用汉语拼音1:包(package):用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作
- 这是入门的第三天了,从简单的hello spring开始,已经慢慢接近web的样子。接下来当然是读取简单的对象属性了。于是按照网上各位大神教
- Android SharedPreferences详解获取SharedPreferences的两种方式:1 调用Context对
- 在新版的AndroidStudio3.6 中,在项目的包下新建 activity 时,一般会同时生成对应的java和xml文件,例如新建 M
- 前言:OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件。它的出现就是为了替代已经进入停更维护状态的 Feig
- 一、二叉搜索树插入元素/** * user:ypc; * date:2021-05-18; * time: 15:09; */
- webflux介绍Spring Boot 2.0spring.io 官网有句醒目的话是:BUILD ANYTHING WITH SPRING
- 协程(Coroutine)这个词其实有很多叫法,比如有的人喜欢称为纤程(Fiber),或者绿色线程(GreenThread)。其实究其本质,
- 一、日志工具功能封装Debug类,需要实现功能:1.控制所有日志是否打印;2.除了Log,Warning,Error外,给更多日志种类(不同
- 使用C#在不借助第三方插件的情况下将Excel中的数据转换成DataSet/// <summary>
- 1.问题产生情况我遇到这个问题是做微信开发的时候有些有用的头像用了微信的emoji表情,然而我的mysql数据库用的编码是utf8_gene
- //方法一//须添加对System.Web的引用//using System.Web.Security;/// <summary>
- 一、问题说明偶然换了下spring boot的版本号,结果idea一直标红,报该父依赖一直找不到。但是当我查看引入的依赖时,版本号已经变成2
- 目录前言1、什么叫循环依赖呢2、具体出现循环依赖的代码逻辑3、解决循环依赖的代码实现总结前言本文基于springboot版本2.5.1 &n
- java自定义切面增强写代码时会遇到一些有些重复机械的工作, 这个时候就可以运用切面技术来帮我们节约时间介绍如何使用自定义注解增强方法, 实
- 自定义加载yml,附源码解读昨天在对公司的微服务配置文件标准化的过程中,发现将原来的properties文件转为yml文件之后,微服务mod