Spring Data Elasticsearch 的简单使用

目录

一、简介

二、配置

三、映射

四、 常用方法

五、操作(重点)

1、对索引表的操作

2、对文档的操作(重点)

(1)、添加文档

 (2)、删除文档

(3)、查询文档(重点)

查询全部文档 (两种方式)

matchQuery根据关键字拆分进行全局搜索

matchPhraseQuery短语搜索--完整搜索

rangeQuery范围搜索

termQuery精确搜索

boolQuery()复合查询

withPageable分页查询

withSorts对结果进行排序

高亮查询


一、简介

springData 操作ES类似于Mybatis-plus操作Mysql,都是简单易用

本博客基于springboot2最新方式操作 Elasticsearch7.12.1

二、配置

采用gradle构建 (maven构建一直失败)

implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'

 最新的yml配置

spring:elasticsearch:uris: http://ip:9200

三、映射

映射pojo

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName ="people_index") // 索引名字
public class People {@Id    private String id;    // Keyword类型不被分词索引    类型  分词器@Field(type = FieldType.Text,analyzer = "ik_max_word")private String name;    @Field(type = FieldType.Text,analyzer = "ik_max_word")private String address;    // index = false 不建立分词索引    @Field(type = FieldType.Long,index = true)private int age;
}

根据pojo创建索引

@SpringBootTestclass 
EsDemo1ApplicationTests {// 直接注入使用@Autowired    ElasticsearchRestTemplate elasticsearchTemplate;    @Testvoid esTest(){// 创建索引    IndexOperations indexOperations = elasticsearchTemplate.indexOps(People.class);   if(!indexOperations.exists()) { // 当前索引不存在boolean result1 =indexOperations.create();// 只是创建索引 。mappings没有映射boolean result2 = indexOperations.putMapping();// 映射属性    System.out.println("创建结果:" + ",映射结果:" + result2);}else {System.out.println("文档已存在");}
}

验证索引表是否创建成功

GET people_index/_mapping

四、 常用方法

ElasticsearchRestTemplate 常用方法

1、save :保存或者更新文档
elasticsearchRestTemplate.save(object);2、index: 保存或更新文档数据到指定索引和类型中
IndexQuery indexQuery = new IndexQueryBuilder().withObject(object).build();
elasticsearchRestTemplate.index(indexQuery, IndexCoordinates.of(indexName));3、get: 根据文档 ID 获取文档数据。
elasticsearchRestTemplate.get(id, DocumentClass.class);4、update: 更新指定文档的数据。
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(id).withObject(updatedObject).build();
elasticsearchRestTemplate.update(updateQuery, IndexCoordinates.of(indexName));5、delete: 删除指定文档。
elasticsearchRestTemplate.delete(id, IndexCoordinates.of(indexName));6、exists: 判断指定文档是否存在。
elasticsearchRestTemplate.exists(id, IndexCoordinates.of(indexName));7、search: 执行搜索操作,使用 Query 条件进行搜索。
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("field", "value")).build();
List<DocumentClass> resultList = elasticsearchRestTemplate.search(searchQuery, DocumentClass.class, IndexCoordinates.of(indexName));8、count: 计算满足指定条件的文档数量。
NativeSearchQuery countQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("field", "value")).build();
long count = elasticsearchRestTemplate.count(countQuery, IndexCoordinates.of(indexName));

IndexOperations 常用方法

1、create():创建索引。如果索引已存在,则会抛出异常。2、delete():删除索引。如果索引不存在,则会抛出异常。3、exists():检查索引是否存在。4、putMapping():为索引设置映射。MappingContext 是 Spring Data Elasticsearch 提供的用于获取实体类映射信息的接口。5、refresh():刷新索引,使之可搜索最新添加的文档。在索引文档后,需要调用 refresh() 方法才能保证文档可以被搜索到。6、getIndexSettings():获取索引的配置信息。7、getAliases():获取索引的别名信息。8、addAlias(AliasQuery aliasQuery):添加别名。9、removeAlias(AliasQuery aliasQuery):移除别名。10、getSettings():获取索引的详细配置信息。11、updateSettings(UpdateSettingsRequest request):更新索引的配置信息。

其实真正常用的也就是

        保存/修改文档

        elasticsearchRestTemplate.save()

        查询文档

        elasticsearchRestTemplate.search()  

以及NativeSearchQuery 搜索对象

五、操作(重点)

1、对索引表的操作

对索引表的操作常用的也就是,创建/修改、删除

创建就是上面提到的映射

删除索引表:

@Test
void esTest2(){IndexOperations indexOperations = elasticsearchTemplate.indexOps(People.class);    boolean delete = indexOperations.delete();   // 删除索引      System.out.println("删除索引:"+delete);}

2、对文档的操作(重点)

对于ES来说,索引就是表,文档就是数据

(1)、添加文档

添加一条

// 添加文档
@Test
void esTest3(){People people=new People();    people.setId("1232");    people.setName("张三");    people.setAge(32);    // 保存文档--save 根据文档id修改或者创建文档  People save = elasticsearchTemplate.save(people);   }

批量添加

// 批量添加
@Test
void esTest4(){List<People> list= Arrays.asList(new People("1","李四","长沙",23),            new People("2","李四","长沙",23),            new People("3","李四","长沙",23),            new People("4","李四","长沙",23));    Iterable<People> save1 = elasticsearchTemplate.save(list);    System.out.println("数据"+save1);}

检查是否添加完成

GET people_index/_search

 (2)、删除文档

// 删除操作
@Test
void esTest5(){// id   // 对应索引库    
String delete = elasticsearchTemplate.delete("1", People.class);    
}

除了根据id删除文档外,还可以根据条件删除文档,请类比下面的查询操作

(3)、查询文档(重点)

 matchQuery按关键字查询(关键字也会被拆分),示例

@Test
void query(){// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("address", "太阳")).build();    // // 查询    SearchHits<People> search1 = elasticsearchTemplate.search(searchQuery, People.class);    search1.forEach(System.out::println);
}

查询全部文档 (两种方式)

// 第一种 ,不加查询条件
@Test
void query(){ // 查询--全部文档SearchHits<People> search1 = elasticsearchTemplate.search(new NativeSearchQueryBuilder().build(), People.class);    search1.forEach(System.out::println);}// 第二种
// 查询全部
//matchAllQuery
@Test
void query3(){// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder()// 根据关键字进行全局模糊搜索            .withQuery(QueryBuilders.matchAllQuery())         .build();    // 查询    SearchHits<People> search1 = elasticsearchTemplate.search(searchQuery,People.class);    search1.forEach(System.out::println);}

matchQuery根据关键字拆分进行全局搜索

@Test
void query1(){// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder()// 根据关键字进行全局模糊搜索            .withQuery(QueryBuilders.matchQuery("李四")) // "李四"会被拆分成关键字进行搜索           .build();    // 查询    SearchHits<People> search1 = elasticsearchTemplate.search(searchQuery,People.class);    search1.forEach(System.out::println);
}

matchPhraseQuery短语搜索--完整搜索

不会对关键字的拆分搜索

// 短语搜索
@Test
void query4(){// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder()// 根据关键字进行全局模糊搜索            .withQuery(QueryBuilders.matchPhraseQuery("address","长沙市"))     // “长沙市” 不会进行拆分.build();    // 查询    SearchHits<People> search1 = elasticsearchTemplate.search(searchQuery,People.class);    search1.forEach(System.out::println);}// 解释下什么是短语搜索比如查询 "小明爱吃葡萄"普通关键字查找(matchQuery),这句查找关键字会被拆分成 "小明","爱吃","葡萄" 等,查出的结果满足一个关键字即可,即查出来的结果可能会出现 "小明爱吃香蕉"短语搜索出来的结果 就是以"小明爱吃葡萄"为关键字去搜索,不会对关键字再进行拆分

rangeQuery范围搜索

适用于数值类型

// 范围搜索
@Test
void query5(){// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder()// 根据关键字进行全局模糊搜索 lte <=  gte >=            .withQuery(QueryBuilders.rangeQuery("age").gte(10).lte(20))          .build();    // 查询    SearchHits<People> search1 = elasticsearchTemplate.search(searchQuery,People.class);    search1.forEach(System.out::println);
}

termQuery精确搜索

注意: 对于text类型且使用的ik分词的字段而言, termQuery的作用和matchPhraseQuery 类似,所以termQuery 适用于keyword类型的字段和数值类型的字段

// 精确搜索
@Test
void query6(){// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder()// 根据关键字进行全局模糊搜索 lte <=  gte >=            .withQuery(QueryBuilders.termQuery("age",15)).build();    // 查询    SearchHits<People> search1 = elasticsearchTemplate.search(searchQuery,People.class);    search1.forEach(System.out::println);}

boolQuery()复合查询

对于优先级别问题 使用多个must 来处理

// 复合查询
@Test
void query7(){// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder()// boolQuery 符合查询,must必须  should 或者            // name=李四 ||age>=30            // QueryBuilders.boolQuery().should(QueryBuilders.termQuery("name","李四")).should(QueryBuilders.rangeQuery("age").gte(30))            // name=李四 && age>=30            // QueryBuilders.boolQuery().must(QueryBuilders.termQuery("name","李四")).must(QueryBuilders.rangeQuery("age").gte(30))            //  (name=李四 || age>=25) && age <=30  使用must 处理优先级问题            .withQuery(QueryBuilders.boolQuery().must(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("name","李四")).should(QueryBuilders.rangeQuery("age").gte(25))).must(QueryBuilders.rangeQuery("age").lte(30))).build();    // 查询    SearchHits<People> search1 = elasticsearchTemplate.search(searchQuery,People.class);    search1.forEach(System.out::println);}

withPageable分页查询

需要对查询结果进行封装

@Test
void query8() throws JsonProcessingException {// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder()                                                                                // 页码(从0开始) 每页条数                                                    .withPageable(PageRequest.of(0,2)).build();    // 查询    SearchHits<People> search = elasticsearchTemplate.search(searchQuery, People.class);    // 对查询结果进行封装--Page    SearchPage<People> searchHits = SearchHitSupport.searchPageFor(search, searchQuery.getPageable());    System.out.println("当前页码(从0开始):getNumber:"+searchHits.getNumber());    System.out.println("总页数:getTotalPages :"+searchHits.getTotalPages());    System.out.println("每页的最大数据条数:getSize: "+searchHits.getSize());    System.out.println("是否有下一页数据:hasNext: "+searchHits.hasNext());    System.out.println("是否有上一页数据:hasPrevious: "+searchHits.hasPrevious());    System.out.println("当前页数据:getContent: "+searchHits.getContent());   String s = objectMapper.writeValueAsString(searchHits);                System.out.println("json:"+s);
}

withSorts对结果进行排序

@Test
void query8() throws JsonProcessingException {// 创建查询  字段--索引    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder()// 查询全部            .withQuery(QueryBuilders.matchAllQuery())// 根据 age 字段进行从大到小排序            // 字段             排序规则.withSorts(SortBuilders.fieldSort("age").order(SortOrder.DESC)).build();    // 查询    SearchHits<People> search = elasticsearchTemplate.search(searchQuery, People.class);    search.forEach(System.out::println);}

高亮查询

把查询结果的关键字进行高亮处理

// 高亮查询
@Test
void query9() throws JsonProcessingException {// 创建查询  字段--索引    // 创建高亮设置    HighlightBuilder highlightBuilder=new HighlightBuilder();    // 设置高亮的结果字段                        结果前面添加内容                                后续添加内容    highlightBuilder.field("address").preTags("<span style=\"color:red\">").postTags("</span>");    highlightBuilder.field("name").preTags("<span style=\"color:red\">").postTags("</span>");    NativeSearchQuery searchQuery=new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("address","长沙"))// 处理高亮            .withHighlightBuilder(highlightBuilder).build();    // 查询    SearchHits<People> search = elasticsearchTemplate.search(searchQuery, People.class);    // 查询结果为SearchHits --SearchHit为封装的单个数据,高亮数据在highlightFields 中    List<SearchHit<People>> searchHits = search.getSearchHits();    searchHits.forEach(System.out::println);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/46650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何创建自定义的PyQt控件

首先&#xff0c;我们要明确一点&#xff0c;PyQt 是一个非常强大的图形用户界面&#xff08;GUI&#xff09;库&#xff0c;用于 Python。你可以使用它创建复杂的跨平台应用程序。在 PyQt 中&#xff0c;你可以创建自定义的控件&#xff0c;也就是我们常说的“Widget”。 对于…

【C语言】写一个程序,输入数量不确定的【0,9】范围内的整数,统计每一种数字出现的次数,输入-1表示结束

题目 写一个程序&#xff0c;输入数量不确定的【0,9】范围内的整数&#xff0c;统计每一种数字出现的次数&#xff0c;输入-1表示结束 代码 #include<stdio.h> int main() {int x;int i;int a[10];for(i0; i<10; i){//初始化数组 a[i] 0;}scanf("%d",&am…

npm报错 Cannot find module ‘@vuepress\core\node_m

通常是由于缺少依赖包或者依赖包版本不兼容引起的。可以尝试以下步骤来解决这个问题&#xff1a; 确保您的项目的依赖包是最新的&#xff0c;可以运行 npm update 命令来更新依赖包。 如果更新依赖包后仍然有问题&#xff0c;可以尝试删除 node_modules 文件夹&#xff0c;并重…

Vim在Mac电脑中的下载与安装方法:MacVim

本文介绍在Mac系统电脑中&#xff0c;下载、安装文本编辑器Vim软件&#xff08;MacVim软件&#xff09;的具体方法。 在Mac系统电脑中&#xff0c;原本就带有一个非图形界面的Vim&#xff1b;只要我们在终端中&#xff0c;输入如下的代码&#xff0c;就可以查看系统自带的非图形…

深度学习入门-3-计算机视觉-卷积神经网络

一、计算机视觉 1.概述 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

ThinkPHPV5.1.25中使用file_exists等函数没有触发phar://的反序列化的destruct魔术方法执行的问题

上图file_exists方法会触发phar://伪协议对phar文件的反序列化对象的操作。 在thinkphp框架中目标对象的wakeup魔术方法是会执行的&#xff0c;但是destruct魔术方法不一定会。 因为像我碰到的问题就是我的项目主目录下的/runtime目录没有Web服务器用户的写入权限会导致日志写…

博客系统之单元测试

对博客系统进行单元测试 1、测试查找已存在的用户 测试名称 selectByUsernameTest01 测试源码 //查找用户&#xff0c;存在 Test public void selectByUsernameTest01 () { UserDao userDao new UserDao(); String ret1 userDao.selectByUsername("张三").toStr…

【学习日记】【FreeRTOS】任务调度时如何考虑任务优先级——任务的自动切换

写在前面 本文开始为 RTOS 加入考虑任务优先级的自动调度算法&#xff0c;代码大部分参考野火。 本文主要是一篇学习笔记&#xff0c;加入了笔者自己对野火代码的梳理和理解。 一、基本思路 首先我们要知道&#xff0c;在 RTOS 中&#xff0c;优先级越高、越需要被先执行的的…

解析大规模开发:提升企业级开发效率与质量,加速创新

在数字化转型的大环境下&#xff0c;越来越多的企业依赖软件来驱动业务和创新。然而&#xff0c;随着开发规模日益庞大&#xff0c;如何更好地提升研发效能&#xff0c;从而塑造更强大的竞争力&#xff0c;已然成为众多企业亟待解决的共同难题。 作为国内领先的DevSecOps提供商…

运放和三极管构成的恒流源电路

这是一个由运放和三极管构成的恒流源电路&#xff0c;RL为负载电阻&#xff0c;R1为采样电阻。 流过三极管集电极的电流 下面分析下这个电路的工作原理。首先我们可以看到这个运放引入了负反馈&#xff0c;所以它工作在线性区的&#xff0c;就有VINVPVN。 所以流过采样电阻R1的…

C#程序变量统一管理例子 - 开源研究系列文章

今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。 我们知道&#xff0c;在C#里使用变量&#xff0c;除了private私有变量外&#xff0c;程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为&#xff1a;1)窗体&#xff1b;2)…

oracle分析函数学习

0、建表及插入测试数据 --CREATE TEST TABLE AND INSERT TEST DATA. create table students (id number(15,0), area varchar2(10), stu_type varchar2(2), score number(20,2));insert into students values(1, 111, g, 80 ); insert into students values(1, 111, j, 80 ); …

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

基于Java+SpringBoot制作一个智能用电小程序

在当今快节奏的生活中,高效利用能源变得越来越重要。制作一个智能用电小程序,旨在帮助您更智能地管理家庭电器的用电,从而提升能源利用效率,助您掌握用电情况,降低能耗成本,实现绿色低碳生活。 目录 一、小程序1.1 项目创建1.2 首页轮播图快捷导航iconfont图标引入

使用DSA、ECDSA、Ed25519 和 rfc6979_rust实现高安全性的数字签名

第一部分&#xff1a;背景和DSA简介 在数字世界中&#xff0c;确保数据的真实性和完整性是至关重要的。一个有效的方法是使用数字签名。在这篇文章中&#xff0c;我们将探讨四种流行的加密签名算法&#xff1a;DSA、ECDSA、Ed25519 和 rfc6979_rust。我们将重点讲解它们的基础…

GSM/CDMA/VoLTE/VoIP通话

1.GSM(Global System for Mobile Communications) 本质是一种多址技术&#xff0c;将多个通话放入一段无线电频道的方法。特点是通过“时间划分”&#xff0c;称为时分多址。 2.CDMA(Code Division Multiple Access) 一种多址技术&#xff0c;将多个通话放入一段无线电频道的…

物理公式分类

(99 封私信 / 81 条消息) 定义式和决定式有什么区别&#xff0c;怎么区分&#xff1f; - 知乎 (zhihu.com) 1、首先&#xff0c;定义一个物理符号&#xff08;物理量&#xff09;来表征物理世界最直观/最基本的物理现象&#xff0c;例如&#xff0c;长度&#xff08;米&#xf…

AIGC绘画:kaggle部署stable diffusion项目绘画

文章目录 kaggle介绍项目部署edit my copy链接显示 结果展示 kaggle介绍 Kaggle成立于2010年&#xff0c;是一个进行数据发掘和预测竞赛的在线平台。从公司的角度来讲&#xff0c;可以提供一些数据&#xff0c;进而提出一个实际需要解决的问题&#xff1b;从参赛者的角度来讲&…

async/await 编程理解

博客主要是参考 Asynchronous Programming in Rust &#xff0c;会结合简单的例子&#xff0c;对 async 和 await 做比较系统的理解&#xff0c;如何使用 async 和 await 是本节的重点。 async 和 await 主要用来写异步代码&#xff0c;async 声明的代码块实现了 Future 特性&a…

批量爬虫采集完成任务

批量爬虫采集是现代数据获取的重要手段&#xff0c;然而如何高效完成这项任务却是让许多程序员头疼的问题。本文将分享一些实际操作价值高的方法&#xff0c;帮助你提高批量爬虫采集的效率和专业度。 目标明确&#xff0c;任务合理划分&#xff1a; 在开始批量爬虫采集前&…