Elasticsearch 查询分析器简介

Elasticsearch 查询分析器简介

  • 一、Elasticsearch 查询分析器概述
    • 1.1 Elasticsearch 简介
    • 1.2 查询分析器的作用
  • 二、查询分析器类型
    • 2.1 Standard Analyzer
    • 2.2 Simple Analyzer
    • 2.3 Whitespace Analyzer
    • 2.4 Stop Analyzer
    • 2.5 Keyword Analyzer
    • 2.6 Pattern Analyzer
    • 2.7 语言分析器
      • 2.7.1 English Analyzer
      • 2.7.2 Chinese Analyzer
  • 三、自定义查询分析器
    • 3.1 自定义 Tokenizer
    • 3.2 自定义 Filter
    • 3.3 自定义 Analyzer
    • 3.4 使用自定义 Analyzer
  • 四、常见使用场景
    • 4.1 模糊搜索
    • 4.2 细粒度搜索
      • 4.2.1 前缀匹配
      • 4.2.2 通配符匹配
      • 4.2.3 正则表达式匹配
    • 4.3 多语言搜索
    • 4.4 数据清理和标准化
  • 五、调试和性能优化
    • 5.1 分析 Query Parsing 过程
    • 5.2 使用 Explain API 来查看匹配细节
    • 5.3 性能测试和优化

一、Elasticsearch 查询分析器概述

1.1 Elasticsearch 简介

Elasticsearch 是一个开源的分布式搜索和分析引擎,它提供了强大的查询和分析功能。它基于 Apache Lucene 构建,支持大规模数据的实时搜索,并具有高可用性和可扩展性。

1.2 查询分析器的作用

在 Elasticsearch 中,查询分析器负责处理用户搜索的输入,将文本进行分词并生成倒排索引。分析器在搜索过程中起到了关键作用,它们决定了搜索的准确性和效率。

二、查询分析器类型

2.1 Standard Analyzer

标准分析器是 Elasticsearch 默认的分析器,它使用了标准的分词器、小写转换器和停用词过滤器

// 创建查询分析器
Analyzer analyzer = new StandardAnalyzer();// 使用查询分析器进行分词
String text = "Elasticsearch is a distributed, RESTful search and analytics engine.";
TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 遍历分词结果
tokenStream.reset();
while (tokenStream.incrementToken()) {System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();

2.2 Simple Analyzer

简单分析器将输入文本按照非字母字符进行分词,并将所有的词转换成小写

// 创建查询分析器
Analyzer analyzer = new SimpleAnalyzer();// 使用查询分析器进行分词
String text = "Elasticsearch is a distributed, RESTful search and analytics engine.";
TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 遍历分词结果
tokenStream.reset();
while (tokenStream.incrementToken()) {System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();

2.3 Whitespace Analyzer

空格分析器根据空格进行分词,不进行任何其他处理

// 创建查询分析器
Analyzer analyzer = new WhitespaceAnalyzer();// 使用查询分析器进行分词
String text = "Elasticsearch is a distributed, RESTful search and analytics engine.";
TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 遍历分词结果
tokenStream.reset();
while (tokenStream.incrementToken()) {System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();

2.4 Stop Analyzer

停用词分析器移除一些常见的英文停用词,例如 “a”, “the”, “is” 等

// 创建查询分析器,指定停用词列表
Analyzer analyzer = new StopAnalyzer(CharArraySet.EMPTY_SET);// 使用查询分析器进行分词
String text = "Elasticsearch is a distributed, RESTful search and analytics engine.";
TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 遍历分词结果
tokenStream.reset();
while (tokenStream.incrementToken()) {System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();

2.5 Keyword Analyzer

关键词分析器将输入视为单个关键词,不进行分词和任何其他处理

// 创建查询分析器
Analyzer analyzer = new KeywordAnalyzer();// 使用查询分析器进行分词
String text = "Elasticsearch is a distributed, RESTful search and analytics engine.";
TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 遍历分词结果
tokenStream.reset();
while (tokenStream.incrementToken()) {System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();

2.6 Pattern Analyzer

模式分析器根据正则表达式来分词,它将输入文本匹配正则表达式的部分作为词汇

// 创建查询分析器,指定正则表达式
Analyzer analyzer = new PatternAnalyzer(Pattern.compile("\\W+"), true, true);// 使用查询分析器进行分词
String text = "Elasticsearch is a distributed, RESTful search and analytics engine.";
TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 遍历分词结果
tokenStream.reset();
while (tokenStream.incrementToken()) {System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();

2.7 语言分析器

语言分析器是针对不同语言的特定分析器,可以提供更好的分词和处理效果

2.7.1 English Analyzer

英语分析器基于英语特定的分词规则和处理方式

// 创建查询分析器
Analyzer analyzer = new EnglishAnalyzer();// 使用查询分析器进行分词
String text = "Elasticsearch is a distributed, RESTful search and analytics engine.";
TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 遍历分词结果
tokenStream.reset();
while (tokenStream.incrementToken()) {System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();

2.7.2 Chinese Analyzer

中文分析器基于中文特定的分词规则和处理方式

// 创建查询分析器
Analyzer analyzer = new SmartChineseAnalyzer();// 使用查询分析器进行分词
String text = "Elasticsearch is a distributed, RESTful search and analytics engine.";
TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 遍历分词结果
tokenStream.reset();
while (tokenStream.incrementToken()) {System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();

三、自定义查询分析器

3.1 自定义 Tokenizer

代码示例

import org.elasticsearch.index.analysis.Analyzer;
import org.elasticsearch.index.analysis.TokenizerFactory;class CustomTokenizerFactory extends TokenizerFactory {public CustomTokenizerFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {super(indexSettings, name, settings);}@Overridepublic Tokenizer create() {// 在这里实现自定义的 tokenizer 逻辑return new CustomTokenizer();}
}class CustomTokenizer implements Tokenizer {// 实现自定义 tokenizer 的逻辑@Overridepublic Token next() throws IOException {// 返回下一个 token}
}

3.2 自定义 Filter

代码示例

import org.elasticsearch.index.analysis.TokenFilterFactory;class CustomFilterFactory extends TokenFilterFactory {public CustomFilterFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {super(indexSettings, name, settings);}@Overridepublic TokenStream create(TokenStream tokenStream) {// 在这里实现自定义的 filter 逻辑return new CustomFilter(tokenStream);}
}class CustomFilter extends TokenFilter {public CustomFilter(TokenStream tokenStream) {super(tokenStream);}@Overridepublic Token next(Token reusableToken) throws IOException {// 实现自定义 filter 的逻辑}
}

3.3 自定义 Analyzer

代码示例

import org.elasticsearch.index.analysis.TokenFilterFactory;
import org.elasticsearch.index.analysis.TokenizerFactory;
import org.elasticsearch.index.analysis.Analyzer;
import org.elasticsearch.index.analysis.Tokenizer;class CustomAnalyzerProvider extends AbstractIndexAnalyzerProvider<Analyzer> {private final Analyzer analyzer;public CustomAnalyzerProvider(IndexSettings indexSettings, Environment environment, String name, Settings settings) {super(indexSettings, name, settings);TokenizerFactory tokenizerFactory = new CustomTokenizerFactory(indexSettings, environment, name, settings);TokenFilterFactory tokenFilterFactory = new CustomFilterFactory(indexSettings, environment, name, settings);this.analyzer = new CustomAnalyzer(tokenizerFactory, tokenFilterFactory);}@Overridepublic Analyzer get() {return this.analyzer;}
}class CustomAnalyzer extends Analyzer {private final TokenizerFactory tokenizerFactory;private final TokenFilterFactory tokenFilterFactory;public CustomAnalyzer(TokenizerFactory tokenizerFactory, TokenFilterFactory tokenFilterFactory) {this.tokenizerFactory = tokenizerFactory;this.tokenFilterFactory = tokenFilterFactory;}@Overrideprotected TokenStreamComponents createComponents(String fieldName) {Tokenizer tokenizer = tokenizerFactory.create();TokenStream tokenStream = tokenFilterFactory.create(tokenizer);return new TokenStreamComponents(tokenizer, tokenStream);}
}

3.4 使用自定义 Analyzer

代码示例

import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;// 创建 TransportClient
Settings settings = Settings.builder().put("cluster.name", "your_cluster_name").build();
TransportClient client = new PreBuiltTransportClient(settings);// 添加节点地址
client.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("your_host_name", 9300)));// 创建自定义 Analyzer 查询
QueryBuilder query = QueryBuilders.matchQuery("your_field", "your_query_text").analyzer("your_custom_analyzer");// 执行搜索操作
SearchResponse response = client.prepareSearch("your_index_name").setQuery(query).execute().actionGet();

四、常见使用场景

4.1 模糊搜索

模糊搜索,是指根据用户提供的关键词在搜索时进行近似匹配,而非完全精确匹配。在 Elasticsearch 中,可以使用 Fuzzy Query 实现模糊搜索。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("field", "keyword").fuzziness(Fuzziness.AUTO).prefixLength(3).maxExpansions(10);
searchSourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest("index");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  • field 是需要进行模糊搜索的字段名称。
  • keyword 是用户提供的关键词。
  • fuzziness 参数指定了模糊匹配的程度,Fuzziness.AUTO 表示自动选择最佳匹配程度。
  • prefixLength 参数指定了模糊匹配时前缀的最小长度。
  • maxExpansions 参数指定了在扩展搜索条件时的最大扩展次数。

4.2 细粒度搜索

细粒度搜索,是指根据用户提供的关键词进行精确匹配,包括前缀匹配、通配符匹配和正则表达式匹配。

4.2.1 前缀匹配

前缀匹配,是指根据用户提供的关键词匹配字段值的前缀。在 Elasticsearch 中,可以使用 Prefix Query 实现前缀匹配。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.prefixQuery("field", "prefix");
searchSourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest("index");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  • field 是需要进行前缀匹配的字段名称。
  • prefix 是用户提供的前缀关键词。

4.2.2 通配符匹配

通配符匹配,是指根据用户提供的带有通配符的关键词进行匹配。在 Elasticsearch 中,可以使用 Wildcard Query 实现通配符匹配。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("field", "keyword*");
searchSourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest("index");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  • field 是需要进行通配符匹配的字段名称。
  • keyword* 是用户提供的带有通配符的关键词,* 表示匹配任意多个字符。

4.2.3 正则表达式匹配

正则表达式匹配,是指根据用户提供的正则表达式进行匹配。在 Elasticsearch 中,可以使用 Regexp Query 实现正则表达式匹配。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.regexpQuery("field", "regex");
searchSourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest("index");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  • field 是需要进行正则表达式匹配的字段名称。
  • regex 是用户提供的正则表达式。

4.3 多语言搜索

多语言搜索,是指根据用户提供的关键词进行跨语言的搜索。在 Elasticsearch 中,可以使用 MultiMatch Query 实现多语言搜索。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("keyword", "field1", "field2");
searchSourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest("index");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  • keyword 是用户提供的关键词。
  • field1field2 是需要进行搜索的字段名称列表。

4.4 数据清理和标准化

数据清理和标准化,是指对用户提供的关键词进行处理,使其符合特定规范,以便更好地匹配。在 Elasticsearch 中,可以使用 Analyzers 和 Tokenizers 实现数据清理和标准化。

String keyword = "原始关键词";
AnalyzeRequest analyzeRequest = AnalyzeRequest.withGlobalAnalyzer("index", keyword);
AnalyzeResponse analyzeResponse = client.indices().analyze(analyzeRequest, RequestOptions.DEFAULT);
List<AnalyzeResponse.AnalyzeToken> tokens = analyzeResponse.getTokens();
for (AnalyzeResponse.AnalyzeToken token : tokens) {System.out.println(token.getTerm());
}
  • keyword 是用户提供的原始关键词。
  • index 是需要进行数据清理和标准化的索引名称。

以上就是 Elasticsearch 查询分析器的简要介绍以及常见使用场景的示例代码。通过这些查询类型和数据处理功能,可以实现高效、准确的搜索和分析。

五、调试和性能优化

5.1 分析 Query Parsing 过程

在 Elasticsearch 中,查询的解析过程是将查询字符串转换为查询对象的过程。为了分析查询解析过程,可以使用 Elasticsearch 的 SearchRequest 对象的 source 方法来传递搜索请求的源代码。

SearchRequest searchRequest = new SearchRequest("your_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("field_name", "search_query"));
searchRequest.source(sourceBuilder);

5.2 使用 Explain API 来查看匹配细节

对于调试和查看查询的匹配细节,可以使用 Elasticsearch 的 Explain API。Explain API 接受一个搜索请求并返回与该请求匹配的文档,以及有关如何计算匹配度的详细信息。

ExplainRequest explainRequest = new ExplainRequest("your_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("field_name", "search_query"));
explainRequest.source(sourceBuilder);

5.3 性能测试和优化

性能测试是评估 Elasticsearch 集群查询性能的一种方法。可以使用 Elasticsearch 的搜索 Profile 来帮助识别潜在的性能问题。

SearchRequest searchRequest = new SearchRequest("your_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("field_name", "search_query"));
sourceBuilder.profile(true);
searchRequest.source(sourceBuilder);

除了性能测试,还可以使用 Elasticsearch 的 Warmers 来优化搜索性能。Warmers 是一种预热索引的机制,它可以事先计算某些搜索的结果并缓存这些结果,以提高后续的搜索性能。

PutWarmersRequest putWarmersRequest = new PutWarmersRequest("your_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("field_name", "search_query"));
SearchRequest searchRequest = new SearchRequest("your_index");
searchRequest.source(sourceBuilder);
putWarmersRequest.addWarmers("your_warmer", searchRequest);

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

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

相关文章

【C语言】杨氏矩阵中寻找元素

题目名称&#xff1a; 杨氏矩阵 题目内容&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从下到上递增的&#xff08;杨氏矩阵的定义&#xff09;&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 形如这样的矩阵就是杨氏…

[USACO21DEC] Convoluted Intervals S

洛谷[USACO21DEC] Convoluted Intervals S 题目大意 有 n n n个区间&#xff0c;第 i i i个区间为 [ a i , b i ] [a_i,b_i] [ai​,bi​]&#xff0c;都在 [ 0 , m ] [0,m] [0,m]上。对于每一个 k ∈ [ 0 , 2 m ] k\in [0,2m] k∈[0,2m]&#xff0c;求满足 a i a j ≤ k ≤ …

关于贪心算法的一个小结

下面的内容主要参考了数据结构与算法之美。 贪心算法的应用有&#xff1a; 霍夫曼编码&#xff08;Huffman Coding&#xff09; Prim和Kruskal最小生成树算法 01背包问题(当允许取部分物品的时候) 分糖果 我们有m个糖果和n个孩子。我们现在要把糖果分给这些孩子吃&#xff…

MySQL是否解决幻读问题

MySQL是否解决幻读问题 MySQL事务隔离级别 ✓ 读未提交&#xff08;Read Uncommitted&#xff09;&#xff1a;最低的隔离级别&#xff0c;会读取到其他事务还未提交的内容&#xff0c;存在脏读。 ✓ 读已提交&#xff08;Read Committed&#xff09;&#xff1a;读取到的内容都…

chatglm微调

chatGML 看到 【【官方教程】ChatGLM-6B 微调&#xff1a;P-Tuning&#xff0c;LoRA&#xff0c;Full parameter】 【精准空降到 15:27】 https://www.bilibili.com/video/BV1fd4y1Z7Y5/?share_sourcecopy_web&vd_sourceaa8c13cff97f0454ee41e1f609a655f1&t927 记得看…

npm 加速 国内镜像源

一、修改成腾讯云镜像源 1、命令 npm config set registry http://mirrors.cloud.tencent.com/npm/ 验证命令 npm config get registry 如果返回http://mirrors.cloud.tencent.com/npm/&#xff0c;说明镜像配置成功。 二、修改成淘宝镜像源 命令 npm config set regist…

一文了解Docker之网络模型

目录 1.Docker网络 1.1 Docker网络模型概述 1.2 Docker网络驱动程序 1.2.1 host模式 1.2.2 bridge模式 1.2.3 container模式 1.2.4 none模式 1.3 Docker网络命令示例 1.3.1 创建一个自定义网络 1.3.2 列出所有网络 1.3.3 连接容器到网络 1.3.4 断开容器与网络的连接…

SpringCloud(三)LoadBalancer负载均衡

一、负载均衡 实际上&#xff0c;在添加LoadBalanced注解之后&#xff0c;会启用拦截器对我们发起的服务调用请求进行拦截&#xff08;注意这里是针对我们发起的请求进行拦截&#xff09;&#xff0c;叫做LoadBalancerInterceptor&#xff0c;它实现ClientHttpRequestIntercep…

Android 系统的分区介绍

由于Android系统采用Linux架构&#xff0c;所以Android的系统分区可以类比同样采用Linux架构的操作系统&#xff08;如Windows&#xff09;。 Android系统分区分类 现在一般常见的Android分区方式共有三种&#xff0c;在不同的Android系统版本上会采用不同的分区方式。 1、传…

Postman接口自动化之postman脚本编写

这是之前搞的接口自动化方案&#xff0c;已经在业务测试中实现了使用postman编写接口脚本&#xff0c;通过GitHubJenkinsemail html report实现了接口自动化&#xff0c;现在分块整理一下。 postman脚本编写 1、创建集合 和 目录&#xff1a; 一条业务线下的接口可以放到一个…

Android adb说明与详解

Android adb 说明与详解 Android Debug Bridge&#xff08;ADB&#xff09;是一个非常有用的工具&#xff0c;它可以帮助开发人员在Android设备和计算机之间进行通信&#xff0c;以便在设备上进行调试、测试和安装应用程序。 1. 安装ADB 在使用ADB之前&#xff0c;您需要安装…

sonarqube安装并配置CI/CD

sonarqube安装使用 目录 简介效果(配置在下面查看)官方文档环境准备配置compose-sonarqube.yml启动登录集成Gitlab 获取私钥sonarqube配置gitlab查看项目 配置 手动方式Gitlab CI/CD 自动检测 简介 SonarQube是一个开源的代码质量管理平台&#xff0c;用于对代码进行静态代…

【数学建模】——相关系数

第一部分&#xff1a;皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数&#xff1a;皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小&#xff0c;根据数组满足的不同条件&#xff0c;我们要选…

Monocular 3D Object Detection with Depth from Motion 论文学习

论文链接&#xff1a;Monocular 3D Object Detection with Depth from Motion 1. 解决了什么问题&#xff1f; 从单目输入感知 3D 目标对于自动驾驶非常重要&#xff0c;因为单目 3D 的成本要比多传感器的方案低许多。但单目方法很难取得令人满意的效果&#xff0c;因为单张图…

QT之智能指针

如果没有智能指针&#xff0c;程序员必须保证new对象能在正确的时机delete&#xff0c;四处编写异常捕获代码以释放资源&#xff0c;而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会…

封装React组件DragLine,鼠标拖拽的边框改变元素宽度

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 合集地址 在项目中&#xff0c;设计说想做个面板&#xff0c;其宽度随鼠标拖拽而变化&#xff0c;有最大最小值。基于这个小功能封装一个可拖拽组件&#xff0c;在需要的地方引入即可。 思路 这里只是实现x方向…

java学习路程之篇三、知识点、类、模块、项目、操作、下载、安装、IDEA

文章目录 1、IDEA开发工具2、IDEA的下载和安装3、IDEA中的第一个代码4、IDEAZ中的类、模块、项目的操作 1、IDEA开发工具 2、IDEA的下载和安装 3、IDEA中的第一个代码 4、IDEAZ中的类、模块、项目的操作

创建型设计模式-2.工厂设计模式

创建型设计模式-2.工厂设计模式 一、示例代码 下面是一个没有使用工厂设计模式的例子&#xff0c;ResourceLoader 类负责根据 URL 的前缀来加载资源。根据不同的前缀&#xff0c;它执行不同的操作来创建 Resource 对象。这导致了以下问题&#xff1a; 代码冗余&#xff1a;在…

【计算机视觉 | 图像分类】arxiv 计算机视觉关于图像分类的学术速递(7 月 17 日论文合集)

文章目录 一、分类|识别相关(11篇)1.1 Multimodal Distillation for Egocentric Action Recognition1.2 Dual-Query Multiple Instance Learning for Dynamic Meta-Embedding based Tumor Classification1.3 Interactive Spatiotemporal Token Attention Network for Skeleton-…

【面试官】说说你对闭包的理解

说说你对闭包的理解 闭包是什么闭包的三个特性优缺点应用场景javascript的垃圾回收原理:通常情况下有两种实现方式垃圾回收原理的缺陷GC优化策略 闭包是什么 闭包就是能够读取其他函数内部变量的函数闭包是指有权访问另一个函数作用域中变量的函数&#xff0c;创建闭包的最常见…