当前位置: 首页 > news >正文

使用Spring Data Elasticsearch 进行索引的增、删、改、查

一 Spring Data Elasticsearch 项目环境搭建

1.1 修改pom文件添加依赖

目前使用spring-boot-starter-parent版本为2.2.8.RELEASE

对应spring-data-elasticsearch版本为2.2.8.RELEASE,版本对应可以自行百度,如果不行直接用elasticsearch-rest-high-level-client工具类吧

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.2.8.RELEASE</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.5.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.5.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.5.0</version></dependency>
1.2 新建配置文件
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** ES配置类** @author lc* @version 1.0* @date 2022/3/25 10:53*/
@Configuration
public class ElasticSearchClientConfig {@Beanpublic RestHighLevelClient restHighLevelClient() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.1.100", 9200, "http")));return client;}
}

二 ElasticsearchTemplate的使用

2.1 创建实体类

@Document指定实体类和索引对应关系

    indexName:索引名称type: 索引类型(从ES 7.0 开始已经过时了)shards: 主分片数量。从ES 7开始默认1replicas:复制分片数量。从ES 7开始默认1

@Id 指定主键

@Field指定普通属性

    type: 对应Elasticsearch中属性类型。使用FiledType枚举可以快速获取。text类型能被分词keywords不能被分词index: 是否创建索引。作为搜索条件时index必须为trueanalyzer:指定分词器类型。
@Data
@Document(indexName = "student_index",shards = 1,replicas = 1)
public class Student {@Idprivate String id;@Field(type = FieldType.Keyword)private String name;@Field(type = FieldType.Text,analyzer = "ik_max_word")private String desc;@Field(type = FieldType.Text,analyzer = "ik_max_word")private String data;@Field(type = FieldType.Integer)private Integer age;
}
2.2 初始化索引
    @Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Testvoid createIndex() {// 从 spring data es 4.0开始所有索引操作都在这个接口IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Student.class);// 是否存在,存在则删除if(indexOperations.exists()){indexOperations.delete();}// 创建索引indexOperations.create();// createMapping 根据实体类获取映射关系// putMapping 把映射关系添加到索引中Document mapping = indexOperations.createMapping(Student.class);indexOperations.putMapping(mapping);}
2.3 删除索引
    /*** 删除索引*/@Testvoid deleteIndex() {IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Student.class);boolean delete = indexOperations.delete();System.out.println(delete);}
2.4 新增文档
  • 新增单个文档
    /*** 新增单个文档*/@Testvoid insert(){Student student = new Student();student.setAge(23);student.setData("123");student.setDesc("华为手机");student.setId("1");student.setName("张三");Student save = elasticsearchRestTemplate.save(student);System.out.println(save);}
  • 批量新增
    /*** 批量新增*/@Testvoid batchInsert(){List<Student> list = new ArrayList<>();list.add(new Student("2","李四","苹果手机","1",22));list.add(new Student("3","王五","oppo手机","2",24));list.add(new Student("4","赵六","voio手机","3",25));list.add(new Student("5","田七","小米手机","4",26));Iterable<Student> result = elasticsearchRestTemplate.save(list);System.out.println(result);}
2.5 删除操作
  • 根据主键删除
     /*** 根据主键删除*/@Testvoid  deleteById() {// 根据id删除String delete = elasticsearchRestTemplate.delete("5", Student.class);System.out.println(delete);}
  • 根据条件删除
   /*** 根据查询条件删除*/@Testvoid  delete() {QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("张三");Query query = new NativeSearchQuery(queryBuilder);ByQueryResponse QueryDelete = elasticsearchRestTemplate.delete(query, Student.class);System.out.println(QueryDelete);}
2.6 修改操作
  • 全量替换
   /*** 批量修改*/@Testvoid update(){Student student = new Student();student.setId("1");student.setAge(23);student.setData("99");student.setDesc("华为手机AND苹果手机");student.setName("张三");Student save = elasticsearchRestTemplate.save(student);System.out.println(save);}
  • 部分修改
    /*** 部分修改*/@Testvoid update2(){// ctx._source 固定写法String script = "ctx._source.age = 27;ctx._source.desc = 'oppo手机and苹果电脑'";UpdateQuery build = UpdateQuery.builder("3").withScript(script).build();IndexCoordinates indexCoordinates = IndexCoordinates.of("student_index");UpdateResponse update = elasticsearchRestTemplate.update(build, indexCoordinates);System.out.println(update.getResult());}
2.7 查询操作
  • 根据主键查询
     /*** 根据主键查查询*/@Testvoid  searchById(){Student student = elasticsearchRestTemplate.get("3", Student.class);System.out.println(student);}
  • 模糊查询
    /*** 模糊查询*/@Testvoid LikeSearch(){QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("手机");Query query = new NativeSearchQuery(queryBuilder);SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
  • 使用match_all查询所有文档
    /*** 使用match_all查询所有文档*/@Testvoid matchAllSearch(){MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();Query query = new NativeSearchQuery(queryBuilder);SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
  • 使用match查询文档
     /*** 使用match查询文档*/@Testvoid matchSearch(){Query query = new NativeSearchQuery( QueryBuilders.matchQuery("name","张三"));SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();System.out.println(search.getTotalHits());List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
  • 使用match_phrase查询文档
     /*** 使用match_phrase查询文档* 短语搜索是对条件不分词,但是文档中属性根据配置实体类时指定的分词类型进行分词。* 如果属性使用ik分词器,从分词后的索引数据中进行匹配。*/@Testvoid matchPhraseSearch(){Query query = new NativeSearchQuery( QueryBuilders.matchPhraseQuery("desc","电脑"));SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();System.out.println(search.getTotalHits());List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
  • 使用range查询文档
    /*** 使用range查询文档*/@Testvoid rangeSearch(){Query query = new NativeSearchQuery( QueryBuilders.rangeQuery("age").gte("24").lte(29));SearchHits<Student> search = elasticsearchRestTemplate.search(query, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();System.out.println(search.getTotalHits());List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
  • 多条件查询
    /***  多条件查询*/@Testvoid querysSearch(){BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();List<QueryBuilder> listQuery = new ArrayList<>();listQuery.add(QueryBuilders.matchQuery("name","张三"));listQuery.add(QueryBuilders.matchQuery("age","23"));boolQueryBuilder.must().addAll(listQuery);// 逻辑 与
//        boolQueryBuilder.should().addAll(listQuery);// 逻辑 或BoolQueryBuilder boolQueryBuilder2 = QueryBuilders.boolQuery();List<QueryBuilder> listQuery2 = new ArrayList<>();listQuery2.add(QueryBuilders.matchQuery("name","李四"));listQuery2.add(QueryBuilders.matchQuery("age","22"));boolQueryBuilder2.must().addAll(listQuery2);// 逻辑 与BoolQueryBuilder boolQueryBuilder3 = QueryBuilders.boolQuery();List<QueryBuilder> listQuery3 = new ArrayList<>();listQuery3.add(boolQueryBuilder);listQuery3.add(boolQueryBuilder2);boolQueryBuilder3.should().addAll(listQuery3);// 逻辑 或boolQueryBuilder3.must().addAll(listQuery3);// 逻辑 与NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(boolQueryBuilder3);SearchHits<Student> search = elasticsearchRestTemplate.search(nativeSearchQuery, Student.class);List<SearchHit<Student>> searchHits = search.getSearchHits();System.out.println(search.getTotalHits());List<Student> list = new ArrayList<>();searchHits.forEach(sh->{list.add(sh.getContent());});System.out.println(list);}
  • 分页与排序
    /*** 分页查询*/@Testvoid pageSearch(){Query query = new NativeSearchQuery(QueryBuilders.matchAllQuery());// 排序query.addSort(Sort.by(Sort.Direction.DESC,"age"));// 分页query.setPageable(PageRequest.of(1,2));SearchHits<Student> searchHits = elasticsearchRestTemplate.search(query, Student.class);System.out.println(searchHits.getTotalHits());List<SearchHit<Student>> hitList = searchHits.getSearchHits();List<Student> listResult = new ArrayList<>();hitList.forEach(list->{listResult.add(list.getContent());});System.out.println(listResult);}

相关文章:

  • 【机器学习合集】优化目标与评估指标合集 ->(个人学习记录笔记)
  • Crypto(6)攻防世界-babyrsa
  • Go 语言操作 MongoDb
  • 论文阅读——RoBERTa
  • Oracle数据库设置归档模式(超级简单)
  • 自动驾驶之—2D到3D升维
  • Python环境下LaTeX数学公式转图像方案调研与探讨
  • Golang Struct 继承的深入讨论和细节
  • ETCD备份与恢复
  • c# sqlite 修改字段类型
  • ssm164学院学生论坛的设计与实现+vue
  • GnuTLS recv error (-110): The TLS connection was non-properly terminated
  • leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间
  • LeetCode刷题:27. 移除元素
  • uniapp把文件中的内复制到另一个文件中
  • SegmentFault for Android 3.0 发布
  • hadoop集群管理系统搭建规划说明
  • JS+CSS实现数字滚动
  • js学习笔记
  • scrapy学习之路4(itemloder的使用)
  • Vue小说阅读器(仿追书神器)
  • 半理解系列--Promise的进化史
  • 构建二叉树进行数值数组的去重及优化
  • 基于webpack 的 vue 多页架构
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何使用 JavaScript 解析 URL
  • 实习面试笔记
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 移动端 h5开发相关内容总结(三)
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # 数据结构
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (ibm)Java 语言的 XPath API
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (算法二)滑动窗口
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)appium-desktop定位元素原理
  • (一)SpringBoot3---尚硅谷总结
  • (一一四)第九章编程练习
  • .NET CF命令行调试器MDbg入门(一)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android Studio] 开发Java 程序
  • [Android] 修改设备访问权限
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析
  • [CISCN 2023 初赛]go_session
  • [DAX] MAX函数 | MAXX函数