Spring Boot整合分布式搜索引擎ElasticSearch 实现相关基本操作

news2024/12/23 2:14:00

在这里插入图片描述

文章目录

  • 一、ElasticSearch 介绍
  • 二、环境准备
  • 三、创建Spring Boot项目导入依赖
  • 四、创建高级客户端
  • 五、基本操作
    • 索引操作
    • 文档操作
    • 批量插入数据
    • 其他操作
  • 六、总结

一、ElasticSearch 介绍

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

ElasticSearch 官网地址:https://www.elastic.co/cn/

image.png

二、环境准备

在开始开发之前,我们需要准备一些环境配置:

  • jdk 1.8 或其他更高版本
  • 开发工具 IDEA
  • 管理依赖 Maven
  • ElasticSearch环境,此处使用docker搭建,ElasticSearch 版本为7.17.7
  • Spring Boot 2.X

三、创建Spring Boot项目导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

注意:依赖版本必须与你当前所用的版本保持一致,否则连接失败

image.png

image.png

四、创建高级客户端

新建config目录存放项目配置类

@Configuration
public class ElasticSearchClientConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("服务器IP地址", 9200, "http")));
        return client;
    }
}

五、基本操作

索引操作

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    /**
    * 创建索引
    **/
    @Test
    void testCreateIndex() throws IOException {
        //1.创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("lt");
        //2.客户端执行请求IndicesClient,执行create方法创建索引,请求后获得响应
        CreateIndexResponse response=
                restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }

    /**
     * 判断索引是否存在
     **/
    @Test
    void testExistIndex() throws IOException {
        //1.查询索引请求
        GetIndexRequest request=new GetIndexRequest("lt");
        //2.执行exists方法判断是否存在
        boolean exists=restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);
        System.out.println(exists ? "存在" : "消失");
    }

    /**
     * 删除索引
     **/
    @Test
    void testDeleteIndex() throws IOException {
        //1.删除索引请求
        DeleteIndexRequest request=new DeleteIndexRequest("lt");
        //执行delete方法删除指定索引
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged() ? "删除成功" : "删除失败");
    }
}

文档操作

创建实体类User

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String name;
    private Integer age;
    private String[] funny;
}

文档相关操作代码

/**
 * 创建文档
 **/
@Test
void testAddUser() throws IOException {
    //1.创建对象
    User user=new User("小赵",21,new String[]{"篮球","吃饭"});
    //2.创建请求
    IndexRequest request=new IndexRequest("lt");
    //3.设置规则 PUT /lt/_doc/1
    //设置文档id=6,设置超时=1s等,不设置会使用默认的
    //同时支持链式编程如 request.id("6").timeout("1s");
    request.id("6");
    request.timeout("1s");

    //4.将数据放入请求,要将对象转化为json格式
    //XContentType.JSON,告诉它传的数据是JSON类型
    request.source(JSONValue.toJSONString(user), XContentType.JSON);

    //5.客户端发送请求,获取响应结果
    IndexResponse indexResponse=restHighLevelClient.index(request,RequestOptions.DEFAULT);
    System.out.println(indexResponse.toString());
    System.out.println(indexResponse.status());
}

/**
 * 获取文档数据
 **/
@Test
void testGetUser() throws IOException {
    //1.创建请求,指定索引、文档id
    GetRequest request=new GetRequest("lt","1");
    GetResponse getResponse=restHighLevelClient.get(request,RequestOptions.DEFAULT);

    System.out.println(getResponse);//获取响应结果
    //getResponse.getSource() 返回的是Map集合
    System.out.println(getResponse.getSourceAsString());//获取响应结果source中内容,转化为字符串
}

/**
 * 更新文档
 **/
@Test
void testUpdateUser() throws IOException {
    //1.创建请求,指定索引、文档id
    UpdateRequest request=new UpdateRequest("lt","6");

    User user =new User("xiaozhao",21,new String[]{"xxx","xxx"});
    //将创建的对象放入文档中
    request.doc(JSONValue.toJSONString(user),XContentType.JSON);

    UpdateResponse updateResponse=restHighLevelClient.update(request,RequestOptions.DEFAULT);
    System.out.println(updateResponse.status());
}

/**
 * 删除文档
 **/
@Test
void testDeleteUser() throws IOException {
    //创建删除请求,指定要删除的索引与文档ID
    DeleteRequest request=new DeleteRequest("lt","6");

    DeleteResponse updateResponse=restHighLevelClient.delete(request,RequestOptions.DEFAULT);
    System.out.println(updateResponse.status());
}

批量插入数据

/**
 * 批量插入数据
 **/
@Test
void testBulkAddUser() throws IOException {
    BulkRequest bulkRequest=new BulkRequest();
    //设置超时
    bulkRequest.timeout("10s");

    ArrayList<User> list=new ArrayList<>();
    list.add(new User("Java",25,new String[]{"内卷"}));
    list.add(new User("Go",18,new String[]{"内卷"}));
    list.add(new User("C",30,new String[]{"内卷"}));
    list.add(new User("C++",26,new String[]{"内卷"}));
    list.add(new User("Python",20,new String[]{"内卷"}));

    int id=1;
    //批量处理请求
    for (User u :list){
        //不设置id会生成随机id
        bulkRequest.add(new IndexRequest("ljx666")
                .id(""+(id++))
                .source(JSONValue.toJSONString(u),XContentType.JSON));
    }

    BulkResponse bulkResponse=restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
    System.out.println(bulkResponse.hasFailures());//是否执行失败,false为执行成功
}

其他操作

@Test
void testSearch() throws IOException {
    SearchRequest searchRequest=new SearchRequest("ljx666");//里面可以放多个索引
    SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();//构造搜索条件

    //此处可以使用QueryBuilders工具类中的方法
    //1.查询所有
    sourceBuilder.query(QueryBuilders.matchAllQuery());
    //2.查询name中含有Java的
    sourceBuilder.query(QueryBuilders.multiMatchQuery("java","name"));
    //3.分页查询
    sourceBuilder.from(0).size(5);

    //4.按照score正序排列
    //sourceBuilder.sort(SortBuilders.scoreSort().order(SortOrder.ASC));
    //5.按照id倒序排列(score会失效返回NaN)
    //sourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.DESC));

    //6.给指定字段加上指定高亮样式
    HighlightBuilder highlightBuilder=new HighlightBuilder();
    highlightBuilder.field("name").preTags("<span style='color:red;'>").postTags("</span>");
    sourceBuilder.highlighter(highlightBuilder);

    searchRequest.source(sourceBuilder);
    SearchResponse searchResponse=restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);

    //获取总条数
    System.out.println(searchResponse.getHits().getTotalHits().value);
    //输出结果数据(如果不设置返回条数,大于10条默认只返回10条)
    SearchHit[] hits=searchResponse.getHits().getHits();
    for(SearchHit hit :hits){
        System.out.println("分数:"+hit.getScore());
        Map<String,Object> source=hit.getSourceAsMap();
        System.out.println("index->"+hit.getIndex());
        System.out.println("id->"+hit.getId());
        for(Map.Entry<String,Object> s:source.entrySet()){
            System.out.println(s.getKey()+"--"+s.getValue());
        }
    }
}

六、总结

  • 依赖版本必须与你当前所用的版本保持一致,否则连接失败。
  • 如果添加时不指定文档ID,他就会随机生成一个ID,ID唯一。
  • 创建文档时若该ID已存在,发送创建文档请求后会更新文档中的数据。
  • 更新文档时需要将实体对象中的属性全部指定值,不然会被设置为空,如果只设置了一个字段,那么只有该字段会被修改成功,其他会被修改为null。
  • hasFailures()方法是返回是否失败,即它的值为false时说明上传成功
  • elasticsearch很消耗内存,极力推荐使用docker部署运行

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

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

相关文章

【MySQL】史上最全的MySQL高性能优化总结

【MySQL】史上最全的MySQL高性能优化总结 【1】深入理解MySQL索引底层数据结构与算法 1. 为什么不使用二叉树、红黑树、B树来作为索引&#xff1f; 2. MyISAM 与 Innodb存储引擎有什么区别&#xff1f; 3. MySQL 的索引按照功能分类可以分几种&#xff1f; 4. MySQL 的的聚…

《领导力就是不装》——读书摘要

最近阅读的这本领导力就是不装–游戏化思维引领管理变革&#xff0c;分析问题的视角有新意&#xff0c;值得一看。以下是我的一点读书摘要。 领导力的三个关键点 具备进行管理变革、引领大家去解决难题的能力。具备成就他人、成就团队&#xff0c;让人才涌现&#xff0c;引领…

100天精通Python(数据分析篇)——第69天:Pandas常用数据筛选方法(between、isin、loc、iloc)

文章目录每篇前言一、布尔索引二、between()三、isin()1. 单列筛选2. 多列筛选3. 通过字典的形式传递多个条件4. 删除异常值所在行5. isnotin实现四、loc、iloc&#xff08;重要&#xff09;0. 创建DataFrame1. 提取行数据2. 提取列数据3. 提取多列数据4. 提取指定行、指定列数…

vmware16安装windows server 2008 VMware Tools

vmware16安装windows server 2008,安装完成后不会自动安装VMware Tools。而是出现如下提示&#xff1a; 简易安装正在安装Windows Server 2008 R2 x64。安装完操作系统后&#xff0c;需要手动安装VMware Tools。请参阅 https://kb.vmware.com/s/article/78708 附件下载 本文…

FPGA时序优化技术之重定时(Retiming)

介绍 重定时&#xff08;Retiming&#xff09;是一个智能过程&#xff0c;通过组合延迟路径向后和/或向前移动和平衡寄存器以获得最佳定时&#xff0c;同时保持电路的功能行为。重定时算法可以在不考虑互连延迟的情 况下&#xff0c;在同一边沿上由一个时钟对电路进行定时时找到…

【Linux vim】vim的基本使用,命令模式的指令集

目录 1.yum相当于手机的应用商店 2.vim的3种常用的模式 3.vim的基本使用&#xff08;写出一个hello vim的代码&#xff09; 4. 命令模式的指令集 1.yum相当于手机的应用商店 1.1查找 [rootVM-24-5-centos ~]# yum list #查找所有的安装包 但是查找结果太多了&#xff0c;可…

神州战神笔记本清灰+换硅脂-记录

文章目录Introduction拆清灰涂抹硅脂安装开机测试Introduction 笔记本购买于2020年4月份左右&#xff0c;至今已使用2年半时间。CPU是i7-9750H&#xff0c;基准频率是2.6GHz, 用control center 3.0开静音模式CPU会自动降频到1.5~2.6之间&#xff0c;日常办公都有些卡顿&#x…

docker配置阿里云镜像加速

一、快速使用-docker配置阿里云镜像 1、安装&#xff0f;升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端&#xff0c;参考文档docker-ce 2. 配置镜像加速器 针对Docker客户端版本大于 1.10.0 的用户 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加…

架构师必读 —— 逻辑模型(2)

用三角逻辑阐明观点&#xff1a; 通常用三角逻辑来表示逻辑的三大要素之间的关系。所谓三角逻辑&#xff0c;就是“观点” “论据” “数据”之间保持协调一致。观 点是指&#xff0c;话题的结论、提案或意见、推论。论据是指&#xff0c;佐证观点 的原理、原则、规律、普遍倾向…

阿里云-数据仓库-数据分析开发神器-ODPS

一、 ODPS 基本面-F10 1、什么是ODPS&#xff1f; 1、开发数据处理服务(Open Data Processing Service&#xff0c;简称ODPS)&#xff0c;2016年后更名MaxComputer。ODPS是一种由阿里云自主研发&#xff0c;针对TB/PB级数据、实时性要求不高的分布式处理服务。主要服务于批量结…

NoSQL数据库原理与应用综合项目——MongoDB篇

NoSQL数据库原理与应用综合项目——MongoDB篇 文章目录NoSQL数据库原理与应用综合项目——MongoDB篇0、 写在前面1、本地数据或HDFS数据导入到MongoDB2、MongoDB数据库表操作2.1 Java API 连接MongoDB2.2 查询数据2.3 插入数据2.4 修改数据2.5 删除数据3、MongoDB数据库表进行数…

Prettier系列之配置

文章の目录一、在文件目录中创建一个.prettierrc文件二、添加规则1、Print Width2、Tab Width3、Tabs4、Semicolons4.1、true----在每个语句的末尾添加一个分号。4.2、false----只在可能导致ASI失败的行开头添加分号。5、Quotes6、Quote Props6.1、as-needed6.2、consistent6.3…

Compose挑灯夜看 - 照亮手机屏幕里面的书本内容

一、前言 上一篇文章 Compose回忆童年 - 手拉灯绳-开灯/关灯里面82年钨丝灯&#xff0c;让我又有了新的想法&#xff0c;我们怎么照亮手机里面的文本内容呢&#xff1f; 我们会在上一篇文章的基础上来实现“挑灯夜看”的功能&#xff0c;怎么下手呢&#xff1f;往下看&#x…

小程序01/小程序 全局配置 tabBar 介绍、小程序模板语法数据绑定 wxml渲染

一.全局配置 tabBar 介绍 tabBar说明: tabBar是配置全局 页面底部导航 tabBar内包含 页面底部导航 背景 按钮 文字 文字颜色 注意: tabBar内list 最多是 5 项 &#xff0c;最少是 2 项 二.小程序模板语法数据绑定 说明: index.js文件data内定义属性 在index.wxml内渲染 in…

靠steam搬砖项目,傻瓜式操作单日500+,可放大操作

在分享干货之前&#xff0c;作为一个从15年开始创业的过来人&#xff0c;先教大家怎么分辨网络上的项目靠不靠谱&#xff0c;以后擦亮眼睛再做&#xff0c;切记&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1、回本周期性我这个人比较俗&#xff0c;创业就是…

我的世界(MC) forge 1.19.3 开服教程

Debian系统使用MCSManager9面板搭建Minecraft Java版MOD服务器的教程&#xff0c;本教程用的forge1.19.3服务端&#xff0c;用其他服务端的也可以参考一下。 其他版本我的世界服务器搭建教程&#xff1a;https://blog.zeruns.tech/tag/mc/各种Minecraft服务端介绍和下载&#…

双线性变换法MATLAB实现巴特沃斯低通滤波器

实验名称 数字信号处理实验4 实验&#xff08;实习&#xff09;日期 12.13 得分 指导老师 学院 电信院 专业 电子信息工程 年级 2020 班次 姓名 学号 20208327 1.实验目的 掌握利用MATLAB求滤波器阶数和自然截至频率&#…

手把手带你理解TPS趋势分析

在性能分析中,前端的性能工具,我们只需要关注几条曲线就够了:TPS、响应时间和错误率。这是我经常强调的。 但是关注 TPS 到底应该关注什么内容,如何判断趋势,判断了趋势之后,又该如何做出调整,调整之后如何定位原因,这才是我们关注 TPS 的一系列动作。 今天,我们就通…

SSM闲置物品

14-13开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;基于s5m闲置物品交易系统 网站前台&#xff1a;关于我们、联系我们、公告信息、闲置物品、求购信息 管理员功能&…

SQL语句练习06

目录 一、建表 二、SQL语句练习 一、建表 一、建立如下学生表(命名格式“姓名拼音_三位学号_week8student”&#xff0c;如LBJ_023_week8student&#xff09; create table LYL_116_week8student(SNO int primary key, SNAME char(8) not null unique,SEX char(2), DEPTNO i…