SpringBoot整合ES

1.引入依赖

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

2.config配置文件

@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
        final ClientConfiguration clientConfiguration =ClientConfiguration.builder()
                .connectedTo("xx.xxx.xxx.xx:9200") //地址
                .build();
        return RestClients.create(clientConfiguration).rest();
    }
}

         会返回两个客户端对象,分别是ElasticsearchOperations和RestHighLevelClient(更推荐使用)。前者是通过面向对象的形式来操作的,后者是通过客户端的方式操作的。

3.索引相关操作

/*
    索引相关操作
 */
public class Test1 {

    RestHighLevelClient restHighLevelClient;

    @Before
    public void init(){
        final ClientConfiguration clientConfiguration =ClientConfiguration.builder()
                .connectedTo("xx.xxxx.xxx.xx:xxxx")
                .build();
        this.restHighLevelClient = RestClients.create(clientConfiguration).rest();
    }

    @Test//创建索引
    public void createIndex() throws IOException {
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("products");
        //指定映射 参数1:指定映射json结构 参数2:指定数据类型
        createIndexRequest.mapping("{\n" +
                "    \"properties\": {\n" +
                "        \"id\":{\n" +
                "          \"type\":\"integer\"\n" +
                "        },\n" +
                "        \"title\":{\n" +
                "          \"type\":\"keyword\"\n" +
                "        },\n" +
                "        \"price\":{\n" +
                "          \"type\":\"double\"\n" +
                "        },\n" +
                "        \"created_at\":{\n" +
                "          \"type\":\"date\"\n" +
                "        },\n" +
                "        \"description\":{\n" +
                "          \"type\":\"text\",\n" +
                "          \"analyzer\": \"ik_max_word\"\n" +
                "        }\n" +
                "    }\n" +
                "  }", XContentType.JSON);
        //参数1:创建索引请求对象  参数2:请求配置对象
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        System.out.println("创建状态:"+createIndexResponse.isAcknowledged()); //打印返回信息
        restHighLevelClient.close(); //关闭资源
    }

    @Test//删除索引
    public void deleteIndex() throws IOException {
        AcknowledgedResponse acknowledgedResponse = restHighLevelClient.indices().delete(new DeleteIndexRequest("products"), RequestOptions.DEFAULT);
        System.out.println("删除状态:"+acknowledgedResponse.isAcknowledged()); //打印返回信息
        restHighLevelClient.close(); //关闭资源
    }
}

4.文档相关操作

/*
    文档相关操作(document)
 */
public class Test2 {
    RestHighLevelClient restHighLevelClient;

    @Before
    public void init(){
        final ClientConfiguration clientConfiguration =ClientConfiguration.builder()
                .connectedTo("xx.xxx.xxx.xx:9200")
                .build();
        this.restHighLevelClient = RestClients.create(clientConfiguration).rest();
    }

    @Test  //创建文档
    public void createDoc() throws IOException {
        IndexRequest indexRequest = new IndexRequest("products");
        indexRequest.id("2") //手动指定文档的id,如果不指定则会用uuid
                    .source("{\n" +
                            "  \"title\":\"瑞星咖啡\",\n" +
                            "  \"price\": 9.8,\n" +
                            "  \"created_at\":\"2023-11-18\",\n" +
                            "  \"description\":\"瑞星咖啡我最爱了,好喝\"\n" +
                            "}", XContentType.JSON);
        //参数1:索引请求对象,参数2:请求配置对象
        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse.status());
        restHighLevelClient.close();
    }

    @Test  //修改文档
    public void updateDoc() throws IOException {
        UpdateRequest updateRequest = new UpdateRequest("products","1");
        updateRequest.doc("{\n" +
                "    \"title\":\"库迪咖啡非\"\n" +
                "  }",XContentType.JSON);
        //参数1:索引请求对象,参数2:请求配置对象
        UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(updateResponse.status());
        restHighLevelClient.close();
    }

    @Test  //删除文档
    public void deleteDoc() throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest("products","2");
        //参数1:索引请求对象,参数2:请求配置对象
        DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(deleteResponse.status());
        restHighLevelClient.close();
    }

    @Test  //基于id查询文档
    public void searchDocById() throws IOException {
        GetRequest getRequest = new GetRequest("products", "1");
        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(getResponse.getId());
        System.out.println(getResponse.getSourceAsString());
    }

}

5.高级查询

public class Test3 {
    RestHighLevelClient restHighLevelClient;

    @Before
    public void init(){
        final ClientConfiguration clientConfiguration =ClientConfiguration.builder()
                .connectedTo("xx.xxx.xxx.xx:9200")
                .build();
        this.restHighLevelClient = RestClients.create(clientConfiguration).rest();
    }

    @Test //查询一个索引中的所有文档
    public void searchAll() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            String id = hit.getId();
            System.out.println("id: "+id+" source: "+hit.getSourceAsString());
        }
    }


    @Test //基于关键词查询
    public void search() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("description","好喝")));//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            String id = hit.getId();
            System.out.println("id: "+id+" source: "+hit.getSourceAsString());
        }
    }

    /*
     * 分页查询
     * 排序
     * 字段
     */
    @Test //分页查询 与排序
    public void search2() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery())
                            .from(1) //起始位置 start=(page-1)*size
                            .size(1) //每页显示条数
                            .sort("price", SortOrder.ASC) //字段排序
                            .fetchSource(new String[]{},new String[]{"created_at"}); //参数1:包含字段数组  参数2:排除字段数组
        searchRequest.source(searchSourceBuilder);//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            String id = hit.getId();
            System.out.println("id: "+id+" source: "+hit.getSourceAsString());
        }
    }

    @Test //高亮
    public void search3() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.requireFieldMatch(false).field("description").field("title").preTags("<span style='color:red;'>").postTags("</span>");
        searchSourceBuilder.query(QueryBuilders.termQuery("description","好喝"))
                            .highlighter(highlightBuilder);
        searchRequest.source(searchSourceBuilder);//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            System.out.println("id: "+hit.getId()+" source: "+hit.getSourceAsString());
            //获取高亮字段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if(highlightFields.containsKey("description")){
                System.out.println("description高亮结果: "+highlightFields.get("description").fragments()[0]);
            }
            if(highlightFields.containsKey("title")){
                System.out.println("title高亮结果: "+highlightFields.get("title").fragments()[0]);
            }
        }
    }


    @Test //过滤查询
    public void search4() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery())
                           .postFilter(QueryBuilders.idsQuery().addIds("1")); //指定过滤条件
        searchRequest.source(searchSourceBuilder);//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            String id = hit.getId();
            System.out.println("id: "+id+" source: "+hit.getSourceAsString());
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杨中科 EFCORE 第三部分 主键

主键 自增主键 1、EF Core支持多种主键生成策略:自动增长;Guid;Hi/Lo算法等。 2、自动增长。 优点:简单; 缺点: 数据库迁移以及分布式系统中&#xff08;多数据库合并&#xff0c;会有重复主键值&#xff09;比较麻烦;并发性能差&#xff08;大并发情况下&#xff0c;为了保证…

【LeetCode: 57. 插入区间+分类讨论+模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

NLP论文阅读记录 - WOS | ROUGE-SEM:使用ROUGE结合语义更好地评估摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结 前言 ROUGE-SEM: Better evaluation of summarization using ROUGE combin…

ssh 远程登录协议

一、SSH 服务 1.1 SSH 基础 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在应…

STM8入门|第一个工程

开发软件 不支持Keil&#xff0c;使用IAR for STM8&#xff0c;注意 IAR系列有很多种 STM8对应软件是 IAR for STM8 软件下载&#xff1a; 官网下载地址&#xff0c;官网版本下载比较麻烦&#xff0c;可以按教程网盘地址下载。 下载安装教程&#xff1a; https://www.cnblogs…

Compileflow工作流引擎使用讲解

文章目录 1 Compileflow1.1 简介1.2 特点1.3 Compileflow插件下载1.4 main方法调用1.4.1 pom.xml1.4.2 新建bpm文件1.4.3 各个节点绑定方法1.4.4 测试方法 1.5 bpm各个标签说明1.5.1 BPM根节点1.5.2 全局变量1.5.3 开始节点: start1.5.4 结束节点: end1.5.5 自动节点: autoTask…

B-TREE(B-树)

B-TREE B-tree 又叫平衡多路查找树。一棵 m 阶的 B-tree (m 叉树)的特性如下&#xff08;其中 ceil(x)是一个取上限的函数&#xff09;&#xff1a; 树中每个结点至多有 m 个孩子&#xff1b; 除根结点和叶子结点外&#xff0c;其它每个结点至少有有 ceil(m / 2)个孩子&#…

JVM实战(13)——JVM优化概述

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

每日一题——LeetCode1128.等价多米诺骨牌对的数量

先尝试暴力解法&#xff1a; var numEquivDominoPairs function(dominoes) {var count0for(let i0;i<dominoes.length-1;i){for(let ji1;j<dominoes.length;j){if((dominoes[i][0]dominoes[j][0] && dominoes[i][1]dominoes[j][1]) || (dominoes[i][0]dominoes…

Qt/QML编程学习之心得:小键盘keyboard(36)

小键盘对于qml应用是经常用到的,在qml里面,就如一个fileDialog也要自己画一样,小键盘keyboard也是要自己画的,对于相应的每个按键的clicked都要一一实现的。 这里有一个示例: 代码如下: import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Window 2.0 im…

Redis面试篇

redis面试题主要内容 面试官在面试时主要会问以下这些方面的问题 下面是一些问题示例&#xff1a; redis-使用场景 缓存 缓存穿透 介绍 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都会去查数…

2.1 常用计算机网络体系结构

2.1 常用计算机网络体系结构 2.1.1 OSI体系结构 1、为了使不同体系结构的计算机网络都能够互联&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;不久他们就提出了一个试图使各种计算机在世界范围内都能够互连成网的标准框架&#xff0c;也就是著名的…

Redis命令 - Lists命令组常用命令

先创建一个 key 叫做 mylist&#xff0c;mylist存一个list。 list数据类型底层是一个链表。先进后出&#xff0c;后进先出。 命令中的L&#xff08;Left&#xff09;、R&#xff08;Right&#xff09;代表链表的头部L&#xff08;下标0的位置&#xff09;和尾部R&#xff08;…

mysql5.7之从入门到放弃

系列文章目录 第一章 MySQL5.7之从入门到放弃 第二章 MySQL从入门到放弃之数据库体系结构与管理 第三章 MySQL基础应用之DDL、DCL、DML、DQL 文章目录 系列文章目录前言一、Mysql的介绍和安装&#xff1f;1、什么是数据&#xff1f;2、什么是数据库管理系统&#xff08;DBMS&a…

基于深度学习的老照片修复系统

技术栈 深度学习 pytorch tensorflow python 卷积神经 神经网络 照片修复 vue 老照片修复 扫描褪色 残损照片或胶片 调整暗调/高光以改善面效果 修正曝光斑痕 背景&#xff1a; 随着时间的流逝&#xff0c;许多老照片可能会褪色、损坏或曝光不当。这些老照片记录了宝贵的回忆…

如何在Windows 11的桌面中添加此电脑图标,这里提供四种方法

将“此电脑”图标添加到Windows 11桌面,使文件更容易访问。虽然Window的11酷设计从一开始就没有包含这个图标,但没必要担心。取回它很容易。你可以通过“设置”菜单、快捷方式或使用“控制面板”再次返回。有几种方法可以恢复此图标。 在这篇文章中,我们将探讨不同的方法,…

Windows下使用clion调试LevelDB与rocksdb

目录 关于leveldb下载leveldb源码增加测试文件更新cmake文件运行 关于RocksDB下载RocksDB代码修改CMakelist.txt运行 参考资料&#xff1a; 关于leveldb 下载leveldb源码 链接: leveldbGit地址 增加测试文件 使用clion打开项目&#xff0c;在根目录下新建一个app目录&#…

超详细的嵌入式cJSON使用注意事项,持续补充中......

文章目录 一、堆内存不足1.1 问题描述1.2 解决办法 二、内存泄露2.1 忘记Delete2.2 忘记Free2.3 串口数据接收缺少部分字符导致的内存泄露(自己的问题)问题分析 2.4 内存泄露在Cortex-M3内核会发生什么&#xff1f; cJSON开源库地址&#xff1a; cJSON 一、堆内存不足 1.1 问…

第十二讲 单片机驱动彩色液晶屏 如何打包bin档

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

Python-- if...else

在 Python 中&#xff0c;if 语句是用来进行条件判断的基本结构。它允许您根据一个或多个条件的真假来执行不同的代码块。Python 的 if 语句的基本语法如下&#xff1a; if condition:# do something elif another_condition:# do something else else:# do something if none…
最新文章