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 ...
随机推荐
- GP工作室—团队项目总结
GP工作室-团队项目总结 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/ 这个作业要求在哪里 ...
- 链接拼接的方法(用于解决同一个脚本返回两种不同的url链接的问题)
实例一: 上图所示 爬虫返回的链接有一部分带有http前缀,有一部分没有,且也不知道具体哪些链接会出现没有前缀的情况 后面如果通过返回链接进行再次访问,那么肯定会出现报错的问题 思路: 判断 返回值内 ...
- A novel multi-swarm particle swarm optimization with dynamic learning strategy(一种新颖的具有动态学习策略的多种群粒子群优化算法)
1.核心 在每个子种群的粒子被划分为普通粒子(ordinary particles)和交流粒子(communication particles),在每次迭代过程中,不同的粒子执行不同的进化操作.普通粒 ...
- JDK源码系列总索引
一 目标 记录学习jdk源码的一些笔记和心得,jdk版本使用11.0.1,工具idea Class后面序号为优先级1-4,优先级递减 目录转载自博客: https://blog.csdn.net/qq ...
- 讲解 json 和 pickle 模块
首先是引入json 和 pickle 的原因是 普通的方法支持的数据类型太少 局限性大 比如下面的例子 dit = {'name':'deng1mei','age':'26','sex':'girl ...
- 源码分析系列 | 从零开始写MVC框架
1. 前言 2. 为什么要自己手写框架 3. 简单MVC框架设计思路 4. 课程目标 5. 编码实战 5.1 配置阶段 web.xml配置 config.properties 自定义注解 5.2 初始 ...
- maven jar 包问题
1. Failure to transfer... 这种错误基本是所需要的 jar 包不存在,或者下载不完整,可去本地仓库查看相关 jar 文件的完整性 解决方案: 删除对应 jar 包,重新下载(删 ...
- 深入了解 Java 中的异常处理 + 面试题
# 深入了解 Java 中的异常处理 + 面试题 在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点.比如,try-catch 处理要遵循的原则是什么,finall ...
- Windows下查看dll被哪个进程调用
卸载程序,结果没卸载干净---程序的安装目录中还剩下一个dll文件.想删,结果系统提示说dll文件被某个进程占用了,不让删. 先前碰到这种做法,我都是直接使用unlocker先unlock一下,然后删 ...
- requests的post提交form-data; boundary=????
提交这种用boundary分隔的表单数据时,有两种方法,一种是以传入files参数,另一种是传入data参数,data参数需要自己用boundary来分隔为指定的形式,而files参数则以元组的形式传 ...