Springboot整合elasticsearch

news2024/11/24 2:03:22

前言

elasticsearch基本介绍,这篇文章介绍了elasticsearch安装和使用。下面根据网上查来的各种资料,总结如何在springboot中使用elasticsearch。

文章中用es代替elasticsearch。

依赖

springboot版本是2.0,es版本用的是7.6.2。不同的springboot版本对应不同的es版本。

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

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.6.2</version>
</dependency>

application.yml

在配置文件中指定es的ip和端口。es默认端口是9200

spring:
  elasticsearch:
    rest:
      uris: http://127.0.0.1:9200

实体类

在实体类中通过注解指定索引名称、分片数、备份数等

@Document(indexName = "article_index",shards = 5,replicas = 1)
public class Article {
    @Id
    @Field(type = FieldType.Long,store = true)
    private long id;
    @Field(type = FieldType.Text,store = true,analyzer = "ik_min_word")
    private String auth;
    @Field(name = "book_title",type = FieldType.Text,store = true,analyzer = "ik_max_word")
    private String bookTitle;
    @Field(type = FieldType.Text,store = true,analyzer = "ik_max_word")
    private String content;

    public Article() {
    }
 
    // get set

es的命名规范中不可以使用大写,所以当属性名由两个单词组成时,java使用驼峰命名法,es使用下划线命名法,在@Field注解中使用name进行命名区分

数据层

@Mapper
public interface ArticleDao {

    /**
     * 查询全部数据
     */
    List<Article> queryAllArticle();

    /**
     * 修改数据
     */
    void updateArticle(Map map);
}

ElasticsearchRepository接口

自定义接口需要继承ElasticsearchRepository接口,接口方法命名规则类似spring data jpa,无需实现具体接口方法。
如果不知道spring data jpa是什么,点这个链接

public interface ArticleRepositories extends ElasticsearchRepository<Article,Long> {

    /**
     * 根据标题查询
     */
    List<Article> findArticlesByBookTitle(String title);

    /**
     * 根据作者查询
     */
    List<Article> findArticlesByAuth(String auth);

    /**
     * 根据内容查询
     */
    List<Article> findArticlesByContent(String content);

    /**
     * 根据标题或者内容查询
     */
    List<Article> findArticlesByBookTitleOrContent(String title,String content);

    /**
     * 根据标题或者内容查询 分页
     */
    List<Article> findArticlesByBookTitleOrContent(String title, String content, Pageable pageable);

    /**
     * 根据作者以及标题查询
     */
    List<Article> findByAuthAndBookTitle(String auth,String title);

    /**
     * 根据作者以及标题查询 分页
     */
    List<Article> findByAuthAndBookTitle(String auth,String title,Pageable pageable);
}

启动类

@SpringBootApplication
public class StartElasticSearchApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(StartElasticSearchApplication.class, args);
    }
}

测试类

测试类中需要注入ArticleRepositories和ElasticsearchRestTemplate。导入类时需要包路径,不要导错了

import com.ela.StartElasticSearchApplication;
import com.ela.dao.ArticleDao;
import com.ela.pojo.Article;
import com.ela.repositories.ArticleRepositories;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.UpdateQuery;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = StartElasticSearchApplication.class)
public class TestEs {

    @Autowired
    private ArticleRepositories articleRepositories;

    @Autowired
    private ElasticsearchRestTemplate template;
}

创建索引并插入数据

添加文档时如果索引库不存在则会自动创建

    @Test
    public void addDocument() throws Exception{
        // 直接从数据库中查询数据
        List<Article> articles = articleDao.queryAllArticle();
        for (Article article : articles) {
            // 将查询到的数据依次写入索引中
            articleRepositories.save(article);
        }
    }

执行完后使用kibana查询添加的文档

GET /article_index/_search
{
  "from": 0,
  "size": 30,
  "sort": [
    {
      "id": {
        "order": "asc"
      }
    }
  ]
}

在这里插入图片描述

删除文档

    @Test
    public void deleteDocument(){
        // 根据id删除
        //articleRepositories.deleteById(1l);
        // 删除全部
        articleRepositories.deleteAll();
    }

查询所有文档

    @Test
    public void findAll(){
        Iterable<Article> articles = articleRepositories.findAll();
        for (Article article : articles) {
            System.out.println(article.toString());
        }
    }

执行结果
执行结果

根据id查询

    @Test
    public void findById(){
        // 根据id查询
        Article article = template.get("14", Article.class);
        System.out.println(article);
    }

执行结果

根据标题查询

查询标题中带有“悲剧”两个字的数据

    @Test
    public void findByTitle(){
        List<Article> articles = articleRepositories.findArticlesByTitle("悲剧");
        for (Article article : articles) {
            System.out.println(article.toString());
        }
    }

执行结果

根据作者查询

查询作者名字带“东”和“吾”两个字的数据

    @Test
    public void findByAuth(){
        List<Article> articles = articleRepositories.findArticlesByAuth("东吾");
        for (Article article : articles) {
            System.out.println(article.toString());
        }
    }

执行结果

根据作者和标题查询

    @Test
    public void findByAuthTitle(){
        List<Article> articleList = articleRepositories.findByAuthAndTitle("埃因", "悲剧");
        for (Article article : articleList) {
            System.out.println(article.toString());
        }
        System.out.println("------分页-------");
        // 分页
        Pageable pageable = PageRequest.of(0,2);
        List<Article> articleList2 = articleRepositories.findByAuthAndTitle("埃因", "悲剧",pageable);
        for (Article article : articleList2) {
            System.out.println(article.toString());
        }
    }

使用PageRequest.of(0,2)进行分页,其中第一个参数表示页码,第二个参数表示一页中包含几条数据。需注意,第一个参数为0时表示第1页、为1时表示第2页、为i时表示第(i+1)页。

使用templates中的方法进行查询

    @Test
    public void testNativeSearchQuery(){
        // 创建一个查询对象
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.queryStringQuery("小说").defaultField("content"))
                .withPageable(PageRequest.of(1,5))
                .build();
        // 执行查询
        SearchHits<Article> search = template.search(query, Article.class);
        List<SearchHit<Article>> searchHits = search.getSearchHits();
        for (SearchHit<Article> searchHit : searchHits) {
            System.out.println(searchHit.getContent());
        }
    }

修改索引中的文档

相当于操作数据库 update t_article set auth=‘塞林格’ where id = 14;

   @Test
    public void updateArticleDoc(){
        Map<String,Object> updateMap = new HashMap<>();
        updateMap.put("id",14);
        updateMap.put("auth","塞林格");

        // 修改数据库
        //articleDao.updateArticle(updateMap);

        IndexRequest indexRequest = new IndexRequest();
        indexRequest.source(updateMap);
        Document document = Document.from(updateMap);
        UpdateQuery updateQuery = UpdateQuery.builder(updateMap.get("id").toString())
                .withDocAsUpsert(true)
                .withDocument(document)
                .build();
        template.update(updateQuery, IndexCoordinates.of("article_index"));
    }

在es的其他版本中,使用UpdateQueryBuilder()方法修改文档。但是我使用的7.6.2版本中没有这个方法。

        UpdateQuery updateQuery = new UpdateQueryBuilder()
                                    .withClass(Article.class)
                                    .withId("14")
                                    .withIndexRequest(indexRequest)
                                    .build();
        template.update(updateQuery);

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

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

相关文章

专业做护眼灯的有哪些品牌?盘点专业护眼灯品牌排行

护眼灯是家庭照明必备的工具&#xff0c;专业做护眼灯的却不多&#xff0c;许多家长找不到合适的护眼灯&#xff0c;我就根据标准GB/T 9473-2017《读写作业台灯性能要求》&#xff0c;筛选出五款合适国人使用的护眼灯。 TOP1、南卡护眼台灯Pro 光源舒适度&#xff1a;❤❤❤❤…

电子工程有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是电子工程领域的SCI期刊推荐&#xff1a; IEEE Transactions on Electron Devices&#xff1a; 该期刊是IEEE出版社的顶级期刊&#xff0c;涵盖电子学、固态电子学、电子器件、材料科学等多个领域。 IEEE Transactions on Industrial Electronics&#xff1a; 该期刊是I…

ChatGPT写21个程序,16个有漏洞:离取代程序员还远着呢!

一、ChatGPT 生成的代码有多安全&#xff1f; 近年来&#xff0c;大型语言模型推动人工智能领域取得了巨大的进步。其中&#xff0c;OpenAI 打造的 ChatGPT 甫一亮相&#xff0c;就凭借出色的性能震惊全球。ChatGPT 不仅能够处理普通文本&#xff0c;还能将自然语言翻译成代码…

Linux嵌入式uboot使用tftp网络启动加载zImage、设备树

文章目录 一、前言二、Linux U-boot 相关命令&#xff08;1&#xff09;help 命令&#xff08;2&#xff09;printenv 命令&#xff08;3&#xff09;setenv 函数&#xff08;4&#xff09;saveenv 函数 三、tftp启动linux内核步骤&#xff08;1&#xff09;进入u-boot模式&…

使用chatgpt探索SQL注入

今天尝试使用chatgpt尝试探讨咨询一下SQL注入的问题以及如何解决。 首先问的是“作为一个安全工作人员&#xff0c;写一篇关于Java SQL注入以及如何预防的文章&#xff0c;包含所有使用SQL可能存在注入的情况” 结果&#xff0c;结果就是没有等到结果&#xff0c;直接出错了。…

数百家数科公司齐聚用友BIP技术大会,共享企业数智化领先实践

4月19日&#xff5e;4月21日&#xff0c;由用友公司主办的“2023用友BIP技术大会“在用友产业园&#xff08;北京&#xff09;盛大召开&#xff0c;用友介绍了更懂企业业务的用友BIP-iuap平台&#xff0c;并发布了全面数智化能力体系&#xff0c;助力企业升级数智化底座&#x…

15、Context

目录 一、常规gorutine控制二、context控制groutine1 - 使用context控制单个gorutine2 - context创建3 - context函数4 - Context接口5 - 使用context控制多个gorutine停止 一、常规gorutine控制 控制并发的两种方式&#xff1a; 使用WaitGroup&#xff1a;多个Goroutine执行同…

SQL经典50题总结

SQL经典50题总结 SQL经典50题总结1.数据准备50题1.查询"01" 课程比 "02" 课程成绩高的学生的信息及课程分数2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩3.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩4.查询姓“…

推荐一个开源的区块链开发者工具网站

开源区块链开发者工具箱 https://ChainTool.tech 今天可以正式上线了。ChainTool 使用完全开源的方式编写一些开发者日常经常使用的工具。 关于 ChainToolDAO 大约在两个月前&#xff0c; ChainToolDAO 成立了&#xff0c;成立 ChainToolDAO 的来由是这样的&#xff1a;我是一…

Python模块练习题-测试你的Python技能。

练习题&#xff1a; 1.logging模块有几个日志级别&#xff1f;2.请配置logging模块&#xff0c;使其在屏幕和文件里同时打印以下格式的日志3.json、pickle、shelve三个区别是什么&#xff1f;4.json的作用是什么&#xff1f;5.subprocess执行命令方法有几种&#xff1f;6.为什么…

idea 2023版本创建maven管理的Scala项目教程

目录 1、创建项目1.1、创建项目名及简单配置1、2 刚开始创建好后的项目是这样的1、3 进行相关设置1&#xff09;增加maven管理2&#xff09;增加scala目录&#xff0c;并设置成resource目录 注意&#xff1a; 本项目写得教程是基于您得Java jdk、Scala jdk、maven这些都是安装配…

汽车充电桩检测设备TK4860C交流充电桩检定装置

TK4860C是一款在交流充电桩充电过程中实时检测充电电量的标准仪器&#xff0c;仪器以新能源车为负载&#xff0c;结合宽动态范围测量技术、电能ms级高速刷新等技术&#xff0c;TK4860C实现充电全过程的累积电能精准计量&#xff0c;相比于传统的预设检定点的稳态计量&#xff0…

PyQt5、Pyside2学习---02

1.界面布局 我们最常用的 Layout布局 有4种&#xff0c;分别是 QHBoxLayout 水平布局QVBoxLayout 垂直布局QGridLayout 表格布局QFormLayout 表单布局 2.调整控件位置和大小 调整layout中控件的大小比例: 可以通过设定控件的sizePolicy来调整&#xff0c; 调整控件间距: …

kafka多用户访问权限配置指导

一、场景描述 现场业务由于多厂商集成,共享数据需要,需对接当前kafka集群,为做到类似租户隔离的功能,需要开启kafka的权限控制和动态用户管理功能,实现不同厂商访问被授权的合法资源,消费者账号只能消费数据,生产者账号只能生产数据。 二、控制方式 Kafka 有三种认证模…

VSCode查看和编辑远程服务器的代码

在嵌入式开发过程中&#xff0c;很多时候代码都是放在编译服务器上&#xff0c;并给每个项目成员分配一个账号。这时候访问代码&#xff0c;可以通过 Samba 服务器将代码目录挂载到本地&#xff0c;再通过 VSCode 去打开服务器的代码。 但是&#xff0c;这时候我经常碰到通过 …

vue项目 解决el-table自适应高度,vue页面不显示多条滚动条,超出的部分让el-table内部出现滚动条

一、需求 后台管理系统&#xff1a;最常见的页面都是由—>左侧菜单、头部tabView页签、主体数据渲染页面&#xff08;AppMain&#xff09;&#xff1b;而一般AppMain页面又分为&#xff1a; 搜索区域、table数据&#xff08;分页&#xff09;&#xff0c;可能也会存在底部&a…

编译原理实验1——词法分析器的Java实现

一、 实验目的 设计并实现一个PL/0语言(或其它语言的子集,如C语言的子集)的词法分析程序&#xff0c;加深对词法分析原理的理解。 二、实验原理 词法分析是从左向右扫描每行源程序的符号&#xff0c;拼成单词&#xff0c;换成统一的机内表示形式——TOKEN字&#xff0c;送给…

由浅入深MFC学习摘记--第四部分上

目录 第八章 Document-View结构为什么使用Document-View结构DocumentviewDocumentFrameDocumentTemplateCDocTemplate、CDocument、CView、CFrameWnd 之间的关系 Document - 数据结构设计容器选用范例修改线条与点 View-重绘与编辑代码修改View 的重绘鼠标消息处理类向导 Seria…

手推FlinkML2.2(三)

SQLTransformer&#xff08;SQL转换器&#xff09;是一种数据预处理方法&#xff0c;允许您使用SQL语句对数据进行转换和操作。SQL转换器通常用于数据清洗、特征工程和数据聚合等任务&#xff0c;以提高数据分析和机器学习模型的性能。它可以与各种数据处理和存储系统&#xff…

后端大厂面试总结大全六

目录&#xff1a; 1、Transactional注解控制事务有哪些不生效的场景2、MySQL的优化 1、Transactional注解控制事务有哪些不生效的场景 数据库引擎不支持事务数据源没有配置事务管理器没有被spring管理方法不是public的同一个类中方法调用&#xff0c;导致Transactional失效 举…