001 定期同步mysql数据到es 删除数据库记录同时删除es记录 es全文搜索分词和高亮
文章目录
- ProductController.java
- Product.java
- ElasticsearchSyncListener.java
- ProductElasticSearchMapper.java
- ProductMapper.java
- ProductDeletedEvent.java
- ProductServiceImpl.java
- SyncProductService.java
- IProductService.java
- ElasticSearchSpringDemoApplication.java
- ServletInitializer.java
- product.sql
- 同步
- ProductMapper.xml
- application.yaml
- pom.xml
ProductController.java
package com.example.controller;import com.example.service.IProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;/*** <p>* 前端控制器* </p>** @author dd* @since 2024-05-07**///测试:http://localhost:8080/es_demo/product/kw/纯棉四件套/page/1
@RestController
@RequestMapping("product")
public class ProductController {@Autowiredprivate IProductService productService;// 将mysql中的product数据保存到es中@GetMapping("saveProductToES")public String saveProductToES(){productService.saveProductFromDBToES();return "ok";}//在生产环境中,直接操作Elasticsearch通常需要更复杂的错误处理和事务管理逻辑,以确保数据的一致性和完整性。@GetMapping("delete/{productId}")public String deleteProduct(@PathVariable Integer productId){return productService.deleteProduct(productId);}// 搜索引擎:输入关键字//返回 商品信息 + 页码信息@GetMapping("kw/{kw}/page/{pageNum}")public Map<String, Object> getByKeyword(@PathVariable("kw") String keyword,@PathVariable("pageNum") Integer pageNum){if(pageNum == null)pageNum = 1;Map<String, Object> result = productService.getByNameAndInfo(keyword, keyword, pageNum);return result;}}
Product.java
package com.example.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;/*** <p>* * </p>** @author dd* @since 2024-05-07*/// @Field(index = false, store = true,
// type = FieldType.Date,format = DateFormat.custom,
// pattern = "yyyy-MM-dd HH:mm:ss")@Document(indexName = "myproduct")
public class Product implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "product_id",type = IdType.AUTO)@Idprivate Integer productId;@Field(type = FieldType.Keyword)private String productName;private BigDecimal productPrice;private String productImg;private Integer productCount;@Field( type = FieldType.Date,name = "update_time",format = {},pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd'T'HH:mm:ss'+08:00' || strict_date_opotional_time || epoch_millis")private LocalDateTime createTime;@Field( type = FieldType.Date,name = "update_time",format = {},pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd'T'HH:mm:ss'+08:00' || strict_date_opotional_time || epoch_millis")private LocalDateTime updateTime;@Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_max_word")private String productInfo;public Integer getProductId() {return productId;}public void setProductId(Integer productId) {this.productId = productId;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}public BigDecimal getProductPrice() {return productPrice;}public void setProductPrice(BigDecimal productPrice) {this.productPrice = productPrice;}public String getProductImg() {return productImg;}public void setProductImg(String productImg) {this.productImg = productImg;}public Integer getProductCount() {return productCount;}public void setProductCount(Integer productCount) {this.productCount = productCount;}public LocalDateTime getCreateTime() {return createTime;}public void setCreateTime(LocalDateTime createTime) {this.createTime = createTime;}public LocalDateTime getUpdateTime() {return updateTime;}public void setUpdateTime(LocalDateTime updateTime) {this.updateTime = updateTime;}public String getProductInfo() {return productInfo;}public void setProductInfo(String productInfo) {this.productInfo = productInfo;}@Overridepublic String toString() {return "Product{" +"productId=" + productId +", productName=" + productName +", productPrice=" + productPrice +", productImg=" + productImg +", productCount=" + productCount +", createTime=" + createTime +", updateTime=" + updateTime +", productInfo=" + productInfo +"}";}
}
ElasticsearchSyncListener.java
package com.example.listener;import com.example.service.impl.ProductDeletedEvent;
import com.example.mapper.ProductElasticSearchMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class ElasticsearchSyncListener {@Autowiredprivate ProductElasticSearchMapper productElasticSearchMapper;@EventListenerpublic void handleProductDeletedEvent(ProductDeletedEvent event) {Integer productId = event.getProductId();// 删除Elasticsearch中的记录productElasticSearchMapper.deleteById(productId);}
}
ProductElasticSearchMapper.java
package com.example.mapper;import com.example.entity.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;import java.util.List;@Repository //父接口已经 实现对象在es中的基础CRUD操作
public interface ProductElasticSearchMapper extends ElasticsearchRepository<Product,Integer> {//方法名必须是:findBy + pojo类属性名(首字母大写)public List<Product> findByProductName(String productName);public List<Product> findByProductInfo(String productInfo);}
ProductMapper.java
package com.example.mapper;import com.example.entity.Product;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;import java.util.List;/*** <p>* Mapper 接口* </p>** @author dd* @since 2024-05-07*/public interface ProductMapper extends BaseMapper<Product> {}
ProductDeletedEvent.java
package com.example.service.impl;import org.springframework.context.ApplicationEvent;//定义一个事件类来表示删除操作
public class ProductDeletedEvent extends ApplicationEvent {private final Integer productId;public ProductDeletedEvent(Object source, Integer productId) {super(source);this.productId = productId;}public Integer getProductId() {return productId;}
}
ProductServiceImpl.java
package com.example.service.impl;import com.example.entity.Product;
import com.example.mapper.ProductElasticSearchMapper;
import com.example.mapper.ProductMapper;
import com.example.service.IProductService;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.*;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;//空值检查:
//在处理高亮字段时,已经对highlightFields.get("productName")和highlightFields.get("productInfo")进行了空值检查,确保Product类的getProductName和getProductInfo方法也能处理可能的空值情况。
//
//字段名匹配:
//确保在Elasticsearch中定义的字段名(如productName和productInfo)与在Java代码中使用的字段名相匹配。
//
//性能考虑:
//如果productMapper.selectList(null)返回大量的产品数据,并且一次性将它们全部保存到Elasticsearch中,这可能会导致性能问题。考虑分批保存或使用Elasticsearch的批量API来提高性能。
//
//查询字符串分析:
//使用了queryStringQuery,这可能会对输入的productName进行分词查询。如果希望精确匹配整个字段值,而不是基于分词,可能需要使用termQuery或matchPhraseQuery。但是,由于处理的是全文搜索场景,queryStringQuery通常是合适的。//安全性:
//如果productName或productInfo参数来自不受信任的源(如用户输入),请确保对它们进行适当的验证和清理,以防止SQL注入或Elasticsearch注入攻击。不过,由于是在应用层进行Elasticsearch查询,而不是直接拼接查询字符串,因此SQL注入的风险较低。但仍然需要注意Elasticsearch注入的风险。//返回类型:
//返回了一个包含分页信息和搜索结果的Map。确保前端或调用此服务的客户端知道如何解析这个Map。考虑定义一个DTO(数据传输对象)来封装返回的数据,以提供更明确的契约。/*** <p>* 服务实现类* </p>** @author dd* @since 2024-05-07*/
@Service
public class ProductServiceImpl implements IProductService {@Autowiredprivate ProductMapper productMapper;@Autowiredprivate ProductElasticSearchMapper productElasticSearchMapper;@Autowiredprivate ElasticsearchRestTemplate restTemplate;@Autowiredprivate ApplicationEventPublisher applicationEventPublisher;// 把mysql中的数据查询出来,保存商品数据到es中//当前代码逻辑中的saveProductFromDBToES方法设计为一个全量同步操作,它会从MySQL数据库中查询所有产品记录,并将它们全部保存到Elasticsearch中。因此,当从数据库中删除一条记录时,该方法不会意识到有记录被删除,因为它仅仅是再次执行了全量查询和保存操作。////为了解决这个问题,可以采取以下几种策略之一:////增量同步:设计一个机制来跟踪数据库中的更改(如使用数据库的binlog日志),并仅同步自上次同步以来发生的更改。这通常比较复杂,但可以实现实时或近实时的数据同步。////定期全量同步:可以定期(如每小时、每天)运行saveProductFromDBToES方法来进行全量同步。这种方法比较简单,但可能会导致数据在一定时间窗口内不同步。////删除操作同步:在应用程序中添加逻辑,以便在数据库记录被删除时,也在Elasticsearch中删除相应的文档。这通常需要在数据库删除操作的地方添加额外的代码或使用触发器。////使用监听器或事件驱动:如果使用的是支持事件驱动或变更数据捕获(CDC)的数据库或框架,可以配置监听器来捕获数据库更改事件,并据此更新Elasticsearch中的数据。@Overridepublic boolean saveProductFromDBToES() {//1. select product from mysqlList<Product> productList = productMapper.selectList(null);//2. save to esIterable<Product> products = productElasticSearchMapper.saveAll(productList);return true;}@Overridepublic String deleteProduct(Integer productId) {// 这里有一个方法来删除数据库中的记录int rows = productMapper.deleteById(productId);if(rows>0){// 发布删除事件applicationEventPublisher.publishEvent(new ProductDeletedEvent(this, productId));return "删除成功";}return "删除失败";}//创建一个事件监听器来监听ProductDeletedEvent并执行删除Elasticsearch中的记录的操作//ElasticsearchSyncListener类是一个Spring组件,它使用@EventListener注解来标记handleProductDeletedEvent方法作为事件监听器。当ProductDeletedEvent事件被发布时,这个方法将被调用,并执行删除Elasticsearch中相应记录的操作。////请注意,需要确保ApplicationEventPublisher和ProductElasticSearchMapper都被正确地注入到相应的类中。此外,可能还需要配置Spring的事件支持,但通常情况下,在Spring Boot应用程序中,事件支持是默认启用的。////最后,当调用ProductService的deleteProduct方法时,它将删除数据库中的记录并发布一个ProductDeletedEvent事件。这个事件将被ElasticsearchSyncListener监听并处理,从而删除Elasticsearch中的相应记录。// 实现接口方法,基于Elasticsearch的全文搜索,包括分词和高亮功能@Overridepublic Map<String,Object> getByNameAndInfo(String productName, String productInfo, Integer pageNum) {//设置分页信息,每页显示3条记录,pageNum-1是因为页码通常从1开始,而数组索引从0开始PageRequest page = PageRequest.of(pageNum - 1, 3);//创建一个布尔查询构建器,用于组合多个查询条件BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();//如果productName不为空,则创建一个基于productName的查询,并将其添加到布尔查询中if(productName !=null){QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(productName);boolQueryBuilder.must(queryBuilder);}else{//如果productName为空且productInfo不为空,则创建一个基于productInfo的匹配查询,并将其添加到布尔查询中if(productInfo !=null)boolQueryBuilder.must(new MatchQueryBuilder("productInfo",productInfo));}//根据商品价格降序排序SortBuilder sortBuilder = SortBuilders.fieldSort("productPrice").order(SortOrder.DESC);//FieldSortBuilder priceSort = SortBuilders.fieldSort("productPrice"); // 按产品价格排序(需要指定升序或降序)//构建高亮查询,设置高亮字段和高亮标签NativeSearchQueryBuilder builder=new NativeSearchQueryBuilder();NativeSearchQuery query=builder.withQuery(boolQueryBuilder).withPageable(page).withSort(sortBuilder).withHighlightFields(new HighlightBuilder.Field("productInfo"),new HighlightBuilder.Field("productName")).withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>")).build();// 执行查询,获取搜索结果SearchHits<Product> search = restTemplate.search(query, Product.class);List<Product> productList= new ArrayList<>();//遍历搜索结果,处理高亮信息,并将处理后的产品添加到列表中for(SearchHit<Product> searchHit:search){//获取高亮字段信息Map<String ,List<String>> highlightFields = searchHit.getHighlightFields();//将高亮的内容填充到content中//处理产品名称和产品信息的高亮信息,并将其设置回产品对象中String highLightProName = highlightFields.get("productName") ==null ?searchHit.getContent().getProductName() :highlightFields.get("productName").get(0);String highLightProInfo = highlightFields.get("productInfo") ==null ?searchHit.getContent().getProductInfo() :highlightFields.get("productInfo").get(0);searchHit.getContent().setProductName(highLightProName );searchHit.getContent().setProductInfo(highLightProInfo);//将处理后的产品添加到列表中productList.add(searchHit.getContent());}//创建SearchPage对象,用于获取分页信息(假设SearchHitSupport是有效的)SearchPage<Product> searchPage= SearchHitSupport.searchPageFor(search,query.getPageable());//总记录数long totalElements=searchPage.getTotalElements();//总页数int totalPages=searchPage.getTotalPages();//当前页数int currentPageForDisplay=searchPage.getPageable().getPageNumber() + 1;// 通常前端期望页码从1开始System.out.println(currentPageForDisplay);//创建一个Map对象,用于返回查询结果和分页信息Map<String,Object> map=new HashMap<>();map.put("totalElements",totalElements); // 总记录数map.put("totalPages",totalPages); //总页数map.put("currentPage",currentPageForDisplay); // 当前页码map.put("productList",productList); // 商品数据信息//返回查询结果和分页信息的Map对象return map;}}
SyncProductService.java
package com.example.service.impl;import com.example.service.IProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;@Service
public class SyncProductService {@Autowiredprivate IProductService productService;@Scheduled(fixedRate = 2000) // 单位是毫秒public void syncProductsFromDBToES() {productService.saveProductFromDBToES();}
}
IProductService.java
package com.example.service;import com.example.entity.Product;
import com.baomidou.mybatisplus.extension.service.IService;import java.util.Map;/*** <p>* 服务类* </p>** @author dd* @since 2024-05-07*/
public interface IProductService {public boolean saveProductFromDBToES();public String deleteProduct(Integer productId);// 搜索引擎中的关键字// 返回满足条件的商品的数据+分页信息public Map<String,Object> getByNameAndInfo(String productName, String productInfo, Integer pageNum);}
ElasticSearchSpringDemoApplication.java
package com.example;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@MapperScan("com.example.mapper")
@EnableScheduling
public class ElasticSearchSpringDemoApplication {public static void main(String[] args) {SpringApplication.run(ElasticSearchSpringDemoApplication.class, args);}}
ServletInitializer.java
package com.example;import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(ElasticSearchSpringDemoApplication.class);}}
product.sql
/*Navicat Premium Data TransferSource Server : rootWindowsSource Server Type : MySQLSource Server Version : 80036Source Host : localhost:3306Source Schema : cloud_product_dbTarget Server Type : MySQLTarget Server Version : 80036File Encoding : 65001Date: 07/05/2024 18:49:44
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (`product_id` int(0) NOT NULL AUTO_INCREMENT,`product_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`product_price` decimal(10, 2) NULL DEFAULT NULL,`product_img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`product_count` int(0) NULL DEFAULT NULL,`create_time` datetime(0) NULL DEFAULT NULL,`update_time` datetime(0) NULL DEFAULT NULL,`product_info` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`product_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of product
-- ----------------------------SET FOREIGN_KEY_CHECKS = 1;
同步
增量同步:设计一个机制来跟踪数据库中的更改(如使用数据库的binlog日志),并仅同步自上次同步以来发生的更改。这通常比较复杂,但可以实现实时或近实时的数据同步。定期全量同步:可以定期(如每小时、每天)运行saveProductFromDBToES方法来进行全量同步。这种方法比较简单,但可能会导致数据在一定时间窗口内不同步。删除操作同步:在应用程序中添加逻辑,以便在数据库记录被删除时,也在Elasticsearch中删除相应的文档。这通常需要在数据库删除操作的地方添加额外的代码或使用触发器。使用监听器或事件驱动:如果使用的是支持事件驱动或变更数据捕获(CDC)的数据库或框架,可以配置监听器来捕获数据库更改事件,并据此更新Elasticsearch中的数据。
ProductMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.ProductMapper"></mapper>
application.yaml
# ???
server:servlet:context-path: /es_demospring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/cloud_product_db?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456elasticsearch:uris: localhost:9200connection-timeout: 5ssocket-timeout: 30s
pom.xml
<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>elasticSearchSpringDemo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>elasticSearchSpringDemo</name><description>elasticSearchSpringDemo</description><properties><java.version>1.8</java.version></properties><dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generate --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>8.11.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
相关文章:
001 定期同步mysql数据到es 删除数据库记录同时删除es记录 es全文搜索分词和高亮
文章目录 ProductController.javaProduct.javaElasticsearchSyncListener.javaProductElasticSearchMapper.javaProductMapper.javaProductDeletedEvent.javaProductServiceImpl.javaSyncProductService.javaIProductService.javaElasticSearchSpringDemoApplication.javaServl…...

Vue 快速入门:Vue初级
语法规则 前端渲染 渲染有几种方式:原生js、js模板、Vue模板语法 原生js 使用字符串拼接 js模板语法 Vue.js 模板语法概述 Vue.js 是一个用于构建用户界面的渐进式框架,其模板语法非常灵活和直观。Vue 的模板语法基于 HTML,可以通过指令…...

什么是IP跳变?
IP 跳跃(也称为 IP 跳动)的概念已引起使用代理访问网站的用户的极大关注。但 IP 跳跃到底是什么?为什么它对于各种在线活动至关重要? 在本文中,我们将深入探讨 IP 跳跃的世界,探索其实际应用、用例、潜在问…...

Linux服务器lvm磁盘管理fdisk和df磁盘大小不同修改
服务器端由于硬盘是通过VCenter原来100G磁盘复制的虚拟机,复制完成后,原来100G的磁盘通过选择 磁盘重新复制出150G的磁盘,开机后发现还是原来的100G的磁盘,通过fdisk -l 查看有个sdb是150G, 但是已经划转的lvm盘只有100G, 通过df查看也是原来的100G: pvs查看pv里也是10…...
AOP是什么和OOP的区别
AOP(Aspect-Oriented Programming,面向切面编程)和OOP(Object-Oriented Programming,面向对象编程)是两种不同的编程范式,它们在多个方面存在显著的差异。 编程思想: AOP࿱…...
Clickhouse 字符串函数 - 2
reverse 反转字符串。 reverseUTF8 以Unicode字符为单位反转UTF-8编码的字符串。如果字符串不是UTF-8编码,则可能获取到一个非预期的结果(不会抛出异常)。 format(pattern, s0, s1, …) 使用常量字符串pattern格式化其他参数。pat…...
【个人成长】Fitten Code 测试案例分析
JS,Fitten Code 当插件,然后在代码分析的时候,有些小感悟,大模型写代码的思路,正常我理解的代码思路。 输入代码 (item.score* 100).toFixed(0)Prompt 得出的结果 5分,如果超过100按100算输出结果 con…...
管理Anaconda虚拟环境的实用指南
Anaconda是一个开源的Python数据科学平台,它提供了一个管理包和环境的强大工具。在这篇文章中,我们将探讨如何在Anaconda中创建、克隆、切换和管理虚拟环境,以及如何升级Python版本和更新conda本身。 切换Anaconda环境 在Anaconda中&#x…...
python如何在图片上写斜体字
在Python中,直接在图片上写斜体文字通常不是图像库(如PIL或OpenCV)的内置功能,因为这些库主要关注于图像处理而非复杂的文本渲染。然而,你可以通过几种方式在图片上创建斜体效果: 使用PIL(Pytho…...

算法练习第22天|39. 组合总和、40.组合总和II
39. 组合总和 39. 组合总和 - 力扣(LeetCode)https://leetcode.cn/problems/combination-sum/description/ 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数…...
CCF PTA 2022年11月C++大富翁游戏
【问题描述】 小明很喜欢玩大富翁游戏,这个游戏的规则如下: 1、游戏地图是有 N 个格子,分别编号从 1 到 N。玩家一开始位于 1 号格子。 2、地图的每个格子上都有事件,事件有以下两种类型: A)罚款 x 枚金币…...
React获取form表单值的N种方式
Ref模式(非受控模式) 非钩子模式 1.createRef()方式 js: userNameElcreateRef() <input type"text" name"userName" ref{this.userNameEl} /> 获取值的方式: this.userNameEl.current.value2.refs(废弃) js: con…...

Apache Knox 2.0.0使用
目录 介绍 使用 gateway-site.xml users.ldif my_hdfs.xml my_yarn.xml 其它 介绍 The Apache Knox Gateway is a system that provides a single point of authentication and access for Apache Hadoop services in a cluster. The goal is to simplify Hadoop securit…...
Tomcat 内核详解 - Web服务器机制
详细介绍 Apache Tomcat 是一个开源的Web服务器和Servlet容器,它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件,它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。 Apac…...
几个人脸库对于面部动作识别的功能比较
经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(A…...

IDEA 使用Alibaba Cloud Toolkit 实现远程 自动部署
安装插件 maven方式部署 配置服务器主机信息 配置发布到主机 单击Select 单击run 就可以将选择module的jar文件上传到服务器的指定位置了 Alibaba Cloud Toolkit 上传文件的方式部署...
蓝桥杯备战15.完全二叉树的权值
P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int a[N]; signed main() {std::ios::sync_with_stdio(0),cin.ti…...
【前端】LayUI监听事件汇总
一、监听单选按钮事件 点击资源类型单选按钮时,请求后台接口,把接口返回的内容追加到选择资源下拉框内 HTML <div class"layui-form-item"><label class"layui-form-label">资源类型:</label><d…...
【多电压流程 Multivoltage Flow】- 5.特定工具使用建议(1.VCS NLP VC LP)
本章提供了关于使用Synopsys工具进行低功耗设计和分析的信息。它包含以下部分: • 使用VCS NLP和VC LP进行多电压验证 • 使用Design Compiler进行逻辑综合 • 使用IC Compiler进行设计规划 • 使用IC Compiler进行物理实现 • 使用IC Compiler II和Fusion Compiler进行物…...

Elasticsearch 实现word、pdf、txt、excel文档内容快速检索(保姆级教程)
本文主要讲解ES如何从提取文档中提取内容(word、pdf、txt、excel等文件类型),实现快速检索文档内容实现。 特别说明一下,为什么用7.10.0版本,因为在项目中除了精确匹配的要求,也会有模糊查询(关…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...