ElasticSearch系列之实操篇-SpringBoot中对Elasticsearch的增删改查操作

SpringBoot中对Elasticsearch的增删改查操作

  • 引包
  • 配置ES
  • 实体类
  • @Document中各个参数解释
      • 使用ElasticsearchTemplate完成增删改查操作
    • 查(分页查询,条件查询)
      • 条件查询
    • 排序
    • 分页
    • 增改
    • 删除

突然接到一个搜索的项目,需要新增一个版本,后台页面数据是存放在ElasticSearch中的,由于之前在实际项目当中从未用过ES,再加上只给了两天时间就需要完成页面和接口的开发,所以显得有些局促,不过好歹顺利完成,将学到的ES使用记录下来。

本文是通过spring-data-elasticsearch来操作ES的

引包

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId>
/dependency>

配置ES

spring:data:elasticsearch:cluster-name: elasticsearch #注意cluster-nodes: 127.0.0.1:9200 # 多个节点用逗号分开

注意:配置cluster-name的时候值一定要与下图红线框起来的一致。
在这里插入图片描述

实体类

想要操作ES中的索引是需要创建一个实体类
例如我所需要操作的是一个广告类:


import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;/*** 广告索引**/
@Data@Document(indexName = "adsInfos", type = "adsType", shards = 6, replicas = 2, refreshInterval = "0s")
public class Es_AdsInfo {@Idprivate Object id;@Fieldprivate Object adsName;  //广告图名称@Fieldprivate Object adsTypes; //广告图类型@Fieldprivate Object adsKeyWords;//匹配关键字@Fieldprivate Object adsStartTime;//推广开始时间@Fieldprivate Object adsEndTime;//推广结束时间@Fieldprivate Object adsPCImg;//PC端广告图地址@Fieldprivate Object adsMobileImg;//移动端广告图地址@Fieldprivate Object adsPCLink;//PC端跳转地址@Fieldprivate Object adsMobileLink;//移动端跳转地址@Fieldprivate Object addTime;//添加时间段@Fieldprivate Object insertDateTime;  //入库时间@Fieldprivate Object updateDateTime;  //更新时间@Fieldprivate Object field1;  //备用字段@Fieldprivate Object field2;  //备用字段@Fieldprivate Object field3;  //备用字段@Fieldprivate Object field4;  //备用字段@Fieldprivate Object field5;  //备用字段
}

在实体类中可以看到有一个@Document注解,里面有indexName,type,shards,replicas,refreshInterval

@Document中各个参数解释

事先声明:ES中的索引类似于普通关系型数据库(如:mysql,sqlserver)的数据库,而ES中的type则相当于数据库中的表。

  • indexName 索引名称 代表的是es中的具体某个索引
  • type 索引类型 代表的是索引中某个type
  • shards 分片数量 可以不要
  • replicas 备份数量 可以不要
  • refreshInterval 刷新间隔 可以不要

以上几个参数必须要有indexName 和 type 其他三个可以不写
比如可以这样

 @Document(indexName = "adsInfos", type = "adsType"")

使用ElasticsearchTemplate完成增删改查操作

使用ElasticsearchTemplate完全不需要有Dao层和service层,直接controller附带一个实体类就搞定一切。话不多说,上代码。

查(分页查询,条件查询)

/*** 数据查找** @return*/@RequestMapping(value = "getPageList", method = RequestMethod.GET)public Page<Es_KuaiSou_AdsInfo>  findPageList(@PageableDefault(size = 12) Pageable pageable, @RequestParam(name="title",required = false)String title) {SortBuilder sortBuilder = SortBuilders.fieldSort("insertDateTime").order(SortOrder.DESC);SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withSort(sortBuilder).withPageable(pageable).build();Page<Es_KuaiSou_AdsInfo> perfect_indices = elasticsearchTemplate.queryForPage(searchQuery, Es_KuaiSou_AdsInfo.class);return  perfect_indices;}

完全没有看错,简简单单的三两行代码搞定查询。
但需要注意一下几点,如何使用条件查询?排序?分页查询?

条件查询

如果想要使用条件查询的话只需要在NativeSearchQueryBuilder后点一个withQuery对象出来withQuery(字段名,参数)
效果:
new NativeSearchQueryBuilder().withQuery(matchQuery("adsName","开屏广告"))
这就是对adsName字段进行筛选,查出adsName等于开屏广告的数据

排序

想要按某个字段排序的话就需要new一个SortBuilder对象

SortBuilder sortBuilder = SortBuilders.fieldSort("time").order(SortOrder.DESC);

创建完SortBuilder 对象以后再new NativeSearchQueryBuilder()后边点一个withSort()把sortBuilder 对象放括号里
效果:

SearchQuery searchQuery = new NativeSearchQueryBuilder().withSort(sortBuilder).build();

分页

因为ES默认只返回10条数据,想要每页多返回几条需要创建Pageable对象
比如我这里是在查询方法加了注解@PageableDefault(size = 12) Pageable pageable,改为ES默认返回12条数据。

效果:

SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable).build();

当所有查询条件都就位之后效果是这样的:

SortBuilder sortBuilder = SortBuilders.fieldSort("time").order(SortOrder.DESC);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("adsName","开屏广告")).withSort(sortBuilder).withPageable(pageable).build();

然后再将SearchQuery 对象交给elasticsearchTemplate.queryForPage()

最终效果:

 /*** 数据查找** @return*/@RequestMapping(value = "getPageList", method = RequestMethod.GET)public Page<Es_AdsInfo>  findPageList(@PageableDefault(size = 12) Pageable pageable, @RequestParam(name="adsName",required = false)String adsName) {SortBuilder sortBuilder = SortBuilders.fieldSort("time").order(SortOrder.DESC);SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("adsName",adsName).withSort(sortBuilder).withPageable(pageable).build();Page<Es_AdsInfo> perfect_indices = elasticsearchTemplate.queryForPage(searchQuery, Es_AdsInfo.class);return  perfect_indices;}

增改

这里增改在一个方法里实现了,当新增数据时生成的id在ES里查找不到就会新增一条数据,当修改的时候由于ES里已经存在一个一模一样id的数据,此时就是对这条数据进行了修改。

    /*** 数据添加/修改** @return*/@RequestMapping(value = "save", method = RequestMethod.POST)public void save(@RequestBody Es_AdsInfo es_AdsInfo) throws IOException {//修改数据String id = UUID.randomUUID().toString();if(null == es_AdsInfo.getId()){es_AdsInfo.setId(id);}List<IndexQuery> queries = new ArrayList<>();IndexQuery indexQuery = new IndexQuery();indexQuery.setId(es_AdsInfo.getId().toString());indexQuery.setObject(es_AdsInfo);indexQuery.setIndexName("adsInfos");indexQuery.setType("adsType");queries.add(indexQuery);elasticsearchTemplate.bulkIndex(queries);}

删除

删除的话把id传过来使用elasticsearchTemplate执行delete操作就可以了。
delete(“adsInfos”,“adsType”,id)
我们看到delete方法中有三个参数,分别为索引名称,索引类型,和要删除数据的id。

/*** 数据删除** @return*/@RequestMapping(value = "deleted", method = RequestMethod.DELETE)public void deleted(String id) {elasticsearchTemplate.delete("adsInfos","adsType",id);}

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

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

相关文章

chatgpt赋能python:Python连接Elasticsearch的完全指南

Python连接Elasticsearch的完全指南 Elasticsearch是一个流行的分布式搜索和分析引擎&#xff0c;用于处理海量数据。如今&#xff0c;越来越多的开发人员使用Python编写应用程序&#xff0c;因此支持Python的Elasticsearch客户端是至关重要的。本文将介绍Python连接Elasticse…

ElasticSearch之ES8新特性及集群安装

文章目录 1. Elasticsearch8 新特性2. Elasticsearch8安装及使用2.1 JDK说明2.2 安装软件2.2.1 集群规划2.2.2 安装步骤2.2.2.1 上传压缩包2.2.2.2 解压安装包2.2.2.3 创建Linux新用户/数据文件/证书目录2.2.2.4 设置通信秘钥2.2.2.5 生成HTTP证书2.2.2.6 调整证书位置2.2.2.7 …

es中修改索引名称命令_在Elasticsearch中更改索引名称

es中修改索引名称命令 嘿&#xff0c; 今天&#xff0c;我碰巧写了一个脚本来解决一个看起来很多人都面临的特定问题&#xff1a;重命名给定的Elasticsearch索引。 自然地&#xff0c;有记录在案的解决方案&#xff0c;但是我没有Swift找到一个脚本可以让我找到我想要的位置—…

ElasticSearch改密码各种踩坑实录

ElasticSearch改密码各种踩坑实录 一、步骤 修改elasticsearch.yml文件的配置 #开启密码验证 xpack.security.enabled: false //暂时写成false&#xff0c;否则会出现如下报错1的情况&#xff0c;后续出现报错2&#xff0c;改为true即可 xpack.security.transport.ssl.enabl…

Arkime 修改默认安装的 Elasticsearch 的端口

将默认的es端口更改&#xff0c;并将arkime中配置的es端口更改 1.1 修改vim /etc/elasticsearch/elasticsearch.yml vim /etc/elasticsearch/elasticsearch.yml1.2 启动/重启es systemctl start elasticsearch.service systemctl restart elasticsearch.service1.3 访问 http…

docker 部署 elasticsearch后 修改 ES_JAVA_OPTS 参数

# 先停止docker容器&#xff0c;再停止docker服务&#xff0c;停止docker服务命令如下 systemctl stop docker service docker stop # 找到容器的配置文件存储目录,此目录下是容器启动时的配置文件所在目录 cd /var/lib/docker/containers/ # 修改配置文件config.v2.json vim c…

Android仿bilibili弹幕聊天室后面的线条动画

2018/08/08已优化成以下效果: GitHub:https://github.com/wuyr/PathView 哈哈&#xff0c;注意字眼&#xff0c;本文并不是仿弹幕聊天室&#xff0c;而是弹幕聊天室后面的线条动画。 今天在新版bilibili客户端发现了一个很炫酷的效果&#xff1a; 不过这动画太快了&#xff0c;…

昨晚B站、A站、豆瓣都崩了,作为程序员,你不会真以为是肖战搞的鬼吧?

现在是凌晨2点多&#xff0c;学东西学到了这个点&#xff0c;本来我是准备刷刷朋友圈就睡了的&#xff0c;但打开了朋友圈之后我发现了惊奇的一幕&#xff1a;B站、A站和豆瓣崩溃了。 我瞬间就清醒了&#xff0c;这种“百年难得一见”的怪事居然发生了&#xff1f;这一下一些不…

一场胆战心惊的B站面试,哔哩哔哩也太难进了

此次哔哩哔哩Java开发面试之旅可谓惊险&#xff0c;不过通过对大部分面试题套路的掌握&#xff0c;不出意外还是拿下了&#xff0c;下面我们来看看这些题是不是常见的不能再常见的了。这些面试题看了就能面上&#xff1f;当然不是&#xff0c;只是通过这些题让自己知道所欠缺的…

B站不挡脸弹幕前端是如何实现的?

相信最近有很多B站的用户都注意到了不挡脸的弹幕&#xff0c;打开一则视频右下角的“智能防挡弹幕”功能后&#xff0c;弹幕就不会再覆盖人像&#xff0c;而是呈现从人体身后穿过的效果。 简述实现方式 前端实现方法就正如PS中的“蒙版”一样&#xff0c;实心区域允许&#xf…

实现一个B站弹幕不挡人物的效果

如今各种视频网站&#xff0c;例如b站都有人物遮挡效果 其实是利用了svg图 css的mask-image属性去实现的。 打开f12可以取得 这种图片&#xff0c;就是由AI识别出来然后生成&#xff0c;一张图片也就一两K&#xff0c;一次加载很多张也不会造成很大的负担。 通过在视频不同时…

为了流量,何同学做了个“假B站”?

何同学是B站知名数码博主&#xff0c;凭借优秀的视频制作能力&#xff0c;内容创新获得广大年轻用户的喜欢。 2021年的时候&#xff0c;UP主老师好我叫何同学就发布了一条制作AirDesk的视频&#xff0c;随后迅速在社交媒体中引发了大量关注。 当时&#xff0c;该视频为B站全站…

为什么 B 站的弹幕可以不挡人物?

那天在 B 站看视频的时候&#xff0c;偶然发现当字幕遇到人物的时候就被裁切了&#xff0c;不会挡住人物&#xff0c;觉得很神奇&#xff0c;于是决定一探究竟。 高端的效果&#xff0c;往往只需要采用最朴素的实现方式&#xff0c;忙碌了两个小时&#xff0c;陈师傅打开了 F1…

酱缸中挣扎的无奈者——(感悟)

——读柏杨《酱缸震荡》随感&#xff08;一&#xff09; 让一些德才兼备的年轻人进入政坛&#xff0c;本应是一件好事&#xff0c;但结果却让老百姓深感失望。其中最主要的原因在于沉淀千年的腐臭不堪的官场文化。换言之&#xff0c;就是大家所强烈呼吁改革的政治体制所造成的…

中国最美的、令人震撼的10大名山

1、黄山—黄山归来不看岳&#xff0c;仿佛穿梭在人间与仙境。 黄山&#xff0c;位于安徽省南部黄山市境内&#xff0c;为三山五岳中三山之一。黄山为道教圣地&#xff0c;遗址遗迹众多&#xff0c;中华十大名山之一&#xff0c;有“天下第一奇山”之美誉。郦道元、李白、徐霞客…

细谈围城---我的启示录

2019独角兽企业重金招聘Python工程师标准>>> 不知什么原因&#xff0c;喜欢《围城》这本书&#xff0c;读<围城>&#xff0c;对于方鸿渐的经历&#xff0c;潜意识里总觉得不真实&#xff0c;总觉得是假的&#xff0c;读到小说的最后了&#xff0c;还是觉得故事…

RxPermissions源码分析

由于在项目中用到了RxPermissions框架&#xff0c;所以想看看源码&#xff0c;顺便记录一下自己对该框架的分析过程。 下面是一篇讲有关Android权限基础知识的文章&#xff0c;有心的小伙伴可以参考。 使用RxPermissions&#xff08;基于RxJava2&#xff09; App module的bui…

围城如社会,故事如生活

生活仍在继续,围城如社会,故事如生活,但我希望:我的社会不是围城,我的生活也不仅是故事。 【第1篇】 那时年少轻狂,喜欢反复翻阅围城,喜欢背诵那些譬喻,喜欢用譬喻来评论某事,喜欢学习钱老在围城里说话的腔调,觉得玩弄文字游戏是最过瘾的事了。后来,看的次数多起来…

任正非 鸿蒙 不为手机而生,为啥华为坚持用安卓,鸿蒙怎么办?任正非:它并不是为手机而生的...

虽说因为禁令的原因&#xff0c;导致华为和谷歌安卓中止部分合作关系&#xff0c;而华为也是推出了鸿蒙系统。可是在双方合作关系之后&#xff0c;华为方面也是表示&#xff0c;自己也将会继续使用安卓系统。这种做法&#xff0c;也是让不少用户有些懵了&#xff0c;为啥华为会…

为什么其他手机厂家不用鸿蒙,手机厂商为什么不用鸿蒙系统?鸿蒙HarmonyOS热议不断...

余承东说&#xff1a;“鸿蒙OS的出发点和Android(安卓)、iOS都不一样&#xff0c;是一款全新的基于微内核的面向全场景的分布式操作系统&#xff0c;能够同时满足全场景流畅体验、架构级可信安全、跨终端无缝协同&#xff0c;以及一次开发多终端部署的要求&#xff0c;鸿蒙应未…