SpringBoot支持SpringData es
ElasticSearch CRUD
1.springboot springData es
spring data
是spring对数据访问抽象.这些数据可以放入db,index,nosql等包含以下:
spring data jpa spring对关系型数据库访问支持
spring data ES spring对es数据访问支持
spring data redis等 spring对redis数据访问支持
spring data .....
springboot springdata xxxx
spring data es
是spring对Es数据访问.和原来spring data jpa对db访问.
springboot spring data es
对 spring data es简化了配置.
2.入门
启动你的elasticsearch
2.1 依赖
注意:我这里使用了lombok
<!--springboot版本仲裁中心-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--springboot 对spring data es支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency> </dependencies>
1.1 配置application.yml
spring:
data:
elasticsearch:
cluster-name: elasticsearch #指定elasticsearch集群名称
cluster-nodes: localhost:9300 #9200是图形化界面端 9300是代码端
2.3 入口
@SpringBootApplication
public class EsApplication {
public static void main(String[] args) {
SpringApplication.run(EsApplication.class, args);
}
}
2.4 创建索引文件
注意:索引库名字只能全部是小写
package cn.dyier.doc; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType; /**
* person索引库
* 现在ES Doc @Document(index,type) @Id @Feild 建立的是对象与文档直接映射
* 操作的时wwjEsTest索引库下的person文档
* @author Lenovo
*/
@Document(indexName = "wwjestest", type="person")
@NoArgsConstructor
@Getter
@Setter
@ToString(exclude = {"all"})
public class PersonDoc {
/**
* 文档的id就是对象的id
*/
@Id
private Long id; /**
* 没有特殊要求不用@Field
*/
private Integer age; /**
* keyword不分词
*/
@Field(type = FieldType.Keyword)
private String name; /**
* 指定分词类型,分词器,搜索器
*/
@Field(type = FieldType.Text,
analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
private String intro; /**
* 关键字搜索,指定作用于intro 和 name字段
* 虚拟字段all(所有需要做关键字搜索的值,中间通过空格分隔) zs +" "+ zs is .相当于一个字段代替了很多字段
*/
@Field(type = FieldType.Text,
analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
private String all; /**
* 进行拼接
* @return 返回拼接后的结果
*/
public String getAll() {
return this.name + " " + this.intro;
} public PersonDoc(Long id, Integer age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
}
PersonDoc
2.5 repository配置
public interface PersonDocRepository extends
ElasticsearchRepository<PersonDoc, Long> {
}
PersonDocRepository
2.6 创建索引库,添加类型映射,crud,高级查询,排序,分页
package cn.dyier; import cn.dyier.doc.PersonDoc;
import cn.dyier.repository.PersonDocRepository;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
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.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner; import java.util.ArrayList; @RunWith(SpringRunner.class)
@SpringBootTest(classes = EsApplication.class)
public class EsTest {
//所有的操作都是通过ElasticsearchTemplate
@Autowired
private ElasticsearchTemplate elasticsearchTemplate; @Autowired
private PersonDocRepository personDocRepository; /**
* 创建索引库,类型映射 curd(Repository)
* @throws Exception
*/
@Test
public void init() throws Exception {
System.out.println(elasticsearchTemplate);
//创建索引库
elasticsearchTemplate.createIndex(PersonDoc.class);
//类型映射
elasticsearchTemplate.putMapping(PersonDoc.class);
} /**
* 添加或者修改 save
* id在索引库中存在就是修改
* @throws Exception
*/
@Test
public void testAddOrUpdate() throws Exception {
PersonDoc personDoc = new PersonDoc(1L, 17, "wwj_test01");
personDoc.setIntro("这是测试的第一个");
personDocRepository.save(personDoc);
} /**
* 批量添加 saveAll
* @throws Exception
*/
@Test
public void testAddAll() throws Exception {
ArrayList<PersonDoc> personDocs = new ArrayList<>();
for (int i = 0; i < 50; i++) {
PersonDoc personDoc = new PersonDoc(2L + i, 19 + i, "wwj_" + i);
personDoc.setIntro("wwj_intro_" + i);
personDocs.add(personDoc);
}
personDocRepository.saveAll(personDocs);
} /**
* 根据id删除一个 deleteById()
* @throws Exception
*/
@Test
public void testDeleteById() throws Exception {
personDocRepository.deleteById(14L);
} /**
* 根据id获取 一个
* @throws Exception
*/
@Test
public void testFindOne() throws Exception {
System.out.println(personDocRepository.findById(1L));
} /**
* 查询所有
* @throws Exception
*/
@Test
public void testFindAll() throws Exception {
personDocRepository.findAll().forEach(System.out::println);
} /**
* dsl分页+高级查询+排序
* @throws Exception
*/
@Test
public void testDsl() throws Exception {
//1.创建一个构造器 NativeSearchQueryBuilder
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
//2.设置条件 QueryBuilders.boolQuery()
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//2.1 must 必须 all字段包含wwj
boolQueryBuilder.must(QueryBuilders.matchQuery("all", "wwj"));
//2.2 filter 过滤 gte大于等于 lte小于等于
boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(20).lte(50));
builder.withQuery(boolQueryBuilder);
//3.排序 根据id排序
builder.withSort(SortBuilders.fieldSort("id"));
//4.分页 页数从0开始
builder.withPageable(PageRequest.of(0, 10));
//5.截取字段
builder.withSourceFilter(new FetchSourceFilter(
new String[]{"id", "name", "age"}, null));
//6.查询并封装结果
NativeSearchQuery build = builder.build();
//当前页数据
Page<PersonDoc> page = personDocRepository.search(build);
//总数
System.out.println(page.getTotalElements());
//当前页数据
System.out.println(page.getContent());
}
}
精髓..
SpringBoot支持SpringData es的更多相关文章
- SpringData ES中一些底层原理的分析
之前写过一篇SpringData ES 关于字段名和索引中的列名字不一致导致的查询问题,顺便深入学习下Spring Data Elasticsearch. Spring Data Elasticsea ...
- docker+es+kibana和springboot中使用es
本次和大家分享的主要是docker搭建es和springboot操作es的内容,也便于工作中或将来使用方便,因此从搭建es环境开始到代码插入信息到es中:主要节点如下: elasticsearch启动 ...
- 「Elasticsearch」SpringBoot快速集成ES
Elastic Search 的底层是开源库 Lucene.但是Lucene的使用门槛比较高,必须自己写代码去调用它的接口.而Elastic Search的出现正是为了解决了这个问题,它是 Lucen ...
- SpringBoot整合SpringData JPA入门到入坟
首先创建一个SpringBoot项目,目录结构如下: 在pom.xml中添加jpa依赖,其它所需依赖自行添加 <dependency> <groupId>org.springf ...
- spring-boot支持websocket
spring-boot本身对websocket提供了很好的支持,可以直接原生支持sockjs和stomp协议.百度搜了一些中文文档,虽然也能实现websocket,但是并没有直接使用spring-bo ...
- SpringBoot整合SpringData和Mysql数据库
1.新建maven项目(具体的新建过程就不细说了) 2.添加maven依赖,也就是在pom.xml文件添加项目的依赖jar包: <project xmlns="http://maven ...
- 天啦!竟然从来没有人讲过 SpringBoot 支持配置如此平滑的迁移
SpringBoot 是原生支持配置迁移的,但是官方文档没有看到这方面描述,在源码中才看到此模块,spring-boot-properties-migrator,幸亏我没有跳过.看到这篇文章的各位,可 ...
- SpringBoot+Security+MyBatis+ES+MQ+Redis+Docker+Vue的电商系统
今天鹏哥给大家推荐的项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现. 前台商城系统包含首页门户.商品推荐.商品搜索.商品展示.购物车.订单流程.会员中 ...
- springboot(二)配置SpringBoot支持自动装载Servlet
Servlet详解:https://blog.csdn.net/yanmiao0715/article/details/79949911 Web 技术成为当今主流的互联网 Web 应用技术之一,而 S ...
随机推荐
- 对于kvm配置ssh
首先我们要让自己的机器开启ssh服务 首先更新源 sudo apt-get update 安装ssh服务 sudo apt-get install openssh-server 检测是否已启动 ps ...
- Git详解之初次运行
配置文件 一般在新的系统上,我们都需要先配置下自己的 Git 工作环境.配置工作只需一次,以后升级时还会沿用现在的配置.当然,如果需要,你随时可以用相同的命令修改已有的配置. Git 提供了一个叫做 ...
- SpringBoot学习(三):日志
1.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息: ...
- Vue中的计算属性
一.什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护. 二.计算属性的用法 在一个计算属性里可以完成各种复杂的逻辑,包括运算.函 ...
- C语言系列之自增自减运算符的用法(二)
运算符中最难理解的有自增自减运算符的使用方法,下面我将简单总结一下他们的使用方法 我们知道,C语言运行是由右向左运行的 下面我们来看一个例子 当i等于3的时候 j=++i; 由上面可知,C语言是由右向 ...
- 使用 FRP 让部门同事都能直接远程桌面办公( 适用于 TEAM 和向日葵卡顿的用户)
背景说明 这两天由于疫情的原因,很多公司都得在家远程上班,然后像我们这类小公司有没有 VPN 这些东西.传统的远程回公司只能依靠 Teamviewer 或者向日葵等工具.但是由于最近用户量很多,可能会 ...
- 在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示
我们平时用eclipse开发jsp页面时智能提示效果不太理想,今天用了两个小时发现了eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclip ...
- 20194653 面向对象基础3——static、this、包总结
题目1:编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中的Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参数 ...
- Tomcat配置多线程和配置数据库连接池
Tomcat配置多线程和配置数据库连接池 1. tomcat配置线程池: [root@RD2_AS yanghuihui]# cd /usr/tomcat/conf/ [root@RD2_AS co ...
- HDU6191 Query on A Tree (01字典树+启发式合并)
题意: 给你一棵1e5的有根树,每个节点有点权,1e5个询问(u,x),问你子树u中与x异或最大的值是多少 思路: 自下而上启发式合并01字典树,注意合并时清空trie 线段树.字典树这种结构确定的数 ...