当前位置: 首页 > article >正文

ES基本操作(Java API)

1. 导入restClient依赖

     <!--     es      --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency>
 <!--     fastjson     --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.39</version> <!-- 使用最新稳定版 --></dependency>

2. 了解ES核心客户端API

核心区别对比

特性RestHighLevelClientRestClient
定位高级客户端(封装常用操作,推荐使用)底层HTTP客户端(更灵活,更复杂)
API风格面向对象(如 IndexRequestSearchRequest基于HTTP请求构建(如 RequestResponse
维护状态官方已停止维护(ES 7.15+)仍维护(但推荐迁移到新客户端)
依赖关系基于 RestClient 实现是 RestHighLevelClient 的底层依赖
适用场景快速开发标准功能需要自定义请求或访问未封装API

3. 将RestHighLevelClient注册成Bean

package com.example.demo.config;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ElasticSearchConfig {public static final String HOST = "127.0.0.1"; // es地址public static final int PORT = 9200; // es端口/*** 创建RestClient对象* @return*/@Beanpublic RestHighLevelClient restClient() {return new RestHighLevelClient(RestClient.builder(new HttpHost(HOST, PORT)));}
}

4. 索引库基本操作

1. 创建索引库

创建包和类用于保存索引结构:constants.HotelConstants

package com.example.demo.constants;public class HotelConstants {public static final String MAPPER_TEMPLATE_USER = "{\n" +"  \"settings\": {\n" +"    \"number_of_shards\": 3,\n" +"    \"number_of_replicas\": 1,\n" +"    \"analysis\": {\n" +"      \"analyzer\": {\n" +"        \"ik_smart\": {\n" +"          \"type\": \"custom\",\n" +"          \"tokenizer\": \"ik_smart\"\n" +"        },\n" +"        \"ik_max_word\": {\n" +"          \"type\": \"custom\",\n" +"          \"tokenizer\": \"ik_max_word\"\n" +"        }\n" +"      }\n" +"    }\n" +"  },\n" +"  \"mappings\": {\n" +"    \"dynamic\": \"strict\",\n" +"    \"properties\": {\n" +"      \"id\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"username\": {\n" +"        \"type\": \"text\",\n" +"        \"analyzer\": \"ik_max_word\",\n" +"        \"fields\": {\n" +"          \"keyword\": {\n" +"            \"type\": \"keyword\",\n" +"            \"ignore_above\": 256\n" +"          }\n" +"        },\n" +"        \"copy_to\": \"combined_search\"\n" +"      },\n" +"      \"password\": {\n" +"        \"type\": \"keyword\",\n" +"        \"index\": false\n" +"      },\n" +"      \"phone\": {\n" +"        \"type\": \"keyword\",\n" +"        \"ignore_above\": 20\n" +"      },\n" +"      \"createTime\": {\n" +"        \"type\": \"date\",\n" +"        \"format\": \"yyyy-MM-dd HH:mm:ss||epoch_millis\"\n" +"      },\n" +"      \"updateTime\": {\n" +"        \"type\": \"date\",\n" +"        \"format\": \"yyyy-MM-dd HH:mm:ss||epoch_millis\"\n" +"      },\n" +"      \"status\": {\n" +"        \"type\": \"integer\",\n" +"        \"null_value\": 1\n" +"      },\n" +"      \"balance\": {\n" +"        \"type\": \"integer\",\n" +"        \"null_value\": 0\n" +"      },\n" +"      \"combined_search\": {\n" +"        \"type\": \"text\",\n" +"        \"analyzer\": \"ik_smart\"\n" +"      }\n" +"    }\n" +"  }\n" +"}";}

 /*** 创建索引库*/@Testpublic void createIndex() throws IOException {// 创建请求,指定索引库名称CreateIndexRequest request = new CreateIndexRequest("user");//执行与数据库相对于的映射JSONCreateIndexRequest source = request.source(HotelConstants.MAPPER_TEMPLATE_USER, XContentType.JSON);// 发送请求//RequestOptions.DEFAULT:默认请求client.indices().create(source, RequestOptions.DEFAULT);}

执行前先确定是否删除user索引库,客户端查询一下如果为空就是删除了

#
GET /user#
DELETE /user

运行测试方法后再次查询


2. 判断索引库是否存在

    /*** 判断索引库是否存在* @throws IOException*/@Testvoid testIndexExists() throws IOException {// 创建请求,指定索引库名称GetIndexRequest request = new GetIndexRequest("user");// 发送请求,判断索引库是否存在boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 打印结果,true表示存在,false表示不存在System.out.println(exists);}

3. 删除索引库

    /*** 删除索引库* @throws IOException*/@Testvoid testDeleteIndex() throws IOException {// 创建请求,指定索引库名称DeleteIndexRequest request = new DeleteIndexRequest("user");// 发送请求client.indices().delete(request, RequestOptions.DEFAULT);}

5. 文档操作

1. 新增文档        

    /*** 新增文档*/@Testpublic void addDoc() throws IOException, JSONException {// 读取数据库数据,发送请求,指定文档内容User user = userService.getById(1);// 创建请求,指定索引库名称IndexRequest indexRequest = new IndexRequest("user").id(user.getId().toString());//转jsonindexRequest.source(JSON.toJSONString(user), XContentType.JSON);// 发送请求client.index(indexRequest, RequestOptions.DEFAULT);}

2. 查询文档

 /*** 查询文档*/@Testpublic void getDoc() throws IOException {// 创建请求,指定索引库名称和文档idGetRequest getRequest = new GetRequest("user", "1");// 发送请求GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);// 打印结果System.out.println(response.getSourceAsString());//转user对象User user = JSON.parseObject(response.getSourceAsString(), User.class);System.out.println(user);}

3. 更新文档

全量更新:重新添加一个包含所有的文档,ES会先将原来的删除再新增

局部更新:添加部分数据(不包括ID),ES会将相关字段值更新                

 /*** 修改文档*/@Testpublic void updateDoc() throws IOException {// 创建请求,指定索引库名称和文档idUser user = userService.getById(1);// 修改数据user.setUsername("admin");// 发送请求UpdateRequest updateRequest = new UpdateRequest("user", user.getId().toString());// 转jsonupdateRequest.doc(JSON.toJSONString(user), XContentType.JSON);// 发送请求client.update(updateRequest, RequestOptions.DEFAULT);}

4. 删除文档

/*** 删除文档*/@Testpublic void deleteDoc() throws IOException {// 创建请求,删除文档id=1DeleteRequest deleteRequest = new DeleteRequest("user").id("1");// 发送请求client.delete(deleteRequest, RequestOptions.DEFAULT);// 打印结果System.out.println("删除成功");}

5. 批处理

 /*** 批处理*/@Testpublic void batchAddDoc() throws IOException {// 创建批处理请求BulkRequest bulkRequest = new BulkRequest();// 获取数据库数据List<User> list = userService.list();// 遍历集合,添加批处理请求for (User user : list) {IndexRequest indexRequest = new IndexRequest("user").id(user.getId().toString());indexRequest.source(JSON.toJSONString(user), XContentType.JSON);bulkRequest.add(indexRequest);}// 发送请求client.bulk(bulkRequest, RequestOptions.DEFAULT);}

6. 全文检索(倒排索引)

GET /item/_search
{"query": {"match": {"name": "莎米特SUMMIT"}}
}

 /*** 搜索* 根据名称使用倒排索引搜索* @throws IOException*/@Testpublic void searchByNameSimple() throws IOException {// 1. 创建搜索请求(指定索引名)SearchRequest request = new SearchRequest("item");// 2. 构建查询条件(name字段匹配"莎米特SUMMIT")SearchSourceBuilder source = new SearchSourceBuilder().query(QueryBuilders.matchQuery("name", "OXLA欧莎2018")) // 基础分词查询.from(0)  // 页码(从0开始).size(100); // 每页条数 默认10// 3. 执行查询SearchResponse response = client.search(request.source(source), RequestOptions.DEFAULT);// 4. 打印结果System.out.println("找到 " + response.getHits().getTotalHits().value + " 条结果:");for (SearchHit hit : response.getHits()) {String name = (String) hit.getSourceAsMap().get("name");System.out.println("ID: " + hit.getId() + " | 名称: " + name);}}

7. 精确查找

 /*** 精确搜索* @throws IOException*/@Testpublic void exactSearch() throws IOException {// 1. 创建搜索请求SearchRequest request = new SearchRequest("item");// 2. 构建精确查询条件SearchSourceBuilder source = new SearchSourceBuilder().query(QueryBuilders.termQuery("category", "拉杆箱")) // 使用.keyword字段.size(5);// 3. 执行查询SearchResponse response = client.search(request.source(source), RequestOptions.DEFAULT);// 4. 处理结果System.out.println("精确匹配结果数: " + response.getHits().getTotalHits().value);for (SearchHit hit : response.getHits()) {System.out.println("ID: " + hit.getId() +"| 分类: "+ hit.getSourceAsMap().get("category")+ " | 名称: " + hit.getSourceAsMap().get("name"));}}

8. Bool Query(复合查询|条件查询)

布尔查询允许组合多个子查询,支持四种逻辑条件:

子句类型说明类比SQL是否影响相关性评分
must必须满足的所有条件(AND逻辑)WHERE a AND b✅ 是
should至少满足一个条件(OR逻辑),可通过minimum_should_match调整WHERE a OR b✅ 是
must_not必须不满足的条件(NOT逻辑)WHERE NOT a❌ 否
filter必须满足的条件,但不影响评分(高性能过滤)WHERE a❌ 否
  @Test  // 标记为测试方法public void testBoolQuerySearch() throws Exception {// ==================== 1. 构建布尔查询 ====================BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()// MUST条件(必须满足):// - 商品名称包含"智能手机"(使用ik_smart分词器).must(QueryBuilders.matchQuery("name", "防蓝光老花眼镜"))// - 商品状态必须为1(精确匹配).must(QueryBuilders.termQuery("status", 1))// SHOULD条件(至少满足一个):// - 品牌是"华为"或"小米"(使用OR逻辑).should(QueryBuilders.matchQuery("brand", "莎米特")).should(QueryBuilders.matchQuery("brand", "黛丝")).minimumShouldMatch(1)  // 至少满足1个should条件// MUST_NOT条件(必须不满足):// - 价格不能高于1000元.mustNot(QueryBuilders.rangeQuery("price").gt(1000))// - 不能是广告商品.mustNot(QueryBuilders.termQuery("isAD", true))// FILTER条件(必须满足,但不影响评分):// - 库存必须大于0.filter(QueryBuilders.rangeQuery("stock").gt(0));// - 创建时间在2024年内(日期范围查询)/*   .filter(QueryBuilders.rangeQuery("create_time").gte("2018-1-1 00:00:00")  // 大于等于起始时间.lte("2024-12-31 23:59:59")) // 小于等于结束时间// - 分类必须是"电子产品"或"数码配件"(精确匹配).filter(QueryBuilders.termsQuery("category.keyword", "老花镜", "数码配件"));*/// ==================== 2. 配置查询请求 ====================SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQuery)      // 设置查询条件.from(0)              // 分页起始位置(第1页).size(10)             // 每页返回10条.sort("price", SortOrder.ASC)      // 按价格升序.sort("_score", SortOrder.DESC);   // 按相关性降序// ==================== 3. 执行查询 ====================SearchResponse response = client.search(new SearchRequest("item")  // 指定索引名.source(sourceBuilder), // 设置查询参数RequestOptions.DEFAULT     // 默认请求选项);// ==================== 4. 处理结果 ====================System.out.println("命中数量: " + response.getHits().getTotalHits().value);// 遍历结果并打印关键信息Arrays.stream(response.getHits().getHits()).forEach(hit -> {System.out.println("\n========== 商品信息 ==========");System.out.println("ID: " + hit.getId());System.out.println("名称: " + hit.getSourceAsMap().get("name"));System.out.println("价格: ¥" + hit.getSourceAsMap().get("price"));System.out.println("品牌: " + hit.getSourceAsMap().get("brand"));System.out.println("库存: " + hit.getSourceAsMap().get("stock"));});

9. 排序

    /*** 排序示例* @throws Exception*/@Testpublic void testSortingExamples() throws Exception {// ==================== 1. 基础排序 ====================// 示例1: 按价格升序排序SearchSourceBuilder priceAscBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).sort("price", SortOrder.ASC)  // 价格从低到高.size(5);// 示例2: 按创建时间降序排序(新品优先)SearchSourceBuilder newFirstBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).sort("createTime", SortOrder.DESC)  // 最新创建的商品在前.size(5);// ==================== 2. 多字段排序 ====================// 示例3: 先按品牌字母序,再按价格降序SearchSourceBuilder multiFieldBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).sort("brand.keyword", SortOrder.ASC)  // 品牌名A-Z排序.sort("price", SortOrder.DESC)         // 同品牌中价格高的在前.size(5);// ==================== 3. 特殊排序 ====================// 示例4: 按库存升序(库存少的优先)SearchSourceBuilder stockSortBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).sort("stock", SortOrder.ASC).size(5);// 示例5: 按销量降序(热销商品在前)SearchSourceBuilder soldSortBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).sort("sold", SortOrder.DESC).size(5);// ==================== 4. 执行并打印结果 ====================// 执行价格排序查询System.out.println("======== 按价格升序排序 ========");SearchResponse priceResponse = client.search(new SearchRequest("item").source(priceAscBuilder),RequestOptions.DEFAULT);printResults(priceResponse);// 执行新品排序查询System.out.println("\n======== 按新品排序(创建时间降序) ========");SearchResponse newResponse = client.search(new SearchRequest("item").source(newFirstBuilder),RequestOptions.DEFAULT);printResults(newResponse);// 执行多字段排序查询System.out.println("\n======== 多字段排序(品牌A-Z,价格高-低) ========");SearchResponse multiResponse = client.search(new SearchRequest("item").source(multiFieldBuilder),RequestOptions.DEFAULT);printResults(multiResponse);}// 打印结果的辅助方法private void printResults(SearchResponse response) {Arrays.stream(response.getHits().getHits()).forEach(hit -> {Map<String, Object> source = hit.getSourceAsMap();System.out.printf("ID: %s | 名称: %-20s | 价格: %-6s | 品牌: %-8s | 库存: %-4s | 创建时间: %s\n",hit.getId(),source.get("name"),source.get("price"),source.get("brand"),source.get("stock"),source.get("createTime"));});}

10. 分页

  1. 四种分页场景实现

    • testBasicPagination(): 首页商品列表,按销量+上新时间排序

    • testCategoryPagination(): 分类页,带精确分类筛选和价格排序

    • testSearchPagination(): 搜索页,支持关键词高亮显示

    • testDeepPagination(): 深度分页,使用search_after技术

/*** 基础分页查询 - 首页商品列表* 特点:按综合排序(销量+上新)*/@Testpublic void testBasicPagination() throws Exception {int page = 1; // 当前页码int size = 10; // 每页数量SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termQuery("status", 1)) // 只查询上架商品.from((page - 1) * size).size(size).sort("sold", SortOrder.DESC) // 按销量降序.sort("create_time", SortOrder.DESC) // 再按创建时间降序.fetchSource(new String[]{"id", "name", "price", "image", "sold"}, null); // 只返回必要字段SearchResponse response = client.search(new SearchRequest("item").source(builder),RequestOptions.DEFAULT);printPageResult(response, page, size);}/*** 分类页分页 - 带筛选条件* 特点:分类筛选+多维度排序*/@Testpublic void testCategoryPagination() throws Exception {int page = 1;int size = 15;String category = "老花镜";BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("category.keyword", category)) // 精确分类匹配.must(QueryBuilders.termQuery("status", 1)) // 上架商品.filter(QueryBuilders.rangeQuery("stock").gt(0)); // 有库存SearchSourceBuilder builder = new SearchSourceBuilder().query(boolQuery).from((page - 1) * size).size(size).sort("price", SortOrder.ASC) // 按价格升序.sort("sold", SortOrder.DESC) // 再按销量降序.fetchSource(new String[]{"id", "name", "price", "image", "brand"}, null);SearchResponse response = client.search(new SearchRequest("item").source(builder),RequestOptions.DEFAULT);printPageResult(response, page, size);}/*** 搜索分页 - 带关键词和高亮* 特点:关键词搜索+结果高亮*/@Testpublic void testSearchPagination() throws Exception {int page = 1;int size = 10;String keyword = "防蓝光";SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.boolQuery().must(QueryBuilders.multiMatchQuery(keyword, "name", "spec")).must(QueryBuilders.termQuery("status", 1))).from((page - 1) * size).size(size).sort("_score", SortOrder.DESC) // 按相关性排序.sort("sold", SortOrder.DESC) // 再按销量排序.highlighter(new HighlightBuilder().field("name").field("spec").preTags("<em>").postTags("</em>")).fetchSource(new String[]{"id", "name", "price", "image"}, null);SearchResponse response = client.search(new SearchRequest("item").source(builder),RequestOptions.DEFAULT);printSearchResult(response, page, size);}/*** 深度分页 - 使用search_after* 特点:适合无限滚动加载*/@Testpublic void testDeepPagination() throws Exception {// 模拟上一页最后一条的排序值Object[] lastSortValues = new Object[]{50000, "2023-05-01T10:00:00.000Z"};int size = 10;SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termQuery("status", 1)).size(size).sort("sold", SortOrder.DESC) // 必须与lastSortValues中的顺序一致.sort("create_time", SortOrder.DESC).searchAfter(lastSortValues).fetchSource(new String[]{"id", "name", "price", "sold"}, null);SearchResponse response = client.search(new SearchRequest("item").source(builder),RequestOptions.DEFAULT);printPageResult(response, -1, size); // -1表示未知页码}// ==================== 辅助方法 ====================/*** 打印分页结果*/private void printPageResult(SearchResponse response, int currentPage, int pageSize) {long totalHits = response.getHits().getTotalHits().value;int totalPages = (int) Math.ceil((double) totalHits / pageSize);if (currentPage > 0) {System.out.printf("\n=== 第 %d 页 (共 %d 页,每页 %d 条) ===\n",currentPage, totalPages, pageSize);} else {System.out.println("\n=== 深度分页结果 ===");}Arrays.stream(response.getHits().getHits()).forEach(hit -> {Map<String, Object> source = hit.getSourceAsMap();System.out.printf("ID: %s | 商品: %-25s | 价格: %-6s | 销量: %-5s | 图片: %s\n",hit.getId(),source.get("name"),source.get("price"),source.get("sold"),source.get("image"));});}/*** 打印搜索结果(带高亮)*/private void printSearchResult(SearchResponse response, int currentPage, int pageSize) {System.out.printf("\n=== 搜索第 %d 页 ===\n", currentPage);Arrays.stream(response.getHits().getHits()).forEach(hit -> {Map<String, Object> source = hit.getSourceAsMap();Map<String, HighlightField> highlights = hit.getHighlightFields();// 获取高亮名称String nameHighlight = highlights.containsKey("name") ?highlights.get("name").fragments()[0].string() :source.get("name").toString();// 获取高亮规格String specHighlight = highlights.containsKey("spec") ?highlights.get("spec").fragments()[0].string() :source.getOrDefault("spec", "").toString();System.out.printf("ID: %s | 商品: %-25s | 价格: %-6s | 规格: %s\n",hit.getId(),nameHighlight,source.get("price"),specHighlight);});}

相关文章:

ES基本操作(Java API)

1. 导入restClient依赖 <!-- es --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency> <!…...

得物官网sign签名逆向分析

打开得物官网&#xff0c;点击鞋类&#xff0c;可以看到请求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…...

Agent的九种设计模式 介绍

Agent的九种设计模式 介绍 一、ReAct模式 原理:将推理(Reasoning)和行动(Acting)相结合,使Agent能够在推理的指导下采取行动,并根据行动的结果进一步推理,形成一个循环。Agent通过生成一系列的思维链(Thought Chains)来明确推理步骤,并根据推理结果执行相应的动作,…...

vivado 时钟IP核(MMCM PLL)

CMT简介 FPGA中时钟管理模块&#xff08;CMT&#xff09;包括PLL和MMCM&#xff0c;用于将时钟倍频(比如输入时钟25M&#xff0c;我们要产生50M时钟)、分频(在不影响系统功能的前提下&#xff0c;较低的工作时钟&#xff0c;能够降低系统功耗)、改变相位偏移或占空比等。 当需要…...

hackmyvm-airbind

收集信息 arp-scan -l nmap -sS -v 192.168.195.162 访问扫描到的ip&#xff0c;直接跳转到登录页面&#xff0c;利用admin/admin弱口令登录 在settings.php中找到一处文件上传&#xff0c;上传一句话木马&#xff0c;上传成功 反弹shell 上传php-reverse-shell.php 抓包&am…...

知识了解03——怎么解决使用npm包下载慢的问题?

1、为什么使用npm下载包会下载的慢 因为使用npm下载包时&#xff0c;默认使用国外服务器进行下载&#xff0c;此时的网络传输需要经过漫长的海底电缆&#xff0c;因此下载速度会变慢 2、怎么解决&#xff1f;&#xff08;切换镜像源&#xff09; &#xff08;1&#xff09;方…...

[晕事]今天做了件晕事71,_GNU_SOURCE

今天碰到一件晕,从别的地方搬运来一段代码,里面有使用in6_pktinfo这个结构体: struct in6_pktinfo pktinfo; 通过搜索发现需要include的头文件就是:netinet/in.h。加上这个头文件,还是出现找不到结构体的错误。最后通过仔细查看头文件,发现,这个结构体定义是在宏判断里…...

【算法数据结构】leetcode37 解数独

37. 解数独 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 题目要求每一行 &#xff0c;每一列&#xff0c;每个3*3 的子框只能出现一次。每个格子的数字范围1-9. 需要遍历每个空格填入可能的数字&#xff0c;并验证符合规则。如果符合就填入&#xff0c;不符…...

招商信诺原点安全:一体化数据安全管理解决方案荣获“鑫智奖”!

近日&#xff0c;“鑫智奖 2025第七届金融数据智能优秀解决方案评选”榜单发布&#xff0c;原点安全申报的《招商信诺&#xff1a;数据安全一体化管理解决方案》荣获「信息安全创新优秀解决方案」。 “鑫智奖第七届金融数据智能优秀解决方案评选”活动由金科创新社主办&#x…...

楼宇自控系统如何为现代建筑打造安全、舒适、节能方案

在科技飞速发展的当下&#xff0c;现代建筑对功能和品质的要求日益提升。楼宇自控系统作为建筑智能化的核心技术&#xff0c;宛如一位智慧的“管家”&#xff0c;凭借先进的技术手段&#xff0c;为现代建筑精心打造安全、舒适、节能的全方位解决方案&#xff0c;让建筑真正成为…...

吃透LangChain(四):消息管理与聊天历史存储

消息存储在内存 下面我们展示一个简单的示例&#xff0c;其中聊天历史保存在内存中&#xff0c;此处通过全局 Python 字典实现。我们构建一个名为 get_session_history 的可调用对象&#xff0c;引用此字典以返回chatMessageHistory实例。通过在运行时向 RunnablewithMessageHi…...

【差分隐私相关概念】瑞丽差分隐私(RDP)命题4

命题4的证明详解&#xff08;分情况讨论&#xff09; 背景与设定 机制&#xff1a; f : D → R f: \mathcal{D} \to \mathcal{R} f:D→R 是由 n n n 个 ϵ \epsilon ϵ-差分隐私机制自适应组合而成。相邻输入&#xff1a; D D D 和 D ′ D D′ 是相邻数据集。目标&#xf…...

RoBoflow数据集的介绍

https://public.roboflow.com/object-detection&#xff08;该数据集的网址&#xff09; 可以看到一些基本情况 如果我们想要下载&#xff0c;直接点击 点击图像可以看到一些基本情况 可以点击红色箭头所指&#xff0c;右边是可供选择的一些yolo模型的格式 如果你想下载…...

免费将AI生成图像放大4倍的方法

有些人不需要任何高级工具和花哨的技巧;他们只需要一种简单的方法来提升图像分辨率而不损失任何质量 — 今天,我们将学习如何做到这一点。 生成AI图像最大的问题之一是什么?最终结果通常分辨率非常低。 这会导致很多不同的问题,特别是对于那些想要在内容或项目中使用这些…...

滑动过期机制——延长 Token有效期

文章目录 1. Flask 后端代码&#xff08;支持 WebSocket&#xff09;2. Android Studio Java 前端代码&#xff08;使用 Socket.IO&#xff09;代码说明后端前端 注意事项 前端使用 Android Studio&#xff08;Java&#xff09;和 Socket.IO 库&#xff0c;后端使用 Flask。 1…...

《JVM考古现场(二十三):归零者·重启奇点的终极奥义》

目录 楔子&#xff1a;归零者文明觉醒 上卷十维弦理论破译 第一章&#xff1a;JVM弦论代码考古 第二章&#xff1a;超膜引用解析算法 第三章&#xff1a;量子真空涨落监控 中卷归零者心法实战 第四章&#xff1a;宇宙重启倒计时引擎 第五章&#xff1a;内存奇点锻造术 第…...

k8s中sidecar死循环

序言 怎么发现我的同事们很上进呢&#xff0c;估计做了下贱的事儿吧。 伤不到我&#xff0c;不代表不疼&#xff01; sidecar产生的问题 1 背景 在k8s的环境中&#xff0c;pod的使用越来越多了&#xff0c;也就产生了sidecar容器&#xff0c;在现在的环境中&#xff0c;一个pod…...

Linux `init 4` 相关命令的完整使用指南

Linux init 4 相关命令的完整使用指南—目录 一、init 系统简介二、init 4 的含义与作用三、不同 Init 系统下的 init 4 行为1. SysVinit&#xff08;如 CentOS 6、Debian 7&#xff09;2. systemd&#xff08;如 CentOS 7、Ubuntu 16.04&#xff09;3. Upstart&#xff08;如 …...

Java Web 之 简介 100问

DAO 层的作用是什么&#xff1f; DAO 层作用&#xff1a; 与数据库直接交互&#xff0c;封装所有数据访问的细节&#xff08;即CRUD操作&#xff09;&#xff0c;不包含业务逻辑&#xff0c;只关注数据的持久化。 DAO的全拼是什么 Data Access Object&#xff0c;数据连接实…...

06-libVLC的视频播放器:推流RTMP

创建媒体对象 libvlc_media_t* m = libvlc_media_new_path(m_pInstance, inputPath.toStdString().c_str()); if (!m) return -1; // 创建失败返回错误 libvlc_media_new_path:根据文件路径创建媒体对象。注意:toStdString().c_str() 在Qt中可能存在临时字符串析构问题,建议…...

【物联网】基于LORA组网的远程环境监测系统设计

基于LORA组网的远程环境监测系统设计 演示视频: 简介: 1.本系统有一个主机,两个从机。 2.一主多从的LORA组网通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机则负责采集数…...

少儿编程路线规划

少儿编程路线规划—一文写明白 现在有很多的编程机构&#xff0c;五花八门的。我有幸也见识到了大家的营销策略。这些策略有黑有白吧&#xff0c;从业几年&#xff0c;沉淀下来一些客户角度的干货&#xff0c;分享给大家。 如果是想以很远很远的就业为目的&#xff0c;毕业就…...

第3章 垃圾收集器与内存分配策略《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

第3章 垃圾收集器与内存分配策略 3.2 对象已死 Java世界中的所有对象实例&#xff0c;垃圾收集器进行回收前就是确定对象哪些是活着的&#xff0c;哪些已经死去。 3.2.1 引用计数算法 常见的回答是&#xff1a;给对象中添加一个引用计数器&#xff0c;有地方引用&#xff0…...

Docker Overlay 网络的核心工作(以跨节点容器通信为例)

Docker 的 overlay 网络是一种基于 VXLAN&#xff08;Virtual Extensible LAN&#xff09;的多主机网络模式&#xff0c;专为 Docker Swarm 集群设计&#xff0c;用于实现跨节点的容器通信。它通过虚拟二层网络&#xff0c;允许容器在不同主机上像在同一局域网内一样通信。Dock…...

用 R 语言打造交互式叙事地图:讲述黄河源区生态变化的故事

目录 🌟 项目背景:黄河源头的生态变迁 🧰 技术栈介绍 🗺️ 最终效果预览 💻 项目构建步骤 1️⃣ 数据准备 2️⃣ 构建 Leaflet 地图 3️⃣ 使用 scrollama 实现滚动触发事件 4️⃣ 使用 R Markdown / Quarto 打包发布 🎬 效果展示截图 📦 完整代码仓库 …...

Java Stream常见误区解析:五大错误与规避方法

Java Stream API以函数式编程风格提供了一种强大的数据处理方式&#xff0c;使代码更简洁和可读。然而&#xff0c;误用Stream可能导致性能低下、错误频发或代码难以维护。本文将探讨开发者在使用Java Stream时最常见的五种错误&#xff0c;并提供规避方法。 1. 在Stream处理中…...

【树莓派Pico FreeRTOS】-中断服务与二值信号量

中断服务与二值信号量 RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (PIO)。 FreeRTOS 由 Real Time Engineers Ltd. 独家拥有、开发和维护。FreeRTO…...

构建灵活可扩展的接口抽象层:支持多种后端数据存取的最佳实践

构建灵活可扩展的接口抽象层:支持多种后端数据存取的最佳实践 在现代应用开发中,后端数据存取的需求可能非常多样化:本地数据库、云存储服务、REST API,甚至是文件系统。因此,设计一套支持多种后端数据存取的接口抽象层是提高系统灵活性和可维护性的关键。本文将详细探讨…...

Scade 语言词法介绍

Scade 6 是一种具备形式化语法与形式化语义的领域特定语言&#xff08;注1&#xff09;。自2008年发布&#xff08;注5&#xff09;起&#xff0c;在 Scade Suite 产品系列中语言定义方面到目前未产生重要的改变(注2)。在下面的内容中将介绍Scade 语言的词法(注3)。 注1&#x…...

如何配置环境变量HADOOP_HOMEM、AVEN_HOME?不配置会怎么样

以下是在不同操作系统中配置 HADOOP_HOME 和 JAVA_HOME 环境变量的方法&#xff0c;以及不配置可能产生的后果&#xff1a; 配置 HADOOP_HOME - Windows系统&#xff1a;下载并解压Hadoop安装包&#xff0c;然后右键“此电脑”&#xff0c;选择“属性”&#xff0c;点击“高级…...