ElasticSearch学习笔记二:使用Java客户端

一、前言

在上一篇文章中,我们对ES有了最基本的认识,本着实用为主的原则,我们先不学很深的东西,今天打算先学习一下ES的Java客户端如何使用。

二、创建项目

1、普通Maven项目

1、创建一个Maven项目

2、Pom文件

<dependencies><!--ES客户端--><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.25</version></dependency><!--JSON序列化--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.0</version></dependency><!--lombok:用于生成GET/SET 简化开发--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency></dependencies>

3、Coding

(1)创建ES客户端

 /*** 获取ES客户端* @return es Java客户端*/private static ElasticsearchClient getEsClient() {//Rest客户端,可以理解为是一个Http客户端,用于发送http请求RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();//ElasticsearchTransport用于和ES集群通信,封装了各种方法,第二个参数则是设置序列化方式ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());return new ElasticsearchClient(transport);}

(2)判断索引Product是否存在,如果不存在则创建索引。(当然通常情况下创建索引的操作是手动操作的,就类似创建数据表)

 /*** 校验并创建索引,如果存在直接返回true* 如果不存在则创建索引,同时返回是否创建成功的结果*/private static boolean checkAndCreateIndex(final ElasticsearchIndicesClient indices) throws IOException {//构建索引是否存在的请求参数ExistsRequest existsRequest = new ExistsRequest.Builder().index("product").build();final BooleanResponse exists = indices.exists(existsRequest);if (exists.value()) {System.out.println("索引已经存在,不用再创建了");return true;}//Java17的新特性(这样写字符串真的很方便)Reader createIndexJson = new StringReader("""{"mappings": {"properties": {"id":{"type": "long"},"name":{"type": "text","analyzer":"ik_max_word"},"price":{"type": "double"}}}}""");//创建索引CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index("product") //索引名.includeTypeName(false) //是否包含包名.settings(new IndexSettings.Builder().numberOfShards("1").numberOfReplicas("1").build()).withJson(createIndexJson).build();final CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);System.out.println("创建索引是否成功:" + createIndexResponse.acknowledged());return createIndexResponse.acknowledged();}

(3)批量写入数据

    /*** 批量写入数据*/private static boolean bulkWriteDoc(final ElasticsearchClient esClient) throws IOException {final List<Product> products = generalProduct(100);//批量写入BulkRequest.Builder br = new BulkRequest.Builder();for (Product product : products) {br.operations(op -> op.index(idx -> idx.index("product").id(product.getId().toString()).document(product)));}BulkResponse bulkResponse = esClient.bulk(br.build());System.out.println("批量写入结果是否成功:" + !bulkResponse.errors());return !bulkResponse.errors();}//product的代码@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {private Long id;private String name;private Double price;
}

(4)查询数据

//根据ID查询
GetResponse<Product> response = esClient.get(g -> g.index("product").id("1"), Product.class);
if (response.found()) {System.out.println("根据ID查询到对应的数据 " + response.source());
} else {System.out.println("根据ID查询未对应的数据");
}//根据条件查询:例如搜索名称为商品20的数据
SearchResponse<Product> queryResponse = esClient.search(s -> s.index("product").query(q -> q.match(t -> t.field("name").query("商品20"))), Product.class);
TotalHits total = queryResponse.hits().total();
assert total != null;
boolean isExactResult = total.relation() == TotalHitsRelation.Eq;if (isExactResult) {System.out.println("命中的文档数量为:" + total.value());
} else {System.out.println("没有命中任务数据");
}List<Hit<Product>> hits = queryResponse.hits().hits();
for (Hit<Product> hit : hits) {Product product = hit.source();System.out.println("命中的数据:" + product);
}

(5)完整代码

package com.cmxy.esdemo;import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.BulkRequest;
import co.elastic.clients.elasticsearch.core.BulkResponse;
import co.elastic.clients.elasticsearch.core.GetResponse;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation;
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient;
import co.elastic.clients.elasticsearch.indices.ExistsRequest;
import co.elastic.clients.elasticsearch.indices.IndexSettings;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.endpoints.BooleanResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import com.cmxy.entity.Product;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;public class ESTest {public static void main(String[] args) throws IOException, InterruptedException {try (ElasticsearchClient esClient = getEsClient()) {//获取es客户端//判断索引是否存在final ElasticsearchIndicesClient indices = esClient.indices();//判断索引是否存在,如果不存在则创建boolean createIndexSuccess = checkAndCreateIndex(indices);//往索引里写入数据boolean writeSuccess = false;if (createIndexSuccess) {writeSuccess = bulkWriteDoc(esClient);}//写入成功后,查询if (writeSuccess) {queryData(esClient);}}}private static void queryData(final ElasticsearchClient esClient) throws InterruptedException, IOException {//阻塞一下,否则刚写入直接查询会查不到数据Thread.sleep(2000L);//根据ID查询GetResponse<Product> response = esClient.get(g -> g.index("product").id("1"), Product.class);if (response.found()) {System.out.println("根据ID查询到对应的数据 " + response.source());} else {System.out.println("根据ID查询未对应的数据");}//根据条件查询:例如搜索名称为商品20的数据SearchResponse<Product> queryResponse = esClient.search(s -> s.index("product").query(q -> q.match(t -> t.field("name").query("商品20"))), Product.class);TotalHits total = queryResponse.hits().total();assert total != null;boolean isExactResult = total.relation() == TotalHitsRelation.Eq;if (isExactResult) {System.out.println("命中的文档数量为:" + total.value());} else {System.out.println("没有命中任务数据");}List<Hit<Product>> hits = queryResponse.hits().hits();for (Hit<Product> hit : hits) {Product product = hit.source();System.out.println("命中的数据:" + product);}}/*** 批量写入数据*/private static boolean bulkWriteDoc(final ElasticsearchClient esClient) throws IOException {final List<Product> products = generalProduct(100);//批量写入BulkRequest.Builder br = new BulkRequest.Builder();for (Product product : products) {br.operations(op -> op.index(idx -> idx.index("product").id(product.getId().toString()).document(product)));}BulkResponse bulkResponse = esClient.bulk(br.build());System.out.println("批量写入结果是否成功:" + !bulkResponse.errors());return !bulkResponse.errors();}/*** 校验并创建索引,如果存在直接返回true* 如果不存在则创建索引,同时返回是否创建成功的结果*/private static boolean checkAndCreateIndex(final ElasticsearchIndicesClient indices) throws IOException {//构建索引是否存在的请求参数ExistsRequest existsRequest = new ExistsRequest.Builder().index("product").build();final BooleanResponse exists = indices.exists(existsRequest);if (exists.value()) {System.out.println("索引已经存在,不用再创建了");return true;}//Java17的新特性(这样写字符串真的很方便)Reader createIndexJson = new StringReader("""{"mappings": {"properties": {"id":{"type": "long"},"name":{"type": "text","analyzer":"ik_max_word"},"price":{"type": "double"}}}}""");//创建索引CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index("product") //索引名.includeTypeName(false) //是否包含包名.settings(new IndexSettings.Builder().numberOfShards("1").numberOfReplicas("1").build()).withJson(createIndexJson).build();final CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);System.out.println("创建索引是否成功:" + createIndexResponse.acknowledged());return createIndexResponse.acknowledged();}private static List<Product> generalProduct(int count) {List<Product> products = new ArrayList<>();for (int i = 1; i <= count; i++) {products.add(new Product((long) i, "商品" + i,BigDecimal.valueOf(Math.random() * 1000).setScale(2, RoundingMode.HALF_UP).doubleValue()));}return products;}/*** 获取ES客户端** @return es Java客户端*/private static ElasticsearchClient getEsClient() {//Rest客户端,可以理解为是一个Http客户端,用于发送http请求RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();//ElasticsearchTransport用于和ES集群通信,封装了各种方法,第二个参数则是设置序列化方式ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());return new ElasticsearchClient(transport);}
}

(6)运行结果

这里可能有的朋友会有点疑惑包括笔者一开始也是,为什么我搜索的是“商品20”,能命中的文档数居然是100,按理说不应该只有一条吗?还有为什么命中了100条只返回了10条呢?

其实是这样的,因为我们当前的product索引,他的name是一个text类型,是会被分词的,我们可以看下他分词后是涨什么样子的

在kibana中执行如下命令POST /product/_analyze
{"field": "name","text": "商品20"
}结果:
{"tokens" : [{"token" : "商品","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "20","start_offset" : 2,"end_offset" : 4,"type" : "ARABIC","position" : 1}]
}

我们可以看到对于name的分词,分为“商品”和“20”两个词,且match时默认是用or,换成我们熟悉的Mysql,那就是类似于 select * from product where namelike ‘%商品%’ or name like ‘%20%’,所以所有的的数据就查到了。

例如我插入了一个产品,名称为测试20,我再执行查询语句:

GET /product/_search
{"size": 200, "sort": [{"id": {"order": "desc"}}], "query": {"match": {"name": {"query": "商品20","analyzer": "ik_max_word"}}}
}

结果如下图

2、Springboot整合ESClient
2.1、使用ES原生客户端

(1)Pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cmxy</groupId><artifactId>springboot-es</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-es</name><description>springboot-es</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version><jakarta.json>2.0.1</jakarta.json></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.25</version></dependency><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.25</version></dependency><!-- 覆盖springboot维护的版本 --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.17.25</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency><dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.cmxy.springbootes.SpringbootEsApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

(2)将EsClient注入Spring容器

@Component
public class EsConfig {@Beanpublic ElasticsearchClient esClient() {// Create the low-level clientRestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();// Create the transport with a Jackson mapperElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());// And create the API clientreturn new ElasticsearchClient(transport);}
}

(3)在要用的地方引入

@RestController
@RequestMapping("/es")
public class EsController {@Resourceprivate ElasticsearchClient elasticsearchClient;@GetMapping("/testEs")public boolean testEs() throws IOException {ExistsRequest request = new ExistsRequest.Builder().index("product").build();BooleanResponse exists = elasticsearchClient.indices().exists(request);return exists.value();}
2.2、使用springData

(1)添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cmxy</groupId><artifactId>springboot-es</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-es</name><description>springboot-es</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version><jakarta.json>2.0.1</jakarta.json></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
<dependencyManagement>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency>
</dependencies>
</dependencyManagement><build>
<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.cmxy.springbootes.SpringbootEsApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin>
</plugins>
</build></project>

(2)添加配置文件

spring:elasticsearch:uris: localhost:9200

(3)编写Repository

package com.cmxy.springbootes.demos.repository;import com.cmxy.springbootes.demos.entity.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;@Repository
public interface ProductEsRepository extends ElasticsearchRepository<Product,Long> {
}

(4)Controller

package com.cmxy.springbootes.demos.service;import com.cmxy.springbootes.demos.entity.Product;
import com.cmxy.springbootes.demos.repository.ProductEsRepository;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.SearchOperations;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;@RestController
@RequestMapping("/es")
public class EsController {@Resourceprivate ElasticsearchOperations elasticsearchOperations;@Resourceprivate SearchOperations searchOperations;@Resourceprivate ProductEsRepository productEsRepository;/*** 校验索引是否存在** @return*/@GetMapping("/checkIndex")public boolean checkIndexExists() {return elasticsearchOperations.indexOps(Product.class).exists();}/*** 创建索引*/@PostMapping("/createIndex")public boolean createIndex() {return elasticsearchOperations.indexOps(Product.class).create();}/*** 批量写入文档*/@PostMapping("/batchCreateDocument")public boolean batchCreateDocument() {List<Product> products = new ArrayList<>();for (int i = 1; i <= 100; i++) {products.add(new Product((long) i, "商品" + i, BigDecimal.valueOf(Math.random() * 1000).setScale(2, RoundingMode.HALF_UP).doubleValue()));}productEsRepository.saveAll(products);return true;}/*** 根据ID查询** @param id* @return*/@GetMapping("/getById")public Product getById(Long id) {//当然也可以这几使用searchOperations操作,类似 repository和mapper的关系Product product = productEsRepository.findById(id).orElse(null);System.out.println(product);return product;}@GetMapping("/query")public List<Product> query() {Criteria criteria = new Criteria("name").is("商品20");Query query = new CriteriaQuery(criteria);SearchHits<Product> searchHits = searchOperations.search(query, Product.class);if (searchHits.hasSearchHits()) {List<SearchHit<Product>> hits = searchHits.getSearchHits();return hits.stream().map(SearchHit::getContent).collect(Collectors.toList());}return null;}}

三、结束语

至此我们已经使用原生ES客户端、整合Springboot、使用SpringData操作了ES,当然目前只是简单的操作,更多的API我们还是要参考官方文档。后面计划学习ES的数据类型,希望对你有所帮助。

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

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

相关文章

使用 Grafana api 查询 Datasource 数据

一、使用grafana 的api 接口 官方API 二、生成Api key 点击 Administration -》Users and accss -》Service accounts 进入页面 点击Add service account 创建 service account 点击Add service account token 点击 Generate token , 就可以生成 api key 了 三、进入grafana…

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…

深入List集合:ArrayList与LinkedList的底层逻辑与区别

目录 一、前言 二、基本概念 三、相同之处 四、不同之处 五、ArrayList 底层 六、LinkedList 底层 七、ArrayList 应用场景 八、LinkedList 应用场景 九、ArrayList和LinkedList高级话题 十、总结 一、前言 在Java集合的广阔舞台上&#xff0c;ArrayList与LinkedLis…

python实现十进制转换二进制,tkinter界面

目录 需求 效果 代码实现 代码解释 需求 python实现十进制转换二进制 效果 代码实现 import tkinter as tk from tkinter import messageboxdef convert_to_binary():try:# 获取输入框中的十进制数decimal_number int(entry.get())# 转换为二进制binary_number bin(de…

关于强化学习的一份介绍

在这篇文章中&#xff0c;我将介绍与强化学习有关的一些东西&#xff0c;具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习&#xff1a;做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作&#xff0c;而是必须通…

js导入导出

前言: 后面将学习: Vue3ElementPlus 前置知识:前端三件套 HTML,CSS,JS 使用Vscode 本篇学习 这里先补充一个JavaScript的模块化的知识点 - 导入导出 JS提供的导入导出机制,可以实现按需导入. 我们之前是这样导入的 showMessage.js //简单的展示信息 function simpleMessage…

Web导出Excel表格

背景&#xff1a; 1. 后端主导实现 流程&#xff1a;前端调用到导出excel接口 -> 后端返回excel文件流 -> 浏览器会识别并自动下载 场景&#xff1a;大部分场景都有后端来做 2. 前端主导实现 流程&#xff1a;前端获取要导出的数据 -> 常规数据用插件处理成一个e…

【Linux】Ubuntu中muduo库的编译环境安装

Muduo is a multithreaded C network library based on the reactor pattern. muduo库的介绍就是&#xff1a;一个基于reactor反应堆模型的多线程C网络库。 muduo网络库是C语言开发的一个非常优秀的网络库&#xff0c;作者陈硕&#xff0c;muduo网络库在多线程环境下性能非常高…

IDEA leetcode插件代码模板配置,登录闪退解决

前言 最近换电脑&#xff0c;配置idea时和原来的模板格式不一样有点难受&#xff0c;记录一下自己用的模板&#xff0c;后期换电脑使用&#xff0c;大家也可以使用&#xff0c;有更好的地方可以分享给我~ IDEA leetcode插件代码模板配置,登录闪退解决 前言1 下载IDEA leetcode…

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…

【GeekBand】C++设计模式笔记11_Builder_构建器

1. “对象创建” 模式 通过 “对象创建” 模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式 Factory MethodAbstract …

JS学习日记(jQuery库)

前言 今天先更新jQuery库的介绍&#xff0c;它是一个用来帮助快速开发的工具 介绍 jQuery是一个快速&#xff0c;小型且功能丰富的JavaScript库&#xff0c;jQuery设计宗旨是“write less&#xff0c;do more”&#xff0c;即倡导写更少的代码&#xff0c;做更多的事&#xf…

排序算法(基础)大全

一、排序算法的作用&#xff1a; 排序算法的主要作用是将一组数据按照特定的顺序进行排列&#xff0c;使得数据更加有序和有组织。 1. 查找效率&#xff1a;通过将数据进行排序&#xff0c;可以提高查找算法的效率。在有序的数据中&#xff0c;可以使用更加高效的查找算法&…

动手学深度学习73 课程总结和进阶学习

1. 课程总结和进阶学习 https://c.d2l.ai/stanford-cs329p/ https://paperswithcode.com https://www.bilibili.com/video/BV1nA41157y4/?vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 怎么建立知识库 2. QA 20 算法提取的特征和人的不一样&#xff0c;互补 21 很难预测未…

WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇&#xff08;本文&#xff09; WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前言…

【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练

2024-ESWA-Diffusion-based normality pre-training for weakly supervised video anomaly detection 基于扩散的弱监督视频异常检测常态预训练摘要1. 引言2. 相关工作3. 方法论3.1. 使用扩散自动编码器进行常态学习3.2. 全局-局部特征编码器3.2.1 局部块3.2.2 全局块3.2.3 协同…

ONLYOFFICE8.2版本测评,团队协作的办公软件

文章目录 引言ONLYOFFICE产品简介功能与特点1. 实时协作2. 兼容性3. 模板库4. 评论和修订5. 安全性 体验与测评功能测试 邀请用户使用项目介绍结尾了解更多 引言 在数字化办公的浪潮中&#xff0c;效率和协作成为了工作的核心。ONLYOFFICE作为一个强大的办公套件&#xff0c;正…

Day18 Nim游戏

你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数&#xff…

【论文复现】STM32设计的物联网智能鱼缸

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STM32设计的物联网智能鱼缸 【1】项目功能介绍【2】设计需求总结【3】项目硬件模块组成 1.2 设计思路【1】整体设计思路【2】ESP8266工作模式…

3D意识(3D Awareness)浅析

一、简介 3D意识&#xff08;3D Awareness&#xff09;主要是指视觉基础模型&#xff08;visual foundation models&#xff09;对于3D结构的意识或感知能力&#xff0c;即这些模型在处理2D图像时是否能够理解和表示出图像中物体或场景的3D结构&#xff0c;其具体体现在编码场景…