spring-boot操作elasticsearch

一、环境准备

springboot与elasticsearch的更新都非常快,为了避免兼容性问题,要注意下选择的版本问题。具体的可参考官网 -->  springboot与elasticsearch版本兼容性

1.1导入依赖

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.7.18</version>
  </dependency>
  <dependency>
      <groupId>jakarta.json</groupId>
      <artifactId>jakarta.json-api</artifactId>
      <version>2.0.1</version>
   </dependency>
</dependencies>
 

1.2application.properties文件配置

spring.elasticsearch.rest.uris=http://localhost:9200
spring.elasticsearch.rest.username=dev
spring.elasticsearch.rest.password=123456

1.3创建实体对象

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;


@Document(indexName = "employee")
@Data
public class Employee {

    @Id
    private int id;

    @Field(name = "name")
    private String name;

    @Field(name = "addr", type = FieldType.Keyword)
    private String addr;

}

该实体类加上@Document注解之后,程序启动后就会自动向ED发送创建索引的请求(若没有则创建)。

1.4创建Repository接口

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface EmployeeRepository extends ElasticsearchRepository<Employee, Integer> {
}

1.5Crud测试案例

使用该接口可方便对索引进行增删查改。例子比较简单,我们直接写个单元测试。代码如下:

import gamecontext.admin.elasticsearch.Employee;
import gamecontext.admin.elasticsearch.EmployeeRepository;
import org.junit.Assert;
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.test.context.junit4.SpringRunner;

@SpringBootTest()
@RunWith(SpringRunner.class)
public class ElasticsearchTest {

    @Autowired
    private EmployeeRepository repository;

    @Test
    public void testSave() {
        Employee p = new Employee();
        p.setId(3);
        p.setAddr("北京");
        p.setName("Tim");
        repository.save(p);
        Assert.assertEquals("Tim", repository.findById(3).get().getName());
    }

    @Test
    public void testDelete() {
        Employee p = new Employee();
        p.setId(4);
        p.setAddr("北京");
        p.setName("Tim");
        repository.save(p);
        repository.deleteById(4);
        Assert.assertFalse(repository.findById(4).isPresent());
    }

    @Test
    public void testUpdate() {
        Employee p = repository.findById(3).get();
        p.setName("南京");
        repository.save(p);
        Assert.assertEquals(repository.findById(3).get().getName(), "南京");
    }

}

二、使用QueryBuilder进行文档的复杂查询

ElasticsearchRepository只能对文档进行简单的增删查改,如果遇到复杂的全文搜索,则需要借助QueryBuilder和ElasticsearchRestTemplate相关API

2.1数据准备

往索引插入3条文档,数据如下

2.2进行must查询 

import gamecontext.admin.elasticsearch.Employee;
import gamecontext.admin.elasticsearch.EmployeeRepository;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Assert;
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.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest()
@RunWith(SpringRunner.class)
public class ElasticsearchTest2 {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

   @Test
    public void testMust() {
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.matchQuery("name", "李"))
                .must(QueryBuilders.matchQuery("name", "四"));
        nativeSearchQueryBuilder.withQuery(boolQueryBuilder);

        SearchHits<Employee> hits = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), Employee.class);
        Assert.assertTrue(hits.stream().findFirst().isPresent());
        Assert.assertEquals(hits.stream().findFirst().get().getContent().getName(), "李四");
    }
}

等效的Kibana命令

2.3进行range查询 

    @Test
    public void testRange() {
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        RangeQueryBuilder builder = QueryBuilders.rangeQuery("age").lte(20).gte(10);
        nativeSearchQueryBuilder.withQuery(builder);
        SearchHits<Employee> hits = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), Employee.class);
        Assert.assertEquals(2, hits.getTotalHits());
    }

等效的Kibana命令

2.4进行sort排序

    @Test
    public void testSort() {
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
        nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC));
//                .withSort(SortBuilders.fieldSort("name").order(SortOrder.ASC));
        SearchHits<Employee> hits = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), Employee.class);
        Employee p1 = hits.stream().findFirst().get().getContent();
        List<SearchHit<Employee>> list = hits.stream().collect(Collectors.toUnmodifiableList());
        Assert.assertTrue(list.get(0).getContent().getAge()>list.get(1).getContent().getAge());
        Assert.assertTrue(list.get(1).getContent().getAge()>list.get(2).getContent().getAge());
    }

 等效的Kibana命令

默认情况下,text类型的字段是不能排序的,否则会报以下异常,

Caused by: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]]

翻译如下:

默认情况下,文本字段禁用字段数据。在[region]上设置fielddata=true,以便通过取消反转索引将fielddata加载到内存中。请注意,这可能会占用大量内存。

解决方法:

  • 将name字段设置为keyword类型
  • 将name字段的fielddata()为true

 

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

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

相关文章

挖掘内容资讯App流量价值,Xinstall传参安装技术引领行业变革

在移动互联网时代&#xff0c;内容资讯App已经成为人们获取信息的重要途径。然而&#xff0c;随着用户量的不断增长和业务的不断拓展&#xff0c;如何有效地挖掘流量价值&#xff0c;成为了摆在众多内容资讯App面前的一大难题。而传参安装技术的出现&#xff0c;为这一难题的解…

Web——HTML

一.HTML概述 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器来解析。 二.…

2024 遗传编程实战(一)基因实战

2024 遗传编程实战&#xff08;一&#xff09;基因实战 文章目录 2024 遗传编程实战&#xff08;一&#xff09;基因实战一、遗传编程实战介绍1、遗传编程简介2、遗传编程和进化论的关系3、遗传编程过程解释 二、基于遗传编程的例子1、实战题目介绍2、遗传算法的伪代码3、遗传实…

无人机机载频谱监测方案助力空中频谱监测与干扰排查

作者介绍 一、方案背景 频谱资源是通信最重要的资产之一&#xff0c;随着宽带无线业务的快速增长&#xff0c;对频率资源的需求大幅增加。未来频率资源的供需矛盾将非常突出&#xff0c;空中频谱环境也会越来越复杂&#xff0c;对于工程师来说&#xff0c;在复杂的电磁环境条件…

视频监控/云存储EasyCVR视频融合平台设备增删改操作不生效是什么原因?

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xf…

C++开发基础——类模板

一&#xff0c;基础定义 类模板是用来生成类的蓝图&#xff0c;是一种创建类的方式&#xff0c;同一套类模板可以生成很多种不同的类。 编译器基于类模板生成的每个类被称为类模板的实例。 第一次使用模板类型声明变量时&#xff0c;会创建类模板的一个实例&#xff0c; 以后…

3D Gaussian Splatting for Real-Time Radiance Field Rendering(慢慢啃,还是挺复杂的)

三个关键要素 从相机配准的过程中得到的稀疏点云开始&#xff0c;使用3D Gaussian表示场景; 3D Gaussian: 是连续体积辐射场能够防止不必要的空空间优化。对 3D Gaussion进行交叉优化和密度控制: 优化各向异性血方差对场景精确表示。使用快速可视感知渲染算法来进行快速的训练…

最好用的流程编辑器bpmn-js系列之基本使用

BPMN&#xff08;Business Process Modeling Notation&#xff09;是由业务流程管理倡议组织BPMI&#xff08;The Business Process Management Initiative&#xff09;开发的一套标准的业务流程建模符号规范。其目的是为用户提供一套容易理解的标准符号&#xff0c;这些符号作…

Java代码审计工程师直播第六期

本期直播课程将深入探讨Java代码审计的关键概念和技术。涵盖课题包括安全漏洞分析、代码审查方法、常见漏洞案例分析等。学员将通过实例掌握代码审计实战技能&#xff0c;提升对Java应用程序安全的认知和技能水平。 课程大小&#xff1a;6.1G 课程下载&#xff1a;https://do…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的稻田虫害检测系统详解(深度学习+Python代码+UI界面+训练数据集)

摘要&#xff1a;本篇文章深入探讨了如何利用深度学习技术开发一个用于检测稻田虫害的系统&#xff0c;并且分享了完整的实现过程和资源代码下载。该系统采用了当前的YOLOv8、YOLOv7、YOLOv6、YOLOv5算法&#xff0c;对其进行了性能对比&#xff0c;包括mAP、F1 Score等关键指标…

java中xml概述

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

Linux认识与学习BASH

Linux认识与学习BASH 认识BASH这个Shellshell是什么系统的合法shell与/etc/shells功能Bash Shell的功能查询命令是否为Bash shell 的内置命令(type)命令的执行与快速编辑按钮 shell的变量功能什么是变量&#xff1f;变量的使用与设置&#xff1a;echo、变量设置规则、unset环境…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Slider)

滑动条组件&#xff0c;通常用于快速调节设置值&#xff0c;如音量调节、亮度调节等应用场景。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Slider(options?: SliderOption…

Linux:时间指令 - cal date

Linux&#xff1a;时间指令 - cal & date date指令cal指令 date指令 date用于以指定格式显示时间 我们先看看直接输入date指令的效果&#xff1a; [hxyiZ2zehtehrgzt3wqccrpyfZ CSDN]$ date Tue Mar 12 21:38:01 CST 2024直接输入date指令&#xff0c;得到了以 星期 月 日…

RANDOMIZE-IN-PLACE随机排列算法

给定一个长度为 n n n的数组&#xff0c;如何构造出一个随机排列呢&#xff1f;《算法导论》给了我们一个名为RANDOMIZE-IN-PLACE的随机算法&#xff0c;该算法在数组原址上进行排序&#xff0c;时间复杂度为 O ( n ) O(n) O(n)。下面本文将介绍RANDOMIZE-IN-PLACE的设计思想及…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水下目标检测系统(深度学习模型+UI界面+训练数据集)

摘要&#xff1a;本研究详述了一种采用深度学习技术的水下目标检测系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别水…

HarmonyOS NEXT应用开发之多层嵌套类对象监听

介绍 本示例介绍使用Observed装饰器和ObjectLink装饰器来实现多层嵌套类对象属性变化的监听。 效果图预览 使用说明 加载完成后显示商品列表&#xff0c;点击刷新按钮可以刷新商品图片和价格。 实现思路 创建FistGoodsModel类&#xff0c;类对象是用Observed修饰的类Secon…

Linux运维:磁盘分区与挂载详解

Linux运维&#xff1a;磁盘分区与挂载详解 1、磁盘分区的原理2、查看系统中所有的磁盘设备及其分区信息3、进行磁盘分区&#xff08;对于sdb新磁盘&#xff09;4、格式化分区5、挂载分区&#xff08;临时挂载、永久挂载&#xff09;6、取消挂载分区7、删除分区 &#x1f496;Th…

pytorch激活函数

目录 1.激活函数由来2. 常见激活函数2.1 Sigmoid2.2 Tanh2.3 relu 1.激活函数由来 科学家对青蛙的神经元进行研究的时候发现&#xff0c;只有超过一定的阈值青蛙才会有反应&#xff0c;因此不能将多个输入做简单的加权平均&#xff0c;而需要一个阶梯函数也就是激活函数&#…

软考75-上午题-【面向对象技术3-设计模式】-设计模式的要素

一、题型概括 上午、下午题&#xff08;试题五、试题六&#xff0c;二选一&#xff09; 每一个设计模式都有一个对应的类图。 二、23种设计模式 创建型设计模式&#xff1a;5 结构型设计模式&#xff1a;7 行为设计模式&#xff1a;11 考试考1-2种。 三、设计模式的要素 3…