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

Elasticsearch 的搜索功能

Elasticsearch 的搜索功能

建议阅读顺序:

  1. Elasticsearch 入门
  2. Elasticsearch 搜索(本文)
  3. Elasticsearch 搜索高级
  4. Elasticsearch 高级

1. 介绍

使用 Elasticsearch 最终目的是为了实现搜索功能,现在先将文档添加到索引中,接下来完成搜索的方法。

查询的分类:

  1. 叶子查询:叶查询子句在特定字段中查找特定值,例如 matchtermrange查询。
    1. 精确查询:根据精确词条值查找数据,一般是查找 keyword、数值、日期、boolean 等类型字段。例如:
      • ids:根据文档 ID 查找文档
      • range:返回包含指定范围内的文档,比如:查询年龄在 10 到 20 岁的学生信息。
      • term:根据精确值(例如价格、产品 ID 或用户名)查找文档。
    2. 全文检索查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
      • match_query:对一个字段进行全文检索
      • multi_match_query:对多个字段进行全文检索
  2. 复合查询:以逻辑方式组合多个叶子查询或者更改叶子查询的行为方式。

1.1 精确查询

1.1.1 term

语法:

GET /{索引库名}/_search
{"query": {"term": {"字段名": {"value": "搜索条件"}}}
}

当输入的搜索条件不是词条,而是短语时,由于不做分词,反而搜索不到:

1.1.2 range

语法:

GET /{索引库名}/_search
{"query": {"range": {"字段名": {"gte": {最小值},"lte": {最大值}}}}
}

range 是范围查询,对于范围筛选的关键字有:

  • gte:大于等于
  • gt:大于
  • lte:小于等于
  • lt:小于

1.2 全文检索

会对搜索条件进行拆分

1.2.1 match

语法:

GET /{索引库名}/_search
{"query": {"match": {"字段名": "搜索条件"}}
}
1.2.2 multi_match

同时对多个字段搜索,而且多个字段都要满足,语法:

GET /{索引库名}/_search
{"query": {"multi_match": {"query": "搜索条件","fields": ["字段1", "字段2"]}}
}

1.3 排序

语法:

GET /indexName/_search
{"query": {"match_all": {}},"sort": [{"排序字段": {"order": "排序方式asc和desc"}}]
}

如果按照商品价格排序:

GET /items/_search
{"query": {"match_all": {}},"sort": [ { "price": { "order": "desc" } } ]
}

1.4 分页查询

elasticsearch 默认情况下只返回 top10 的数据。而如果要查询更多数据就需要修改分页参数了。

elasticsearch 中通过修改 fromsize 参数来控制要返回的分页结果:

  • from:从第几个文档开始
  • size:总共查询几个文档

语法:

GET /items/_search
{"query": {"match_all": {}},"from": 0, // 分页开始的位置,默认为0"size": 10,  // 每页文档数量,默认10"sort": [ { "price": { "order": "desc" } } ]
}

2. Java Client 实现搜索

2.1 准备

代码:

@SpringBootTest
public class SearchTest {@Autowiredprivate IItemService itemService;private RestClient restClient = null;private ElasticsearchTransport transport = null;private ElasticsearchClient esClient = null;{// 使用 RestClient 作为底层传输对象restClient = RestClient.builder(new HttpHost("192.168.101.68", 9200)).build();ObjectMapper objectMapper = new ObjectMapper();objectMapper.registerModule(new JavaTimeModule());// 使用 Jackson 作为 JSON 解析器transport = new RestClientTransport(restClient, new JacksonJsonpMapper(objectMapper));}// 实现后续操作// TODO@BeforeEachpublic void searchTest() {// 创建客户端esClient = new ElasticsearchClient(transport);System.out.println(esClient);}@AfterEachpublic void close() throws IOException {transport.close();}}

后续代码放在代码的 TODO 处运行即可!!!

2.2 精准查询

2.2.1 Term 查询

根据 DSL 语句编写 java 代码:

GET /items/_search
{"query": {"term": {"category": { "value": "拉杆箱" }}}
}

代码:

@Test
public void testTermSearch() throws IOException {SearchResponse<ItemDoc> search = esClient.search(// 搜索索引s -> s.index("items").query(// 精准匹配q -> q.term(t -> t.field("category").value("牛奶"))),// 指定返回类型ItemDoc.class);handleResponse(search);
}
2.2.2 range 查询
GET /items/_search
{"query": {"range": {"price": { "gte": 100000, "lte": 20 }}}
}

代码:

@Test
public void testRangeSearch() throws IOException {SearchResponse<ItemDoc> search = esClient.search(// 搜索索引s -> s.index("items").query(// 范围匹配,price >= 100000 && price < 200000q -> q.range(t -> t.field("price").gte(JsonData.of(100000)).lt(JsonData.of(200000)))),// 指定返回类型ItemDoc.class);

2.3 全文检索

2.3.1 match 查询
GET /items/_search
{"query": {"match": {"name": "德国进口纯奶"}}
}

代码:

@Test
public void testMatchSearch() throws IOException {SearchResponse<ItemDoc> search = esClient.search(// 搜索索引s -> s.index("items").query(// 模糊匹配q -> q.match(// 在 name 字段中模糊匹配 "德国进口纯奶"t -> t.field("name").query("德国进口纯奶"))),// 返回值类型ItemDoc.class);handleResponse(search);
}
2.3.2 multi_match 查询
GET /items/_search
{"query": {"multi_match": {"query": "笔记本","fields": ["name", "category"]}}
}

代码:

@Test
public void testMultiMatchSearch() throws IOException {SearchResponse<ItemDoc> search = esClient.search(// 搜索索引s -> s.index("items").query(// 多字段模糊匹配q -> q.multiMatch(// 匹配字关键字t -> t.query("笔记本")// 匹配字段.fields("name", "category"))),// 指定返回类型ItemDoc.class);handleResponse(search);
}

2.4 排序和分页

GET /items/_search
{"query": {"multi_match": {"query": "绿色拉杆箱","fields": ["name","category"]}},"sort": [{ "price": { "order": "asc" } }],"size": 20,"from": 0
}

代码:

@Test
public void testSortSearch() throws IOException {SearchResponse<ItemDoc> search = esClient.search(// 搜索索引s -> s.index("items")// 查询条件.query(q -> q.multiMatch(// 匹配字段m -> m.query("绿色拉杆箱").fields("name", "category")))// 排序规则.sort(s1 -> s1.field(// 排序字段f -> f.field("price")// 排序规则.order(SortOrder.Desc)))// 分页.from(0).size(10),// 指定返回类型ItemDoc.class);handleResponse(search);
}

3. 复合查询

3.1 布尔查询

bool 查询,即布尔查询。就是利用逻辑运算来组合一个或多个查询子句的组合。bool 查询支持的逻辑运算有:

  1. must:必须匹配每个子查询,类似 “与”;
  2. should:选择性匹配子查询,类似 “或”;
  3. must_not:必须不匹配,不参与算分,类似 “非”;
  4. filter:必须匹配,不参与算分

举例:

GET /items/_search
{"query": {"bool": {"must": [ {"match": {"name": "手机"}} ],"should": [{"term": {"brand": { "value": "vivo" }}},{"term": {"brand": { "value": "小米" }}}],"must_not": [{"range": {"price": {"gte": 2500}}}]}},"sort": [ { "brand": { "order": "desc" } } ]
}

说明:

  1. 必须条件(must):
    1. 文档的 name 字段必须包含“手机”。
  2. 可选条件(should):
    1. 文档的 brand 字段应该是 “vivo” 或者 “小米”。只要满足其中一个条件即可。
  3. 排除条件(must_not):
    1. 文档的 price 字段不能大于等于 2500 元。
  4. 过滤条件(filter):
    1. 文档的 price 字段必须小于等于 1000 元。

当 should 与 must、must_not 同时使用时 should 会失效,需要指定 minimum_should_match。

3.2 尽量使用 filter

出于性能考虑,与搜索关键字无关的查询尽量采用 must_not 或 filter 逻辑运算,避免参与相关性算分(如:下拉菜单、多级菜单等)。

比如,要搜索 手机,但品牌必须是 华为,价格必须是 900~1599,那么可以这样写:

GET /items/_search
{"query": {"bool": {"must": [{"match": {"name": "手机"}}],"filter": [{"term": {"brand": { "value": "华为" }}},{"range": {"price": {"gte": 90000, "lte": 159900}}}]}}
}

3.3 Java Client

@Test
void testBoolQuery() throws Exception {//构建请求SearchRequest.Builder builder = new SearchRequest.Builder();//设置索引builder.index("items");//设置查询条件SearchRequest.Builder searchRequestBuilder = builder.query(// bool 查询,多条件匹配q -> q.bool(// must 连接b -> b.must(m -> m.match(// name 检索mm -> mm.field("name").query("手机"))).should(s1 -> s1.term( t -> t.field("brand").value("小米"))).should(s1 -> s1.term(t -> t.field("brand").value("vivo"))).minimumShouldMatch("1")))// 排序·.sort(sort -> sort.field(f -> f.field("brand").order(SortOrder.Asc)));SearchRequest build = searchRequestBuilder.build();//执行请求SearchResponse<ItemDoc> searchResponse = esClient.search(build, ItemDoc.class);//解析结果handleResponse(searchResponse);
}

4. 高亮显示

4.1 高亮显示原理

什么是高亮显示呢?

我们在百度,京东搜索时,关键字会变成红色,比较醒目,这叫高亮显示。

观察页面源码,你会发现两件事情:

  • 高亮词条都被加了 <em> 标签
  • <em> 标签都添加了红色样式

因此实现高亮的思路就是:

  • 用户输入搜索关键字搜索数据
  • 服务端根据搜索关键字到 elasticsearch 搜索,并给搜索结果中的关键字词条添加 html 标签
  • 前端提前给约定好的 html 标签添加 CSS 样式

4.2 实现高亮

语法:

GET /{索引库名}/_search
{"query": {"match": {"搜索字段": "搜索关键字"}},"highlight": {"fields": {"高亮字段名称": {"pre_tags": "<em>","post_tags": "</em>"}},"require_field_match": "true"}
}

注意

  • 搜索必须有查询条件,而且是全文检索类型的查询条件,例如 match
  • 参与高亮的字段必须是 text 类型的字段;
  • 默认情况下参与高亮的字段要与搜索字段一致,除非添加:required_field_match = false

代码:

@Test
public void testHighLightSearch() throws Exception {SearchResponse<ItemDoc> search = esClient.search(// 搜索索引s -> s.index("items").query(// 匹配字段q -> q.match(// 匹配字段m -> m.field("name").query("笔记本")))// 高亮.highlight(h -> h.fields("name",	 f -> f)// 高亮标签,前后缀.preTags("<b style='color:red'>").postTags("</b>")//.requireFieldMatch(false)),ItemDoc.class);long total = search.hits().total().value();System.out.println("total = " + total);List<Hit<ItemDoc>> hits = search.hits().hits();hits.forEach(hit -> {ItemDoc source = hit.source();// 高亮数据Map<String, List<String>> highlight = hit.highlight();List<String> highlightName = highlight.get("name");if(highlightName != null && !highlightName.isEmpty()){String s = highlightName.get(0);source.setName(s);System.out.println("s = " + s);}});
}

5. 数据聚合

5.1 介绍

聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。

应用场景:

  1. 对数据进行统计
  2. 在搜索界面显示符合条件的品牌、分类、规格等信息

聚合常见的有三类:

  1. 桶(Bucket)聚合:用来对文档做分组
  • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
  • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
  1. 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
  • Avg:求平均值
  • Max:求最大值
  • Min:求最小值
  • Stats:同时求 maxminavgsum
  1. 管道(pipeline)聚合:其它聚合的结果为基础做进一步运算

5.2 Bucket 聚合

5.2.1 语法

例如我们要统计所有商品中共有哪些商品分类,其实就是以分类(category)字段对数据分组。category 值一样的放在同一组,属于 Bucket 聚合中的 Term 聚合。

基本语法如下:

GET /items/_search
{"size": 0, "aggs": {"category_agg": {"terms": {"field": "category","size": 20,"order": { "_count": "desc" }}}}
}

属性说明:

aggregations:定义聚合

  • category_agg:聚合名称,自定义,但不能重复

    • terms:聚合的类型,按分类聚合,所以用term

      • field:参与聚合的字段名称

      • size:希望返回的聚合结果的最大数量

        设置 size 为 0,查询 0 条数据即结果中不包含文档,只包含聚合

      • order:对聚合结果排序

5.2.2 多级聚合

同时对品牌分组统计,此时需要按分类统计,按品牌统计,这时需要定义多个桶,如下:

GET /items/_search
{"size": 0, "aggs": {"category_agg": {"terms": { "field": "category", "size": 20 }},"brand_agg":{"terms": { "field": "brand", "size": 20 }}}
}

现在需要统计同一分类下的不同品牌的商品数量,这时就需要对桶内的商品二次聚合,如下:

GET /items/_search
{"aggs" : {"category_agg" : {"aggs" : {"brand_agg" : {"terms" : { "field" : "brand", "size" : 20 }}},"terms" : { "field" : "category", "size" : 20 }}},"size" : 0
}

5.3 带条件聚合

默认情况下,Bucket 聚合是对索引库的所有文档做聚合,例如我们统计商品中所有的品牌,结果如下:


可以看到统计出的品牌非常多。

但真实场景下,用户会输入搜索条件,因此聚合必须是对搜索结果聚合。那么聚合必须添加限定条件。

例如,我想知道价格高于 3000 元的手机品牌有哪些,该怎么统计呢?

语法如下:

增加 "query" 标签。

GET /items/_search
{"query": {"bool": {"filter": [{ "term": { "category": "手机" } },{ "range": { "price": { "gte": 300000 } } }]}}, "size": 0, "aggs": { "brand_agg": { "terms": { "field": "brand", "size": 20 } } }
}

5.4 Metric 聚合

统计了价格高于 3000 的手机品牌,形成了一个个桶。现在我们需要对桶内的商品做运算,获取每个品牌价格的最小值、最大值、平均值。

语法:

GET /items/_search
{"query": {"bool": {"filter": [{ "term": { "category": "手机" } },{ "range": { "price": { "gte": 300000 } } }]}}, "size": 0, "aggs": {"brand_agg": {"terms": {"field": "brand","size": 20,"order": { "stats_metric.avg": "desc" }},"aggs": { "stats_metric": { "stats": { "field": "price" } } }}}
}

属性说明:

stats_meric:聚合名称,自定义名称

  • stats:聚合类型,stats 是 metric 聚合的一种
    • field:聚合字段,这里选择 price,统计价格

另外,我们还可以让聚合按照每个品牌的价格平均值排序:

5.5 Java Client

参考 DSL 语句编写 Java Client 代码

@Test
void testAggs() throws Exception {//构建请求SearchRequest.Builder builder = new SearchRequest.Builder();//设置索引名builder.index("items");//设置查询条件builder.query(q -> q.bool(b -> b.filter(f -> f.term(t -> t.field("category").value("手机"))).filter(f -> f.range(r -> r.field("price").gte(JsonData.of(3000))))));//设置返回数量builder.size(0);//设置聚合builder.aggregations("brand_agg", a -> a.terms(t -> t.field("brand").size(10).order(NamedValue.of("stats_metric.avg", SortOrder.Desc))).aggregations("stats_metric", a1 -> a1.stats(s -> s.field("price"))));SearchRequest build = builder.build();//执行请求SearchResponse<ItemDoc> searchResponse = esClient.search(build, ItemDoc.class);//解析出聚合结果Aggregate brandAgg = searchResponse.aggregations().get("brand_agg");brandAgg.sterms().buckets().array().forEach(bucket -> {String key = bucket.key().stringValue();Long docCount = bucket.docCount();StatsAggregate statsMetric = bucket.aggregations().get("stats_metric").stats();//平均价格Double avg = statsMetric.avg();//最大价格Double max = statsMetric.max();//最小价格Double min = statsMetric.min();log.info("品牌:{},商品数量:{},平均价格:{},最大价格:{},最小价格:{}", key, docCount, avg, max, min);});
}

相关文章:

Elasticsearch 的搜索功能

Elasticsearch 的搜索功能 建议阅读顺序&#xff1a; Elasticsearch 入门Elasticsearch 搜索&#xff08;本文&#xff09;Elasticsearch 搜索高级Elasticsearch 高级 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能&#xff0c;现在先将文档添加到索引中&#xff0c…...

【鸿蒙5.0】向用户申请麦克风授权

#效果图 步骤 在 config.json 里声明权限&#xff1a;在项目的 config.json 文件中添加麦克风权限的声明&#xff0c;告知系统应用需要使用该权限。检查权限状态&#xff1a;在代码里检查应用是否已经获得了麦克风权限。请求权限&#xff1a;若应用未获得麦克风权限&#xff0…...

数据结构与算法分析:树与哈希表(一)

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为你提供一点帮助。 一、概述 背景&#xff1a;链表处理大量数据时&#xff0c;线性访问耗时多。二叉查找树多数操作平均运行时间为 O (log N)&#xff0c;相对于链表树更加高效。 1.预备知识 1.1. 树的定义与…...

VBA第三十四期 VBA中怎么用OnKey事件

我们在VBA设计中经常需要使用到OnKey方法&#xff0c;特别是在窗口设计中比如我们想用到翻页按键&#xff0c;则就可以来建立一个OnKey事件。Setup_OnKey过程运行以后&#xff0c;就会达到最终效果&#xff0c;按PgDn键会将指针下移一行&#xff0c;按PgUp键会将指针上移一行。…...

HarmonyOS NEXT开发进阶(十五):日志打印 hilog 与 console.log 的区别

文章目录 一、前言二、两者区别对比三、HiLog 详解四、拓展阅读 一、前言 在日常开发阶段&#xff0c;日志打印是调试程序非常常用的操作&#xff0c;在鸿蒙的官方文档中介绍了hilog这种方式&#xff0c;前端转过来的开发者发现console.log也可以进行日志打印&#xff0c;而且…...

Skynet 框架中 gateserver、gate、watchdog 的关系

一、概述 在 Skynet 框架的网络通信架构中&#xff0c;gateserver、gate、watchdog 是三个核心组件&#xff0c;共同实现客户端连接的监听、管理和业务逻辑的分发。其设计目标是通过分层解耦&#xff0c;提升网络层的稳定性与业务逻辑的灵活性。 二、组件职责 1. ‌gateserve…...

第11章:优化I/O_《C++性能优化指南》_notes

第十一章核心知识点详解 11.1 读取文件的优化技巧 重点&#xff1a;减少内存分配、使用大缓冲区、优化函数调用链。 难点&#xff1a;理解系统调用开销与缓冲区大小的权衡。 代码示例与详解 示例1&#xff1a;使用高效函数签名和减少内存分配 #include <fstream> #inc…...

【C++初阶】--- 内存管理

1.C/C内存分布 我们一般说的32位机器和64位机器指的是虚拟空间的大小&#xff0c;也就是进程地址空间的大小&#xff0c;32位机器下&#xff0c;进程地址空间的大小是232个字节&#xff0c;也就是4G&#xff0c;64位机器下&#xff0c;进程地址空间的大小是264个字节,大概160亿…...

使用 Ansys Discovery 可视化液体池中的水流

了解 ANSYS Discovery&#xff1a;设计领域的变革者 ANSYS Discovery 是一款功能强大的软件工具&#xff0c;能够彻底改变设计流程。借助其先进的仿真功能&#xff0c;工程师现在可以在设计投入生产之前更深入地了解其设计。通过使用 ANSYS Discovery&#xff0c;设计师可以快…...

网络安全-网络安全基础

一、网络安全概述 TCP/IP协议定义了一个对等的开放性网络&#xff0c;使得连接到这个网络中的所有用户都可能面临来自网络中的恶意的破坏和攻击。这些攻击通过网络通信协议、网络应用协议甚至物理传输链路来实现。主要针对于软件和硬件进行攻击。那在互联网上如何保证自己的安…...

YOLOv8+ Deepsort+Pyqt5车速检测系统

该系统通过YOLOv8进行高效的目标检测与分割&#xff0c;结合DeepSORT算法完成目标的实时跟踪&#xff0c;并利用GPU加速技术提升处理速度。系统支持模块化设计&#xff0c;可导入其他权重文件以适应不同场景需求&#xff0c;同时提供自定义配置选项&#xff0c;如显示标签和保存…...

QML中的附加属性和附加信号处理程序

QML中的附加属性和附加信号处理程序 在QML中&#xff0c;附加属性(Attached Properties)和附加信号处理程序(Attached Signal Handlers)是特殊类型的属性和信号&#xff0c;它们由附加类型(Attached Types)提供&#xff0c;而不是由对象本身直接提供。 什么是附加的(Attached…...

爱普生FC-135晶振5G手机的极端温度性能守护者

在5G时代&#xff0c;智能手机不仅需要高速率与低延迟&#xff0c;更需在严寒、酷暑、振动等复杂环境中保持稳定运行。作为 5G 手机的核心时钟源&#xff0c;爱普生32.768kHz晶振FC-135凭借其宽温适应性、高精度稳定性与微型化设计&#xff0c;成为5G手机核心时钟源的理想选择&…...

GPT Workspace体验

GPT Workspace是一款将强大的自然语言处理模型&#xff08;如 ChatGPT 和 Gemini&#xff09;集成到 Google Workspace 应用&#xff08;如 Google Docs, Sheets, Slides, Gmail 和 Drive&#xff09;中的工具或插件。它的目标是提升用户在日常办公中的效率和创造力。 以下是对…...

Teleport 和 Set Actor location的区别

Teleport 和 Set Actor Location 都可以用于移动一个 Actor 的位置&#xff0c;但它们在底层逻辑和适用场景上有显著区别. 1. Set Actor Location 功能&#xff1a; 直接设置 Actor 的位置&#xff0c;不重置物理状态&#xff08;如速度、动量&#xff09;。 行为特点&#xf…...

“GPU 挤不动了?”——聊聊基于 GPU 的计算资源管理

“GPU 挤不动了?”——聊聊基于 GPU 的计算资源管理 作者:Echo_Wish “老板:为什么 GPU 服务器卡得跟 PPT 一样?” “运维:我们任务队列爆炸了,得优化资源管理!” 在 AI 训练、深度学习、科学计算的场景下,GPU 计算资源已经成为香饽饽。但 GPU 服务器贵得离谱,一台 A…...

解决前端项目中无法识别 .node 文件的依赖安装问题

解决前端项目中无法识别 .node 文件的依赖安装问题 问题描述 在 macOS 系统&#xff08;M1 Pro 芯片&#xff09;&#xff0c;使用 Node.js 版本 20.9.0 和 Vue 3 的环境下&#xff0c;项目启动过程中遇到了以下错误&#xff1a; [ERROR] No loader is configured for "…...

Gateway实战入门(四)、断言-请求头以及请求权重分流等

spring cloud-Gateway&#xff1a;断言-请求头以及请求权重分流等 一、断言Header信息要求项目前置环境要求案例一、断言-请求头信息-匹配X-Request-Id1、配置文件及代码2、测试 案例二、断言-请求头信息-匹配API版本场景主要配置信息 案例三、断言-请求头信息&#xff1a;匹配…...

YOLOv11模型的常见处理

一.数据准备&#xff1a; 1.数据集格式&#xff1a; 目录结构示例&#xff1a; datasets/├── images/│ ├── train/ # 训练图片│ └── val/ # 验证图片└── labels/├── train/ # 训练标签└── val/ # 验证标签 每张图片对应一个 .txt 标注文件…...

conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 conda clean --tarballsconda rename 重命名环境conda create -n qwen --clone …...

无线局域网

1.5G支持中低频和高频频段&#xff0c; 2.网络切片是指从应该网络中选取特定的特性和功能 3.WLAN广义指无线电波&#xff0c;激光&#xff0c;红外线等无线信号代替有线局域网中的部分或者全部传输介质所构成的网络。 4.802.11运行在2.4GHz ISM 频段&#xff0c;采用扩频通信…...

百人会上的蔚小理与「来的刚刚好」的雷军

这就是2025百人会上的蔚小理&#xff0c;努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么呢&#xff1f;站在蔚小理的肩上。 这就是2025百人会上的蔚小理&#xff0c;努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么…...

现代优雅杂志海报徽标设计手写英文字体安装包 Attomes – Brush Handwritten Font

Attomes 简介 – Brush 手写字体 此字体是一种精致、优雅、流畅的手写字体。它有一个美丽而独特的连字混合字母&#xff0c;因此作者用一个小漩涡嵌入来撰写它&#xff0c;从而形成现代字体&#xff0c;并准备好通过为您的下一个设计项目添加优雅和独特的风格来发表声明。将其…...

Java进阶——静态代理与动态代理

代理模式是一种常用的设计模式&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。代理模式就像是一个中间人&#xff0c;客户端通过代理来间接访问目标对象&#xff0c;可以在不修改目标对象的基础上&#xff0c;对目标对象的功能进行增强或扩展。代理模式主要分为静…...

【多线程】进阶

目录 一、CAS 什么是 CAS CAS 伪代码 CAS 有哪些应用 实现原子类 CAS 是怎么实现的 如何通过 CAS 实现的原子类 CAS 的 ABA 问题 什么是 ABA 问题 ABA 问题引来的 BUG 正常的过程 异常的过程 解决方案 &#x1f4dd;相关面试题 二、JUC(java.util.concurrent)的…...

MFC中字符串string类型和CString类型互转方法

文章目录 一、CString 转 std::string1. Unicode项目&#xff08;_UNICODE 已定义&#xff09;2. 多字节项目&#xff08;_MBCS 已定义&#xff09; 二、std::string 转 CString1. Unicode项目&#xff08;_UNICODE 已定义&#xff09;2. 多字节项目&#xff08;_MBCS 已定义&a…...

工作记录 2017-03-13

工作记录 2017-03-13 序号 工作 相关人员 1 修改邮件上的问题。 开始处理操作日志部分。 测试了C#和MySql的连接。 更新RD服务器。 郝 更新的问题 1、 修改了CMS1500的打印&#xff0c;NDC的内容用了小的字体。 2、在Cliams List中可以查看Job的Notes。 3、Payment Po…...

Linux 配置NFS服务器

1. 开放/nfs/shared目录&#xff0c;供所有用户查阅资料 服务端 &#xff08;1&#xff09;安装nfs服务&#xff0c;nfs-utils包中包含rpcbind&#xff08;rpc守护进程&#xff09; [rootnode1-server ~]# yum install -y nfs-utils # nfs-utils包中包含rpcbind [rootnode…...

Linux《进程概念(上)》

在之前的Linux学习当中我们已经了解了基本的Linux指令以及基础的开发工具的使用&#xff0c;那么接下来我们就要开始Linux当中一个非常重要的部分的学习——进程&#xff0c;在此进程是我们之后Linux学习的基础&#xff0c;并且通过进程的学习会让我们了解更多的操作系统的相关…...

游戏开发中的贝塞尔曲线:感受丝滑的数学之美

这是一篇vip文章,如果你还不是vip,可以移步https://www.ilikexff.cn/articles/165免费阅读。 介绍 贝塞尔曲线是计算机图形学中最重要的概念之一,以其在表示曲线时的灵活性和精确性而闻名。广泛应用于计算机图形学、动画、路径规划等领域的数学曲线。 贝塞尔曲线的数学原理基…...

Java【多线程】(6)定时器

目录 1.前言 2.正文 2.1库中定时器 2.2手搓定时器 3.小结 1.前言 哈喽大家好呀&#xff0c;今天继续给大家分享Java中定时器的学习&#xff0c;正文包括定时器的三种实现方式&#xff0c;正文如下。 2.正文 在 Java 中&#xff0c;定时器&#xff08;Timer&#xff09;…...

Epub转PDF软件Calibre电子书管理软件

Epub转PDF软件&#xff1a;Calibre电子书管理软件 一款好用的电子书管理软件&#xff0c;可快速导入电脑里的电子书并进行管理&#xff0c;支持多种格式&#xff0c;阅读起来非常方便。同时也有电子书格式转换功能。 第一步&#xff1a;添加电子书 将需要转换的电子书添加到…...

使用FastExcel时的单个和批量插入的问题

在我们用excel表进行插入导出的时候&#xff0c;通常使用easyexcel或者FastExcel&#xff0c;而fastexcel是easy的升级版本&#xff0c;今天我们就对使用FastExcel时往数据库插入数据的业务场景做出一个详细的剖析 场景1 现在我们数据库有一张组织表&#xff0c;组织表的字段…...

nginx https配置

一.https配置 HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议&#xff0c;主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密&#xff0c;实现互联网传输安全保护。 1.生成证书 openssl genrsa -des3 -out server.key 20…...

git --- cherry pick

git --- cherry pick cherry pick cherry pick Cherry Pick 是 Git 中的一个操作&#xff0c;它允许你选择某个分支的某次&#xff08;或多次&#xff09;提交&#xff0c;并将其应用到当前分支&#xff0c;而不会合并整个分支的所有更改。 cherry pick 的作用 只提取某个特定的…...

虚拟机安装linux系统无法上网的解决方法

在虚拟环境中运行Linux系统时&#xff0c;有时会遇到网络连接问题&#xff0c;特别是在使用虚拟机软件如VMware或VirtualBox时。本文将详细介绍一种针对“虚拟机安装Linux系统无法上网”问题的解决方案&#xff0c;以CentOS 6.5为例&#xff0c;适用于其他基于NAT模式的虚拟机环…...

北大人工智能研究院朱松纯:“中国的AI叙事” 存在认知偏差

3月29日&#xff0c;在2025中关村论坛通用人工智能论坛上&#xff0c;北京通用人工智能学院院长&#xff0c;北京大学人工智能研究院、智能学院院长朱松纯表示&#xff0c;目前&#xff0c;行业对AI的讨论几乎被大模型能力所占据&#xff0c;而基础学科、原始创新与智能本质的研…...

Java高频面试之集合-20

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;讲讲 HashSet 的底层实现&#xff1f; HashSet 是 Java 集合框架中用于存储唯一元素的高效数据结构&#xff0c;其底层实…...

使用Qemu模拟32位ARM系统

一、环境 实验环境如下&#xff1a; 主机&#xff1a;x86_64 操作系统&#xff1a;Ubuntu 20.04.6 LTS Qemu版本&#xff1a;QEMU emulator version 4.2.1 Linux内核版本&#xff1a;linux-4.4.240 Busybox版本&#xff1a;busybox-1.35.0二、前置准备 下载 linux-4.4.240 源…...

【初阶数据结构】栈

文章目录 一、概念与结构 二、栈的实现 栈的定义 1.初始化 2.入栈 3.判断栈是否为空 4.出栈 5.取栈顶元素 6.获取栈中有效元素个数 2.销毁 三、完整码源 总结 一、概念与结构 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据…...

docker-compose部署prometheus+grafana+node_exporter

目录 docker-compose文件 配置文件 文件层级关系&#xff0c;docker-compose和配置文件位于同级目录 node_exporter页面json文件 涉及离线包 一.docker-compose文件 [rootsulibao prometheus]# cat docker-compose.yml version: 3services:prometheus:image: registry.c…...

maya调整全局关节显示大小

请按以下步骤操作&#xff1a; 在 Maya 主菜单栏中&#xff0c;找到 Display (显示) 菜单。 在 Display 菜单下&#xff0c;找到 Animation (动画) 子菜单。 在 Animation 子菜单中&#xff0c;点击 Joint Size... (关节大小...)。 这时会弹出一个小窗口或者直接在界面上出现…...

“屏幕“的实现_程序中如何将数据映射到硬件_C++实战

前言 程序里的数据,最后都需要将数据对象写入硬件.C/C最大的优势体现也是在这里,他既是高级语言方便被程序员使用,又能和硬件沟通. 引入 以"屏幕"的实现,总结数据映射到硬件的代码写法 分析 软件部分 1.屏幕是数据对象---一切都是数据,一切都是对象;数据有类型,屏…...

R --- Error in library(***) : there is no package called ‘***’ (服务器非root用户)

步骤 步骤一&#xff1a;在自己目录下创建R包安装路径步骤二&#xff1a;配置用户本地的R库路径步骤三&#xff1a;安装缺失的包&#xff08;在终端&#xff09;步骤四&#xff1a;验证安装 步骤一&#xff1a;在自己目录下创建R包安装路径 mkdir -p ~/R_libs步骤二&#xff1…...

Go中的逃逸分析

什么是逃逸&#xff1f; 逃逸是指一个变量本来应该分配在栈&#xff08;stack&#xff09;上&#xff0c;但由于某些原因&#xff0c;最终被分配到了堆&#xff08;heap&#xff09;上。 类比&#xff1a; 栈就像一个临时的快餐盒&#xff0c;用来存放短期使用的数据。堆就像…...

解决 Android AGP 最新版本中 BuildConfig 报错问题

在最新版本的 Android Gradle Plugin (AGP) 中&#xff0c;Google 对构建系统做了不少改动&#xff0c;可能会导致一些与 BuildConfig 相关的问题。以下是常见问题及解决方案&#xff1a; 常见问题及修复方法 1. BuildConfig 类完全缺失 原因&#xff1a;AGP 8.0 默认不再为库模…...

Rollup系列之安装和入门

Rollup ‌Rollup.js‌的主要用途是将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它特别适用于将ES模块编译成不同的模块形式&#xff0c;如AMD、CommonJS、UMD等&#xff0c;以便在不同的环境中使用‌。 Rollup的应用场景与好处&#xff1a; 插件或…...

Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API

KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一个重要的里程碑&#xff0c;标志着第一个完全无需 Apache ZooKeeper 运行的主要版本。 通过默认运行在 KRaft 模式下&#xff0c;Kafka 简化了部署和管理&#xff0c;消除了维护单独 ZooKeeper 集群的复杂性。 这一变化显著降…...

MQTT之重复消息(6、在项目中遇到的问题)

项目背景: 在 Spring Boot MQTT 5.0 环境中&#xff0c;RTU设备向SpringBoot平台发送心跳数据、业务监控数据。同时SpringBoot平台可以向RTU设备下发指令&#xff0c;RTU在执行完指令之后向平台发送响应数据。 问题一、SpingBoot平台发送指令给RTU设备&#xff0c;RTU设备能够…...

8、linux c 信号机制

一、信号概述 1. 信号概念 信号是一种在软件层次上对中断机制的模拟&#xff0c;是一种异步通信方式。信号的产生和处理都由操作系统内核完成&#xff0c;用于在进程之间传递信息或通知某些事件的发生。 2. 信号的产生 信号可以通过以下方式产生&#xff1a; 按键产生&…...