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 {@Idprivate 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 {@Autowiredprivate EmployeeRepository repository;@Testpublic 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());}@Testpublic 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());}@Testpublic 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 {@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Testpublic 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查询 

    @Testpublic 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排序

    @Testpublic 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

2.5进行文本高亮

可以使用HighlightBuilder 类来设置查询结果文本高亮

 @Testpublic void testHighlight() {String PRE_TAG = "<mark>";String POST_TAG = "</mark>";HighlightBuilder.Field titleField = new HighlightBuilder.Field("name");titleField.preTags(PRE_TAG);titleField.postTags(POST_TAG);NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.matchQuery("name", "李"));nativeSearchQueryBuilder.withQuery(boolQueryBuilder);nativeSearchQueryBuilder.withHighlightFields(titleField);SearchHits<Employee> search = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), Employee.class);Map<String, List<String>> files = search.getSearchHits().stream().findFirst().get().getHighlightFields();Assert.assertFalse(CollectionUtils.isEmpty(files));}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CKA模拟题】查询消耗CPU最多的Pod

题干 For this question, please set this context (In exam, diff cluster name) 对于此问题&#xff0c;请设置此上下文&#xff08;在考试中&#xff0c;diff 集群名称&#xff09; kubectl config use-context kubernetes-adminkubernetesFind the pod that consumes the …

算法笔记 连载中。。。

HashMap&#xff08;会根据key值自动排序&#xff09; HashMap<String, Integer> hash new HashMap<>() hash.put(15,18) hash.getOrDefault(ts, -1) //如果ts(key)存在&#xff0c;返回对应的value 否则返回-1 hashMap1.get(words1[i])1会报错&#xff0c;因…

基于物联网的智能农业种植管理系统设计

传统农业种植中对农作物种植环境的掌控更多的是依靠个人的经验。科学技术的进步可逐步改变人们对农作物种植环境变化的感知&#xff0c;因此&#xff0c;以物联网技术对嵌入式、传感及控制等技术的整合而实现一款可对农作物种植环境中是否下雨、土壤湿度等变化施以监测并完成自…

css 各种方位计算 - client系列 offset系列 scroll系列 x/y 系列

offset系列 HTMLElement.offsetTop - Web API 接口参考 | MDN 一文读懂offsetHeight/offsetLeft/offsetTop/offsetWidth/offsetParent_heightoffset-CSDN博客 client系列 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop-CSDN博客 scroll系列 秒懂scr…

C++第五弹---类与对象(二)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 类与对象 1、类对象模型 1.1、如何计算类对象的大小 1.2、类对象的存储方式猜测 1.3、结构体内存对齐规则 2、this指针 2.1、this指针的引出 2.2…

【SQL Server】实验八 综合设计

1 实验目的 了解和掌握数据库设计的有关理论和方法。可以灵活运用数据库设计方法设计一个中小型规模的数据库。 2 实验内容 2.1 数据库概念模型设计 进行需求分析。设计数据库概念模型&#xff0c;画出E-R图。 2.2 数据库逻辑模型设计 根据数据库概念模型设计数据库的逻…

带你玩转Python爬虫(爬取电影资源篇)

时隔多日不见&#xff0c;今天咱们再来玩玩爬虫&#xff01; 目录 环境准备 网页解析 提取电影信息 提取下载链接 完整代码示例 爬取电影是一个很基本的爬虫习题&#xff0c;学好python爬虫&#xff0c;受益终身~ 环境准备 OK啊首先&#xff0c;我们需要准备好Python的开…

堆排序

在上一篇博客中讲解了堆&#xff0c;现在来讲讲基于堆实现的排序&#xff0c;即堆排序。 要用堆排序&#xff0c;首先我们需要先建堆&#xff0c;建堆有两种方法&#xff1a;向上调整法建堆和向下调整法建堆。接下来我们分析这两种方法的时间复杂度。 向上调整法&#xff1a;…

xss.haozi.me靶场“0x0B-0x12”通关教程

君衍. 一、0x0B 实体编码绕过二、0x0C script绕过三、0x0D 注释绕过四、0X0E ſ符号绕过五、0x0F 编码解码六、0x10 直接执行七、0x11 闭合绕过八、0x12 闭合绕过 XSS-Labs靶场“1-5”关通关教程 XSS-Labs靶场“6-10”关通关教程 Appcms存储型XSS漏洞复现 XSS-Labs靶场“11-13、…

Java8中Stream流API最佳实践Lambda表达式使用示例

文章目录 一、创建流二、中间操作和收集操作筛选 filter去重distinct截取跳过映射合并多个流是否匹配任一元素&#xff1a;anyMatch是否匹配所有元素&#xff1a;allMatch是否未匹配所有元素&#xff1a;noneMatch获取任一元素findAny获取第一个元素findFirst归约数值流的使用中…

【C#】int+null=null

C#语法&#xff0c;这玩意不报错 intnullnull&#xff0c;有点不合逻辑 (Int32)(bizRepair0rder.CreateTime. Value - regues.Mlodifylime.Value).TotalMinutes (Int32)(bizRepair0rder.CreateTime. Value - reques.llodifylime.Value).TotalMinutes nullstring是引用类型&…

基于SpringBoot框架实现的B2B平台的医疗病历交互系统

采用技术 基于SpringBoot框架实现的B2B平台的医疗病历交互系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员角色 医院管理 医院注册 医院文…