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的更多相关文章

  1. SpringData ES中一些底层原理的分析

    之前写过一篇SpringData ES 关于字段名和索引中的列名字不一致导致的查询问题,顺便深入学习下Spring Data Elasticsearch. Spring Data Elasticsea ...

  2. docker+es+kibana和springboot中使用es

    本次和大家分享的主要是docker搭建es和springboot操作es的内容,也便于工作中或将来使用方便,因此从搭建es环境开始到代码插入信息到es中:主要节点如下: elasticsearch启动 ...

  3. 「Elasticsearch」SpringBoot快速集成ES

    Elastic Search 的底层是开源库 Lucene.但是Lucene的使用门槛比较高,必须自己写代码去调用它的接口.而Elastic Search的出现正是为了解决了这个问题,它是 Lucen ...

  4. SpringBoot整合SpringData JPA入门到入坟

    首先创建一个SpringBoot项目,目录结构如下: 在pom.xml中添加jpa依赖,其它所需依赖自行添加 <dependency> <groupId>org.springf ...

  5. spring-boot支持websocket

    spring-boot本身对websocket提供了很好的支持,可以直接原生支持sockjs和stomp协议.百度搜了一些中文文档,虽然也能实现websocket,但是并没有直接使用spring-bo ...

  6. SpringBoot整合SpringData和Mysql数据库

    1.新建maven项目(具体的新建过程就不细说了) 2.添加maven依赖,也就是在pom.xml文件添加项目的依赖jar包: <project xmlns="http://maven ...

  7. 天啦!竟然从来没有人讲过 SpringBoot 支持配置如此平滑的迁移

    SpringBoot 是原生支持配置迁移的,但是官方文档没有看到这方面描述,在源码中才看到此模块,spring-boot-properties-migrator,幸亏我没有跳过.看到这篇文章的各位,可 ...

  8. SpringBoot+Security+MyBatis+ES+MQ+Redis+Docker+Vue的电商系统

    今天鹏哥给大家推荐的项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现. 前台商城系统包含首页门户.商品推荐.商品搜索.商品展示.购物车.订单流程.会员中 ...

  9. springboot(二)配置SpringBoot支持自动装载Servlet

    Servlet详解:https://blog.csdn.net/yanmiao0715/article/details/79949911 Web 技术成为当今主流的互联网 Web 应用技术之一,而 S ...

随机推荐

  1. PyCharm2019.3.2专业版激活

    PyCharm2019.3.2专业版激活 Ryan 蚂蚁小黑  PyCharm 专业版激活 今天是除夕,在这阖家团圆的日子里,祝大家新春快乐,鼠年大吉,愿大家在新的一年里身体健康,万事如意! 新的一年 ...

  2. 强大的 Python 任务自动化工具!invoke 十分钟入门指南

    接着前面的<tox 教程>,以及刚翻译好的<nox文档>,我们继续聊聊 Python 任务自动化的话题. nox 的作者在去年的 Pycon US 上,做了一场题为<Br ...

  3. Docker基础内容之数据持久化

    数据卷的特性 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS 数据卷可以在容器之间共享和重用,相当于将一个分区挂载到多个目录下面 数据卷内容的修改会立马生效 数据卷的更新,不会影响镜像: ...

  4. Shiro Web集成及拦截器机制(四)

    Shiro与 Web 集成 Shiro 提供了与 Web 集成的支持,其通过一个 ShiroFilter 入口来拦截需要安全控制的 URL,然后进行相应的控制,ShiroFilter 类似于如 Str ...

  5. 发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案

    在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是 报异常:android.vie ...

  6. for实例

    #-*- coding:utf-8 *-* salary = 5000 shop_list = [('iphone',9000),('mac book',10000),('python book',9 ...

  7. Codeforces Gym101234G Dreamoon and NightMarket(优先队列,子集和第k大)

    题意: 求子集和第k大,n,k<=1e6 思路: 优先队列经典题目,注意优先队列是默认按从大到小排的 代码: #include<iostream> #include<cstdi ...

  8. 51Nod 1021 石子归并(区间dp经典入门)

    题意: N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. n<=100 思 ...

  9. 《Python学习手册 第五版》 -第8章 列表与字典

    前面已经讲过数值类型(第5章)和字符串类型(第7章),本章继续其他数据类型的讲解:列表和字典 本章的核心内容 1.列表 1)什么是列表 2)基本列表操作 3)列表迭代和推导 4)索引.分片和矩阵 5) ...

  10. [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条

    第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...