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 ...
随机推荐
- Java&Eclipse&Maven的折腾
趁着寒假对于Java的余热,继续了对Java的征途.这次并没有太多琐碎的事情打断我的学习,于是借着这股热情去图书馆借了两本国外的书(中译版),对于程序的爱好一定要坚持下来,才开通了这个博客以坚持学习.
- ThinkPHP 5.0.7 + MySQL 构建RESTful API的小程序---02-ThinkPHP5中的orm的模型关联
ThinkPHP5.0中的操作ORM的一对一,一对多,多对多的操作: 由以下表举例: banner表的设计 id name description delete_time update_time 1 ...
- learn more ,study less(一):整体性学习策略
作者:scott young 一.整体性学习策略 整体性学习是一种学习理论.它更精确.全面地描述了我们大脑是如何工作的.各位, 你的大脑并非简单如计算机的文档储存,计算机文档的本质是一系列 0 和 1 ...
- 1751: n个素数构成等差数列
#include <stdio.h>int fill(char *map,int *primes) { for (int i = 2; i < 1001; i++) { map[i] ...
- Hibernate(四)
==================================投影(查询)=============================投影查询:查询一个持久化类的一个或多个属性值 1.将每条 ...
- 2、TCP/IP
TCP/IP协议栈:物理层.数据接口层.网络层.传输层.应用层或网络接口层.网络层.传输层.应用层 TCP/IP协议栈的核心协议:1.TCP2.UDP3.ICMP4.IGMP5.ARP:映射IP→Et ...
- JAVA byte数组转化为16进制字符串输出
最简单的方法: 利用javax.xml.bind包下的DatatypeConverter printHexBinary public static java.lang.String printHexB ...
- sublime: javascript/css 的格式化
Sublime Text 3 破解版 + 注册机 + 汉化包 + 教程 http://www.xiumu.org/note/sublime-text-3.shtml 1.sublime 如果控制菜单选 ...
- DaSiamRPN学习
9月14日,2018年视觉目标跟踪挑战赛(Visual-Object-Tracking Challenge 2018)的结果在ECCV Workshop上揭晓.VOT2018共设三项任务:Baseli ...
- Mario是一个基于.NETCore的简单快速开发框架
Mario .NET Core简单快速开发框架 Mario是一个基于.NET Core的简单快速开发框架 GitHub:https://github.com/deeround/Mario 技术特点 基 ...