最完整的springboot2.2.x.RELEASE整合springDataElasticsearch 7.6.2
本文使用内容 springBoot2.2.5.RELEASE版本 Elasticsearch7.6.2 linux版本的 SpringDataElasticSearch与Springboot版本对应
一、操作准备
1、导入依赖
此处版本
2.2.5.RELEASE
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</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>
2、创建application.yml文件
spring:
elasticsearch:
rest:
uris: http://192.168.0.211:9200
此处的ip:端口 是自己的Elasticsearch的,如果为集群可以以逗号(,)隔开
3、创建实体类对象
1 package cn.cqsw.elasticsearch.pojo;
2
3 import org.springframework.data.annotation.Id;
4 import org.springframework.data.elasticsearch.annotations.Document;
5 import org.springframework.data.elasticsearch.annotations.Field;
6 import org.springframework.data.elasticsearch.annotations.FieldType;
7
8 import java.io.Serializable;
9
10 @Document(indexName = "item" , type = "_doc",shards = 1,replicas = 0)
11 public class Item implements Serializable {
12 @Id //注意此处的@Id必须为springframework包下面的id import org.springframework.data.annotation.Id;
13 Long id;
14 @Field(type = FieldType.Text,analyzer = "ik_max_word")
15 String title; //标题
16 @Field(type = FieldType.Keyword)
17 String category;// 分类
18 @Field(type = FieldType.Keyword)
19 String brand; // 品牌
20 @Field(type = FieldType.Double)
21 Double price; // 价格
22 @Field(type = FieldType.Keyword,index = false)
23 String images; // 图片地址
24
25 public Long getId() {
26 return id;
27 }
28
29 public void setId(Long id) {
30 this.id = id;
31 }
32
33 public String getTitle() {
34 return title;
35 }
36
37 public void setTitle(String title) {
38 this.title = title;
39 }
40
41 public String getCategory() {
42 return category;
43 }
44
45 public void setCategory(String category) {
46 this.category = category;
47 }
48
49 public String getBrand() {
50 return brand;
51 }
52
53 public void setBrand(String brand) {
54 this.brand = brand;
55 }
56
57 public Double getPrice() {
58 return price;
59 }
60
61 public void setPrice(Double price) {
62 this.price = price;
63 }
64
65 public String getImages() {
66 return images;
67 }
68
69 public void setImages(String images) {
70 this.images = images;
71 }
72
73 public Item() {
74 }
75
76 public Item(Long id, String title, String category, String brand, Double price, String images) {
77 this.id = id;
78 this.title = title;
79 this.category = category;
80 this.brand = brand;
81 this.price = price;
82 this.images = images;
83 }
84
85
86 @Override
87 public String toString() {
88 return "Item{" +
89 "id=" + id +
90 ", title='" + title + '\'' +
91 ", category='" + category + '\'' +
92 ", brand='" + brand + '\'' +
93 ", price=" + price +
94 ", images='" + images + '\'' +
95 '}';
96 }
注解参数含义解释
Spring Data通过注解来声明字段的映射属性,有下面的三个注解: - `@Document` 作用在类,标记实体类为文档对象,一般有四个属性
- indexName:对应索引库名称
- type:对应在索引库中的类型 在ElasticSearch7.x中取消了type的概念
- shards:分片数量,默认5
- replicas:副本数量,默认1
- `@Id` 作用在成员变量,标记一个字段作为id主键
- `@Field` 作用在成员变量,标记为文档的字段,并指定字段映射属性:
- type:字段类型,取值是枚举:FieldType
- index:是否索引,布尔类型,默认是true
- store:是否存储,布尔类型,默认是false
- analyzer:分词器名称:ik_max_word ik分词器内容,看另外一个随笔:https://www.cnblogs.com/TJ21/p/12642242.html
4、创建一个空的Repository的接口
不明白为什么可以看一些Spring-Data文档
5、创建启动类
@SpringBootApplication
public class ElasticSearchApplication { public static void main(String[] args) {
SpringApplication.run(ElasticSearchApplication.class);
}
}
6、创建测试
测试
注意
此处使用
ElasticsearchRestTemplate 模板原因为 : ElasticsearchTemplate 模板使用的是使用的 TransportClient 此客户端在ElasticSearch7的版本中不再推荐使用,
在8的版本中将被移除,官方建议使用:High Level REST Client (高级Test客户端)
不使用ElasticsearchTemplate
原因查看官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.2.6.RELEASE/reference/html/#elasticsearch.clients.transport
使用ElasticsearchRestTemplate 原因:官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.2.6.RELEASE/reference/html/#elasticsearch.operations.resttemplate
这样我们使用的就是: High Level REST Client (高级Test客户端)
使用junit4
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class ElasticisesTest { @Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate; @Autowired
private ItemRepository itemRepository; @Test
public void addIndexTest() {
this.elasticsearchRestTemplate.createIndex(Item.class);
this.elasticsearchRestTemplate.putMapping(Item.class);
} @Test
public void deleteIndex() {
this.elasticsearchRestTemplate.deleteIndex("item");
} /**
* 新增和批量新增
*/
@Test
public void create() { /*新增*/
// Item item = new Item(1L, "小米手机7", " 手机", "小米", 3499.00, "http://image.leyou.com/13123.jpg");
// this.itemRepository.save(item); List<Item> list = new ArrayList<>();
list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.leyou.com/123.jpg"));
list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.leyou.com/3.jpg"));
// 接收对象集合,实现批量新增
this.itemRepository.saveAll(list);
} /**
* 查询全部
*/
@Test
public void find() {
Optional<Item> item = this.itemRepository.findById(1L);
System.out.println("item.get() = " + item.get());
} /**
* 查询并排序
*/
@Test
public void findAllSort() {
Iterable<Item> items = this.itemRepository.findAll(Sort.by("price").descending()); items.forEach(System.out::println);
} /**
* 根据title查询
*/
@Test
public void findByTitle() {
Iterable<Item> items = this.itemRepository.findByTitle("手机");
items.forEach(System.out::println);
} /**
* 查询价格区间
*/
@Test
public void findByPrice() {
List<Item> byPriceBetween = this.itemRepository.findByPriceBetween(3699d, 4499d);
byPriceBetween.forEach(System.out::println);
} /**
* 添加测试数据
*/
@Test
public void indexList() {
List<Item> list = new ArrayList<>();
list.add(new Item(1L, "小米手机7", "手机", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(4L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(5L, "荣耀V10", "手机", "华为", 2799.00, "http://image.leyou.com/13123.jpg"));
// 接收对象集合,实现批量新增
itemRepository.saveAll(list);
} /**
* 通过标题查询
*/
@Test
public void testSearch() {
// 通过查询构建器构建查询条件
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "手机");
//执行查询
Iterable<Item> items = this.itemRepository.search(matchQueryBuilder);
items.forEach(System.out::println);
} @Test
public void testNative() {
//构建自定义查询构建器
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//添加基本的查询条件
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "手机");
//执行查询获取分页结果集
nativeSearchQueryBuilder.withQuery(matchQueryBuilder); Page<Item> items = this.itemRepository.search(nativeSearchQueryBuilder.build());
System.out.println("items.getTotalElements() = " + items.getTotalElements());
System.out.println("items.getTotalPages() = " + items.getTotalPages());
items.forEach(System.out::println); } /**
* 分页查询
*/ @Test
public void testNativeQuery() {
// 构建查询条件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本的分词查询
queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机")); // 初始化分页参数
int page = 0;
int size = 3;
// 设置分页参数
queryBuilder.withPageable(PageRequest.of(page, size)); // 执行搜索,获取结果
Page<Item> items = this.itemRepository.search(queryBuilder.build());
// 打印总条数
System.out.println(items.getTotalElements());
// 打印总页数
System.out.println(items.getTotalPages());
// 每页大小
System.out.println(items.getSize());
// 当前页
System.out.println(items.getNumber());
items.forEach(System.out::println);
} @Test
public void testAggs() { //初始化自定义构建查询器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); //添加聚合
queryBuilder.addAggregation(AggregationBuilders.terms("brandAgg").field("brand")); //添加结果集过滤不包括任何字段
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{}, null)); //执行查询
AggregatedPage<Item> itemPage = (AggregatedPage<Item>)this.itemRepository.search(queryBuilder.build()); /*
解析聚合结果集,根据聚合的类型以及字段类型,要进行强转,不然无法获取桶
brand-是字符串类型的,聚合类型是词条类型的
brandAgg-通过聚合名称获取聚合对象
使用StringTerms强转的时候出现错误
*/ ParsedStringTerms brandAgg =(ParsedStringTerms) itemPage.getAggregation("brandAgg"); //获取桶
List<? extends Terms.Bucket> buckets = brandAgg.getBuckets(); //遍历输出
buckets.forEach(bucket -> {
System.out.println("bucket.getKeyAsString() = " + bucket.getKeyAsString());
//获取条数
System.out.println("bucket.getDocCount() = " + bucket.getDocCount());
}); } /**
* 子聚合
*/
@Test
public void testSubAggs() { //初始化自定义构建查询器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); //添加聚合
queryBuilder.addAggregation(AggregationBuilders.terms("brandAgg").field("brand").subAggregation(AggregationBuilders.avg("price_avg").field("price"))); //添加结果集过滤不包括任何字段
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{}, null)); //执行查询
AggregatedPage<Item> itemPage = (AggregatedPage<Item>)this.itemRepository.search(queryBuilder.build()); /*
解析聚合结果集,根据聚合的类型以及字段类型,要进行强转,不然无法获取桶
brand-是字符串类型的,聚合类型是词条类型的
brandAgg-通过聚合名称获取聚合对象
使用StringTerms强转的时候出现错误
*/ StringTerms brandAgg =(StringTerms) itemPage.getAggregation("brandAgg"); //获取桶
List<StringTerms.Bucket> buckets = brandAgg.getBuckets(); //遍历输出
buckets.forEach(bucket -> {
System.out.println("bucket.getKeyAsString() = " + bucket.getKeyAsString());
//获取条数
System.out.println("bucket.getDocCount() = " + bucket.getDocCount()); //获取子聚合的map集合:key-聚合名称,value-对应的子聚合对象
Map<String, Aggregation> stringAggregationMap = bucket.getAggregations().asMap();
/*
以前使用的InternalAvg强转出现转换异常
*/
ParsedAvg price_avg =(ParsedAvg) stringAggregationMap.get("price_avg"); System.out.println("price_avg.getValue() = " + price_avg.getValue());
}); } }
最完整的springboot2.2.x.RELEASE整合springDataElasticsearch 7.6.2的更多相关文章
- SpringBoot2.0+Shiro+JWT 整合
SpringBoot2.0+Shiro+JWT 整合 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息. 我们利用一定的编 ...
- 解决Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of the configured nodes are available
Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of ...
- 重磅来袭!!!Elasticsearch7.14.1(ES 7.14.1)与Springboot2.5.4的整合
1. 概述 前面我们聊了 Elasticsearch(ES)集群的搭建,今天我们来聊一下,Elasticsearch(ES)集群如何与 Springboot 进行整合. Elasticsearch(E ...
- Spring Boot 鉴权之—— springboot2.0.4+mybatis 整合的完整用例
自上一篇文章的基础上,Spring Boot 鉴权之—— JWT 鉴权我做了一波springboot2.0.4+mybatis 的整合. 参考文章: Spring Boot+Spring Securi ...
- springboot2.x纯注解整合dubbo
springboot1.x和springboot2.x整合差距挺大的,基于最新的2.x进行整合,使用纯注解的方式 依赖选取 首先pom文件的依赖引入,maven仓库有Apache和alibaba两个 ...
- SpringBoot2.0之四 简单整合MyBatis
从最开始的SSH(Struts+Spring+Hibernate),到后来的SMM(SpringMVC+Spring+MyBatis),到目前的S(SpringBoot),随着框架的不断更新换代,也为 ...
- SpringBoot2.0之五 优雅整合SpringBoot2.0+MyBatis+druid+PageHelper
上篇文章我们介绍了SpringBoot和MyBatis的整合,可以说非常简单快捷的就搭建了一个web项目,但是在一个真正的企业级项目中,可能我们还需要更多的更加完善的框架才能开始真正的开发,比如连接池 ...
- springboot2.1.3.RELEASE+jsp笔记war部署tomcat
springboot+jsp <packaging>war</packaging> <parent> <groupId>org.springframew ...
- Spring-boot2.0.1.BUILD-SNAPSHOT整合Elasticsearch报failed to load elasticsearch nodes错误解决办法
spring-boot整合es的application.properties的默认配置为: spring.data.elasticsearch.cluster-nodes=localhost:9200 ...
随机推荐
- BJD4th pwn pi
没记错的话,比赛那天正好是圣诞节,就只看了这一道pwn题,我还没做出来.我太菜了. 有一说一,ida换成7.5版本之后,一些去掉符号表的函数也能被识别出来了,ida更好用了呢. 题目程序分为两块,先看 ...
- LuoguP7072 [CSP-J2020] 直播获奖 题解
Update \(\texttt{2020.11.13}\) 修改了一个小细节. \(\texttt{2020.11.16}\) 修改了一个错误. Content 有一场 \(n\) 个人的比赛,计划 ...
- LuoguP6904 [ICPC2015 WF]Amalgamated Artichokes 题解
Content 已知常数 \(p,a,b,c,d\),我们知道,第 \(k\) 天的股价公式为 \(price_k=p\times(\sin(a\times k+b)+\cos(c\times k+d ...
- Asp.Net Core基础篇之:白话管道中间件
在Asp.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景 ...
- mysql数据库,当数据类型是float时,查询居然查询不出数据来
mysql数据库,当数据类型是float时,查询居然查询不出数据来,类似如下: 以后mysql数据库不用float类型,而double类型可以查得出来.
- docker查看容器元数据、详细信息,查看容器挂载的目录
通过 docker inspect 175f 查看容器元数据 我们启动docker的时候会挂载目录,但是挂载之后 后面就忘了 如何查看挂载的目录位置呢 可以通过 docker inspect a7a6 ...
- Linux(Centos)内存占用过高处理
查看内存占用最大 ps aux| grep -v "USER" |sort -n -r -k 4 |awk 'NR==1{ print $0}' 命令查看占用内存最大的10个进程 ...
- JAVA实现office文档(word、excel、ppt等)、压缩包在线预览,支持禁止下载功能、支持PC和手机
我们使用的是永中的第三方服务.支持直接转换文档的线上地址,也可以直接把文档上传到官方服务器上 官方文档地址:https://www.yozodcs.com/page/help.html#link152 ...
- 模块化和webpack模块化打包
模块化和webpack模块化打包: 一.❀ 模块化 [导入import-----导出export] 1.为什么需要模块化? JavaScript 发展初期,代码简单地堆积在一起,只要能顺利地从上往下一 ...
- 逆波兰(非与或)表达式原理及C++代码实现
p.p1 { margin: 0; font: 11px Menlo; color: rgba(209, 47, 27, 1); background-color: rgba(255, 255, 25 ...