二.springBoot项目集成ElasticSearch及使用

二.springBoot项目集成ElasticSearch及使用

  • 1.依赖引入
  • 2.ElasticSearch常见用法

1.依赖引入

<!--elasticsearch搜索引擎-->
<!--高版本7.0后TransportClient已被淘汰,用rest-high-level-client代替-->
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.6.2</version>
</dependency>
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.6.2</version><scope>compile</scope>
</dependency>
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.6.2</version><scope>compile</scope>
</dependency>

2.ElasticSearch常见用法

package com.lmy.elasticSearchTest;import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.lmy.elasticSearchTest.pojo.User;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;/*** es 7.6.x API测试*/
public class ElasticSearchApiTest {private RestHighLevelClient restHighLevelClient;// 集群地址,多个用,隔开@Value("${es.hosts}")private String hosts = "127.0.0.1";// 使用的端口号@Value("${es.port}")private int port = 9200;@Value("${es.userName}")private String userName = "";@Value("${es.password}")private String password = "";// 使用的协议private static String schema = "http";// 连接超时时间private static int connectTimeOut = 1000;// 连接超时时间private static int socketTimeOut = 30000;// 获取连接的超时时间private static int connectionRequestTimeOut = 500;@Beforepublic void init() throws IOException {/*// 单机模式restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));*/// 集群模式/*用户认证对象*/final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();/*设置账号密码*/credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));RestClientBuilder builder = RestClient.builder(this.getHostList().toArray(new HttpHost[0])).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);}});// 异步httpclient连接延时配置builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {@Overridepublic RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {requestConfigBuilder.setConnectTimeout(connectTimeOut);requestConfigBuilder.setSocketTimeout(socketTimeOut);requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);return requestConfigBuilder;}});restHighLevelClient = new RestHighLevelClient(builder);}public ArrayList<HttpHost> getHostList() {ArrayList<HttpHost> hostList = new ArrayList<>();String[] hostStrs = hosts.split(",");for (String host : hostStrs) {hostList.add(new HttpHost(host, port, schema));}return hostList;}/*** 索引操作* @throws IOException*/// 测试索引的创建 Request@Testpublic void testCreateIndex() throws IOException {// 创建索引的请求CreateIndexRequest request = new CreateIndexRequest("api_test");//CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);System.out.println(response);restHighLevelClient.close();}// 测试索引是否存在@Testpublic void testIndexIsExists() throws IOException {GetIndexRequest request = new GetIndexRequest("api_test");boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists);restHighLevelClient.close();}// 测试索引删除@Testpublic void testDeleteIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("blog");AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);//查看索引是否存在System.out.println(response.isAcknowledged());restHighLevelClient.close();}/*** 文档操作*/// 测试添加文档@Testpublic void testAddDocument() throws IOException {// 创建一个User对象User user = new User("wangmazi", 99);// 创建请求IndexRequest request = new IndexRequest("api_test");// 制定规则 PUT /api_test/_doc/1request.id("3");//设置文档idrequest.timeout(TimeValue.timeValueMillis(1000));//设置超时时间request.source(JSON.toJSONString(user), XContentType.JSON);//设置添加的文档内容// 客户端发送请求,获取响应的结果IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);System.out.println(response);restHighLevelClient.close();}// 测试获得文档信息@Testpublic void testGetDocument() throws IOException {GetRequest request = new GetRequest("api_test","_all", "1");GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);// 打印文档内容System.out.println(response.getSourceAsString());System.out.println(request);restHighLevelClient.close();}// 获取文档,判断是否存在 get /api_test/_doc/1@Testpublic void testDocumentIsExists() throws IOException {GetRequest request = new GetRequest("api_test","_all", "1");// 不获取返回的 _source的上下文了request.fetchSourceContext(new FetchSourceContext(false));request.storedFields("_none_");boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);System.out.println(exists);restHighLevelClient.close();}// 测试更新文档内容@Testpublic void testUpdateDocument() throws IOException {UpdateRequest request = new UpdateRequest("api_test","_all", "1");User user = new User("lmy", 25);request.doc(JSON.toJSONString(user), XContentType.JSON);UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT);System.out.println(update.status());restHighLevelClient.close();}// 测试删除文档@Testpublic void testDeleteDocument() throws IOException {DeleteRequest request = new DeleteRequest("api_test","_all", "3");request.timeout("1s");DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);System.out.println(response.status());restHighLevelClient.close();}// 查询// SearchRequest 搜索请求// SearchSourceBuilder 条件构造// HighlightBuilder 高亮// TermQueryBuilder 精确查询// MatchAllQueryBuilder// xxxQueryBuilder .../*** QueryBuilders:termQuery(精确查询),matchQuery(匹配查询),rangeQuery(范围查询),multiMatchQuery(多个字段上进行匹配查询),wildcardQuery(通配符查询,支持 * 和 ? 通配符),existsQuery(检查文档中是否存在某个字段),* BoolQueryBuilder:复合查询 must(AND)、should(OR)、must_not(NOT)、filter(过滤条件 必须满足 filter 子句中的所有条件)*/@Testpublic void testSearch() throws IOException {List<User> userList = new ArrayList<>();// 1.创建查询请求对象 参数为索引名(库名)SearchRequest request = new SearchRequest("api_test");// 2.构建搜索条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// (1)查询条件 使用QueryBuilders工具类创建// 精确查询TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "lmy");// 匹配查询MatchAllQueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "lmy");// 范围查询RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");rangeQueryBuilder.gte("17");rangeQueryBuilder.lte("20");// 复合查询 must、should、must_not、filterBoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("name", "lmy"));boolQueryBuilder.must(QueryBuilders.rangeQuery("age").gte("17").lte("20"));// (2)其他<可有可无>:(可以参考 SearchSourceBuilder 的字段部分)// 设置高亮searchSourceBuilder.highlighter(new HighlightBuilder());// 分页searchSourceBuilder.from(0);searchSourceBuilder.size(3);searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));// (3)条件投入searchSourceBuilder.query(boolQueryBuilder);// 3.添加条件到请求request.source(searchSourceBuilder);// 4.客户端查询请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 5.查看返回结果SearchHits hits = response.getHits();System.out.println(JSON.toJSONString(hits));System.out.println("========================");for (SearchHit h:hits.getHits()) {System.out.println(h.getSourceAsMap());User user = BeanUtil.mapToBean(h.getSourceAsMap(), User.class,true);userList.add(user);}System.out.println(userList);restHighLevelClient.close();}// 特殊的,真的项目一般会 批量插入数据@Testpublic void testBulk() throws IOException {BulkRequest request = new BulkRequest();request.timeout("10s");ArrayList<User> list = new ArrayList<>();list.add(new User("lmy-1",18));list.add(new User("lmy-2",19));list.add(new User("lmy-3",20));list.add(new User("lmy-4",21));// 批量请求处理for (User u :list) {request.add(new IndexRequest("api_test").source(JSON.toJSONString(u),XContentType.JSON));}BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);System.out.println(bulk.status());restHighLevelClient.close();}
}

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

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

相关文章

微服务多模块构建feign项目过程与一些报错(2025详细版)

目录 1.eureka-server的注意事项 2.eureka-feign的注意事项 3.多模块构建feign项目过程 3.1创建父项目 3.2创建子项目eureka-server 3.3创建子项目eureka-provider 3.4创建子项目eureka-feign 3.5运行 给个点赞谢谢 1.eureka-server的注意事项 eureka-server的yml文件…

第十一届 蓝桥杯 嵌入式 省赛

一、分析 本届的风格又变了一番&#xff0c;但是难度也降低了些。 又是考察了 PWM 和 ADC。 第八、九届也考察了 PWM。建议先复习这两届&#xff0c;再回来模拟。 LCD的显示也提了额外的要求。 1. 功能概述 电位器 R37 输出的模拟电压信号 PA6输出频率固定&#xff0c;占…

小试牛刀-抽奖程序

编写抽奖程序 需求&#xff1a;设计一个抽奖程序&#xff0c;点击抽奖按钮随机抽取一个名字作为中奖者 目标&#xff1a;了解项目结构&#xff0c;简单UI布局&#xff0c;属性方法、事件方法&#xff0c;程序运行及调试 界面原型 ​ 待抽奖&#xff1a; 点击抽奖按钮&#x…

代码随想录算法训练营day2(数组)

华子目录 长度最小的子数组思路 螺旋矩阵思路总结 长度最小的子数组 https://leetcode.cn/problems/minimum-size-subarray-sum/ 思路 使用滑动窗口&#xff0c;left表示滑动窗口的起始点&#xff0c;right表示滑动窗口的终点 class Solution:def minSubArrayLen(self, targ…

6.1 GitHub亿级数据采集实战:双通道架构+三级容灾设计,破解API限制与反爬难题

GitHub 项目数据获取功能设计与实现 关键词:GitHub API 集成、网页爬虫开发、数据存储设计、定时任务调度、异常处理机制 1. 数据获取架构设计 采用双通道数据采集策略,同时使用 GitHub 官方 API 和网页爬虫技术确保数据完整性: #mermaid-svg-XUg7xhHrzFAozG4J {font-fami…

设计模式(结构型)-桥接模式

目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域&#xff0c;随着系统规模和复杂性的不断攀升&#xff0c;如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…

Go 微服务框架 | 中间件

文章目录 定义中间件前置中间件后置中间件路由级别中间件 定义中间件 中间件的作用是给应用添加一些额外的功能&#xff0c;但是不会影响原有应用的编码方式&#xff0c;想用的时候直接添加&#xff0c;不想用的时候也可以轻松去除&#xff0c;实现所谓的可插拔。中间件的实现…

leetcode 198. House Robber

本题是动态规划问题。 第一步&#xff0c;明确并理解dp数组以及下标的含义 dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额&#xff0c;具体怎么偷这里不考虑&#xff0c;第i1号及之后的房间也不考虑。换句话说&#xff0c;dp[i]也就是只考虑[0,i]号…

掌趣科技前端面试题及参考答案

你使用 Vue 的频率如何,用得比较多吗? 在前端开发工作中,我对 Vue 的使用较为频繁。Vue 作为一款轻量级、易于上手且功能强大的前端框架,在众多项目里都发挥着重要作用。 在日常的项目里,Vue 的组件化开发特性为我带来了极大的便利。组件化能够将页面拆分成多个小的、可复…

深入解析Python爬虫技术:从基础到实战的功能工具开发指南

一、引言:Python 爬虫技术的核心价值 在数据驱动的时代,网络爬虫作为获取公开数据的重要工具,正发挥着越来越关键的作用。Python 凭借其简洁的语法、丰富的生态工具以及强大的扩展性,成为爬虫开发的首选语言。根据 Stack Overflow 2024 年开发者调查,68% 的专业爬虫开发者…

CSS 笔记——Flexbox(弹性盒布局)

目录 1. Flex 容器与 Flex 项目 2. 主轴与交叉轴 3. Flex 容器的属性 display flex-direction justify-content align-items align-content flex-wrap 4. Flex 项目的属性 flex-grow flex-shrink flex-basis flex align-self 5. Flexbox 的优点 6. Flexbox 的…

Java学习手册:Java反射与注解

Java反射&#xff08;Reflection&#xff09;和注解&#xff08;Annotation&#xff09;是Java语言中两个强大的特性&#xff0c;它们在框架开发和复杂应用中扮演着重要角色。反射允许程序在运行时检查和操作类、对象、接口、字段和方法&#xff0c;而注解则提供了一种元数据形…

JavaWeb遇到的问题汇总

问题一&#xff1a;&#xff08;键值对最后一项没有逗号&#xff09; 在JSON字符串转自定义对象和自定义对象转JSON字符串时&#xff1a; 如图所示&#xff1a;若忘记删除键值对的最后一项没有逗号时&#xff0c;则下一句转换不会生效&#xff0c;应该删除最后一项的逗号。 解…

模板引擎语法-变量

模板引擎语法-变量 文章目录 模板引擎语法-变量&#xff08;一&#xff09;在Django框架模板中使用变量的代码实例&#xff08;二&#xff09;在Django框架模板中使用变量对象属性的代码实例&#xff08;三&#xff09;在Django框架模板中使用变量显示列表 &#xff08;一&…

AUTO-RAG: AUTONOMOUS RETRIEVAL-AUGMENTED GENERATION FOR LARGE LANGUAGE MODELS

Auto-RAG&#xff1a;用于大型语言模型的自主检索增强生成 单位&#xff1a;中科院计算所 代码&#xff1a; https://github.com/ictnlp/Auto-RAG 拟解决问题&#xff1a;通过手动构建规则或者few-shot prompting产生的额外推理开销。 贡献&#xff1a;提出一种以LLM决策为中…

Python 基础语法汇总

Python 语法 │ ├── 基本结构 │ ├── 语句&#xff08;Statements&#xff09; │ │ ├── 表达式语句&#xff08;如赋值、算术运算&#xff09; │ │ ├── 控制流语句&#xff08;if, for, while&#xff09; │ │ ├── 定义语句&#xff08;def…

一文详解ffmpeg环境搭建:Ubuntu系统ffmpeg配置nvidia硬件加速

在Ubuntu系统下安装FFmpeg有多种方式,其中最常用的是通过apt-get命令和源码编译安装。本文将分别介绍这两种方式,并提供安装过程。 一、apt-get安装 使用apt-get命令安装FFmpeg是最简单快捷的方式,只需要在终端中输入以下命令即可: # 更新软件包列表 sudo apt-get updat…

Android 14 、15动态申请读写权限实现 (Java)

在 Android 14、15 中&#xff0c;Google 进一步优化了存储权限系统&#xff0c;特别是写权限的管理。以下是完整的 Java 实现方案&#xff1a; 1. AndroidManifest.xml 声明权限 <!-- Android 14 存储权限 --> <uses-permission android:name"android.permiss…

小刚说C语言刷题——第23讲 字符数组

前面&#xff0c;我们学习了一维数组和二维数组的概念。今天我们学习一种特殊的数组&#xff0c;字符数组。 1.字符数组的概念 字符数组就是指元素类型为字符的数组。字符数组是用来存放字符序列或者字符串的。 2.字符数组的定义及语法 char ch[5]; 3.字符数组的初始化及赋…

用AI生成系统架构图

DeepSeek+Drawio+SVG绘制架构图-找到一种真正可行实用的方法和思路 1、使用DeepSeek生成SVG文件,导入drawio工具的方法 🔥 问题根源分析 错误现象: • 导入时报错包含 data:image/SVG;base64 和 %20 等 URL 编码字符 • 代码被错误转换为 Base64 格式(适用于网页嵌入,但…