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

news2024/11/15 20:00:53

一、ElasticSearch 介绍

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

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

二、环境准备

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

  • 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>
复制代码

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

四、创建高级客户端

新建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/108267.html

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

相关文章

VS Code 中的增强 code CLI

Visual Studio Code 的核心是一个代码编辑器&#xff0c;它通过我们的远程开发经验与其他环境集成&#xff0c;变得更加强大和灵活。 你可能不知道的是&#xff0c;VS Code 有一个内置的命令行界面(CLI)&#xff0c;可以让你控制启动和管理编辑器的方式——你可以通过命令行选项…

【图像处理】基于二维FIR的特定角度边缘检测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

HiveServer2 和 HiveMetastore 梳理

本文重新回顾一下Hive的两个核心服务&#xff1a;HiveServer2 和 HiveMetastore(HMS)。很多人会简单地把HiveServer2当成Hive的JDBC/ODBC服务&#xff0c;不启动HiveServer2服务&#xff0c;就没有10000端口&#xff0c;JDBC/ODBC客户端就连接不上Hive。从使用者的角度理解这就…

常见的数据通信方式有哪些?

数据通信方式指通信双方在信号发送、传输和接收这3个环节对信号的处理方式&#xff0c;下面将对不同的信号处理方式进行讲解。 单工、半双工与全双工通信 按信道上信号的传输方向与时间的关系&#xff0c;通信方式可分为单工通信、半双工通信与全双工通信。 (1) 单工通信 单…

Minecraft 1.19.2 Forge模组开发 09.动画效果方块

我们本次尝试制作一个具有动画效果的方块 效果演示效果演示效果演示 首先&#xff0c;请确保你的开发包中引入了geckolib依赖&#xff0c;相关教程请参考:Minecraft 1.19.2 Forge模组开发 03.动画生物实体 1.首先我们要使用geckolib制作一个物品和对应的动画&#xff1a; 在…

TDOA 定位技术和实际应用简介

介绍了TDOA&#xff08;Time difference of Arrival&#xff09;的基本原理&#xff0c;列举了TDOA 定位的优势&#xff0c;并且通过实例分析其在实际应用中的有效性&#xff0c;结合实验数据分析了影响TDOA 的因素。本文提出TDOA 是一种简单高效的定位方式&#xff0c;可以被广…

js原型与原型链完整图解

首先要知道&#xff1a; 1、所有对象&#xff08;除null&#xff09;都有一个__proto__属性指向构造函数的原型对象 2、所有对象&#xff08;除null&#xff09;都有一个constructor属性指向构造函数&#xff08;函数也是对象&#xff09; 已知&#xff1a;有一个构造函数Fn…

如何在交付运维过程中建立风险底线意识,提前识别风险,避免项目延期?

大家好&#xff0c;我是小赛。又到了每周的【项目管理案例】分享栏目了。本期案例来自于希赛PM创造营项目经理们的分享&#xff1a;项目延期是每位项目经理或多或少都会遇到的工作难题&#xff0c;本期我们一起来探讨一下&#xff1a;如何在交付运维过程中建立风险底线意识&…

【檀越剑指大厂—SpringMVC】SpringMVC篇

一.基础概念 1.什么是 MVC MVC 是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC 主要作用是降低了视图与业务逻辑间的双向偶合。MVC 不是一种设计模式&#xff0c;MVC 是一种架构模…

APS排产帮助面板制造厂商进行计划调整

液晶面板是决定液晶显示器亮度、对比度、色彩、可视角度的材料&#xff0c;液晶面板的价格走势会直接影响到液晶显示器的价格&#xff0c;液晶面板作为电视、显示器等产品的核心组成部件&#xff0c;一般占到成本的60%以上。在液晶面板下行周期中&#xff0c;面板大厂们日子更不…

设计数据库中常见的规范

文章目录命名规范合适的字段类型主键设计要合理合适的字段长度优先考虑逻辑删除&#xff0c;而不是物理删除每个表都需要添加一些通用字段表的字段不要太多尽可能使用not null 定义字段评估哪块要加索引避免使用MySQL保留字不要外键关联&#xff0c;一般用代码维护一般都选择IN…

外包四年太差劲,幡然醒悟要跳槽

前几天有个读者过来说&#xff0c;“二哥&#xff0c;外包干了四年&#xff0c;感觉和外界差距有点大&#xff0c;现在被动醒悟&#xff0c;希望你能帮我制定一下学习路线。” 那二哥这么负责任&#xff0c;必须得承担起这份职责啊&#xff01;于是我就让读者整理了一份 1.0 版…

RL - 简单介绍

目录 一、两种机器学习类型 1.1 预测型机器学习 1.2 决策型机器学习 二、强化学习的定义 三、强化学习的交互过程 四、强化学习系统要素 五、强化学习智能体分类 一、两种机器学习类型 1.1 预测型机器学习 1有监督学习: 基于数据的一部分输入&#xff0c;去预测相关输…

STL之stack、queue、priority_queue模拟实现

容器适配器 容器适配器&#xff0c;简言之是可以用不同容器来快速实现自己的工具。像stack、queue、priority_queue都是容器适配器。 stack模拟实现 主要接口定义如下&#xff1a; namespace lz {template<class T, class Container deque<T>>class stack{publ…

【论文阅读总结】inception v2_v3总结

重新思考计算机视觉的Inception架构1.摘要2.简介2.1 以往模型问题2.2 问题缓解2.3 问题解决出现的问题2.4 有效的一般原则和优化思想3.一般设计原则3.1 设计原则1【避免代表性瓶颈(不能过度降维)】3.2 设计原则2【特征越多&#xff0c;收敛越快】3.3 设计原则3【卷积之前使用1*…

【java】opencv + Tesseract(tess4j) 实现图片处理验证码识别

1.opencv for java 环境搭建和测试 到OpenCV官网下载你需要的版本&#xff0c;运行安装&#xff0c;记住安装目录。打开上一步安装的位置&#xff0c;依次打开如下图位置&#xff0c;复制opencv-{version}.jar、x64包下对应的dll到项目里&#xff0c;放在同级 在maven里添加o…

JVS低代码首页功能介绍

首页介绍 首页操作演示 系统logo 系统logo是每个系统的名称标识&#xff0c;点击系统logo可以返回到首页&#xff0c;这里的系统logo是支持配置化的。 应用快捷导航 应用快捷导航是将登录用户有权限使用的应用展示出来&#xff0c;鼠标点击后&#xff0c;系统展示可见的应用于…

k8s-Pod的生命周期和调度

目录 主要运行周期 1 Pod创建和终止 2 初始化容器 3 钩子函数 4 容器探测 5 重启策略 Pod调度 1 定向调度 2 亲和性调度 3 污点和容忍 主要运行周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创…

vscode python远程开发最佳实践

文章目录环境插件踩坑python类型提示不起作用配置PYTHONPATH前言 最近因为remote-ssh从pycharm转到vscode开发, 再删掉pycharm强制使用vscode摸索了一周熟练之后发现vscode其实使用起来也很爽&#xff0c;一些踩坑和最佳实践方案汇总 环境 插件 remote-sshpythonpylance(微软…

Compose 动画艺术探索之 Easing

本篇文章是此专栏的第六篇文章&#xff0c;前几篇文章大概将 Compose 中的动画都简单过了一遍&#xff0c;如果想阅读前几篇文章的话可以点击下方链接&#xff1a; Compose 动画艺术探索之瞅下 Compose 的动画Compose 动画艺术探索之可见性动画Compose 动画艺术探索之属性动画…