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

【Elasticsearch】搜索类型介绍,以及使用SpringBoot实现,并展现给前端

Elasticsearch 提供了多种查询类型,每种查询类型适用于不同的搜索场景。以下是八种常见的 Elasticsearch 查询类型及其详细说明和示例。

1. Match Query

用途:用于全文搜索,会对输入的文本进行分词,并在索引中的字段中查找这些分词。 特点:支持模糊匹配、短语匹配等。

示例

json

GET /my_index/_search
{"query": {"match": {"content": "quick brown fox"}}
}

2. Term Query

用途:用于精确匹配,不会对输入的文本进行分词。 特点:适用于关键词、ID 等不需要分词的情况。

示例

json

GET /my_index/_search
{"query": {"term": {"status": "active"}}
}

3. Terms Query

用途:用于在一个字段上匹配多个值。 特点:类似于 SQL 中的 IN 操作符。

示例

json

GET /my_index/_search
{"query": {"terms": {"tags": ["news", "sports"]}}
}

4. Range Query

用途:用于范围查询,可以指定数值或日期范围。 特点:适用于数值型字段和日期字段。

示例

json

GET /my_index/_search
{"query": {"range": {"age": {"gte": 18,"lte": 30}}}
}

5. Bool Query

用途:组合多个查询条件,支持 must(必须满足)、should(应该满足)、must_not(必须不满足)和 filter(过滤)子句。 特点:灵活性高,可以构建复杂的查询逻辑。

示例

json

GET /my_index/_search
{"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" } },{ "range": { "date": { "gte": "now-1y/d" }}}],"filter": [{ "term": { "status": "published" }}]}}
}

6. Wildcard Query

用途:使用通配符进行匹配。 特点:支持 *? 通配符,但性能较差,应谨慎使用。

示例

json

GET /my_index/_search
{"query": {"wildcard": {"name": "joh*"}}
}

7. Fuzzy Query

用途:用于近似匹配,允许一定数量的拼写错误。 特点:适用于拼写错误较多的搜索场景。

示例
GET /my_index/_search
{"query": {"fuzzy": {"username": {"value": "kenneth","fuzziness": "AUTO"}}}
}

8. Match Phrase Query

用途:用于精确匹配整个短语。 特点:不会对短语进行分词,要求短语完全一致。

示例

json

GET /my_index/_search
{"query": {"match_phrase": {"description": "Elasticsearch search engine"}}
}

总结

每种查询类型都有其特定的应用场景和优缺点:

  • Match Query:适合全文搜索。
  • Term Query:适合精确匹配。
  • Terms Query:适合多值匹配。
  • Range Query:适合范围查询。
  • Bool Query:适合复杂查询逻辑。
  • Wildcard Query:适合通配符匹配,性能较低。
  • Fuzzy Query:适合拼写错误匹配。
  • Match Phrase Query:适合精确短语匹配。

通过合理选择和组合这些查询类型,可以实现高效且灵活的搜索功能。

参考资料

  • Elasticsearch 官方文档
  • Elasticsearch 查询 DSL 指南

这些资源提供了更多关于 Elasticsearch 查询类型的详细信息和示例,帮助你更好地理解和使用这些查询

为了实现八种 Elasticsearch 查询类型并在 Web 前端展示结果,我们可以使用 Spring Boot 构建后端服务,并使用 Thymeleaf 作为模板引擎来构建前端页面。以下是一个完整的示例,展示如何实现这八种查询类型并将结果显示在 Web 前端。

项目结构

spring-boot-elasticsearch-demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           ├── controller/
│   │   │           │   └── SearchController.java
│   │   │           ├── model/
│   │   │           │   └── Document.java
│   │   │           ├── repository/
│   │   │           │   └── DocumentRepository.java
│   │   │           ├── service/
│   │   │           │   └── SearchService.java
│   │   │           └── SpringBootElasticsearchDemoApplication.java
│   │   └── resources/
│   │       ├── application.yml
│   │       ├── static/
│   │       └── templates/
│   │           └── search.html
├── pom.xml

1. 添加依赖

pom.xml 中添加必要的依赖:

xml

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.6.2</version></dependency>
</dependencies>

2. 配置文件

src/main/resources/application.yml 中配置 Elasticsearch 连接信息:

yaml

spring:elasticsearch:rest:uris: http://localhost:9200server:port: 8080

3. 实体类

创建一个实体类 Document.java 表示索引中的文档:

java

package com.example.model;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;@Data
@Document(indexName = "documents")
public class Document {@Idprivate String id;@Field(type = FieldType.Text)private String title;@Field(type = FieldType.Text)private String content;@Field(type = FieldType.Integer)private Integer age;@Field(type = FieldType.Date)private String date;@Field(type = FieldType.Keyword)private String status;@Field(type = FieldType.Keyword)private String[] tags;@Field(type = FieldType.Keyword)private String username;
}

4. Repository 接口

创建一个 Repository 接口 DocumentRepository.java

java

package com.example.repository;import com.example.model.Document;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;public interface DocumentRepository extends ElasticsearchRepository<Document, String> {
}

5. Service 层

创建一个 Service 类 SearchService.java 来处理各种查询逻辑:

java

package com.example.service;import com.example.model.Document;
import com.example.repository.DocumentRepository;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;@Service
public class SearchService {@Autowiredprivate RestHighLevelClient client;public List<Document> matchQuery(String field, String query) throws IOException {SearchRequest searchRequest = new SearchRequest("documents");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery(field, query);sourceBuilder.query(matchQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public List<Document> termQuery(String field, String value) throws IOException {SearchRequest searchRequest = new SearchRequest("documents");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(field, value);sourceBuilder.query(termQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public List<Document> termsQuery(String field, List<String> values) throws IOException {SearchRequest searchRequest = new SearchRequest("documents");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery(field, values);sourceBuilder.query(termsQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public List<Document> rangeQuery(String field, Object gte, Object lte) throws IOException {SearchRequest searchRequest = new SearchRequest("documents");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(field).gte(gte).lte(lte);sourceBuilder.query(rangeQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public List<Document> boolQuery(Map<String, Object> mustQueries, Map<String, Object> shouldQueries, Map<String, Object> mustNotQueries) throws IOException {SearchRequest searchRequest = new SearchRequest("documents");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();if (mustQueries != null) {for (Map.Entry<String, Object> entry : mustQueries.entrySet()) {boolQueryBuilder.must(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));}}if (shouldQueries != null) {for (Map.Entry<String, Object> entry : shouldQueries.entrySet()) {boolQueryBuilder.should(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));}}if (mustNotQueries != null) {for (Map.Entry<String, Object> entry : mustNotQueries.entrySet()) {boolQueryBuilder.mustNot(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));}}sourceBuilder.query(boolQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public List<Document> wildcardQuery(String field, String value) throws IOException {SearchRequest searchRequest = new SearchRequest("documents");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery(field, value);sourceBuilder.query(wildcardQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public List<Document> fuzzyQuery(String field, String value) throws IOException {SearchRequest searchRequest = new SearchRequest("documents");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery(field, value);sourceBuilder.query(fuzzyQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public List<Document> matchPhraseQuery(String field, String phrase) throws IOException {SearchRequest searchRequest = new SearchRequest("documents");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery(field, phrase);sourceBuilder.query(matchPhraseQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}private List<Document> getDocumentsFromResponse(SearchResponse searchResponse) {List<Document> documents = new ArrayList<>();searchResponse.getHits().forEach(hit -> {Document document = new Document();document.setId(hit.getId());document.setTitle((String) hit.getSourceAsMap().get("title"));document.setContent((String) hit.getSourceAsMap().get("content"));document.setAge((Integer) hit.getSourceAsMap().get("age"));document.setDate((String) hit.getSourceAsMap().get("date"));document.setStatus((String) hit.getSourceAsMap().get("status"));document.setTags((String[]) hit.getSourceAsMap().get("tags"));document.setUsername((String) hit.getSourceAsMap().get("username"));documents.add(document);});return documents;}
}

6. Controller 层

创建一个 Controller 类 SearchController.java 来处理 HTTP 请求并返回结果:

java

package com.example.controller;import com.example.model.Document;
import com.example.service.SearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Controller
public class SearchController {@Autowiredprivate SearchService searchService;@GetMapping("/search")public String search(@RequestParam(required = false) String queryType,@RequestParam(required = false) String field,@RequestParam(required = false) String query,@RequestParam(required = false) String value,@RequestParam(required = false) String gte,@RequestParam(required = false) String lte,@RequestParam(required = false) String[] values,Model model) throws IOException {List<Document> results = null;switch (queryType) {case "match":results = searchService.matchQuery(field, query);break;case "term":results = searchService.termQuery(field, value);break;case "terms":results = searchService.termsQuery(field, List.of(values));break;case "range":results = searchService.rangeQuery(field, gte, lte);break;case "bool":Map<String, Object> mustQueries = new HashMap<>();Map<String, Object> shouldQueries = new HashMap<>();Map<String, Object> mustNotQueries = new HashMap<>();if (field != null && query != null) {mustQueries.put(field, query);}results = searchService.boolQuery(mustQueries, shouldQueries, mustNotQueries);break;case "wildcard":results = searchService.wildcardQuery(field, value);break;case "fuzzy":results = searchService.fuzzyQuery(field, value);break;case "match_phrase":results = searchService.matchPhraseQuery(field, query);break;default:// Handle default case or throw an exceptionbreak;}model.addAttribute("results", results);return "search";}
}

7. 前端页面

创建一个 Thymeleaf 模板 search.html 来展示搜索结果:

html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Elasticsearch Queries</title><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5"><h1>Elasticsearch Queries</h1><form method="get" action="/search"><div class="form-group"><label for="queryType">Query Type:</label><select class="form-control" id="queryType" name="queryType"><option value="match">Match</option><option value="term">Term</option><option value="terms">Terms</option><option value="range">Range</option><option value="bool">Bool</option><option value="wildcard">Wildcard</option><option value="fuzzy">Fuzzy</option><option value="match_phrase">Match Phrase</option></select></div><div class="form-group"><label for="field">Field:</label><input type="text" class="form-control" id="field" name="field"></div><div class="form-group"><label for="query">Query:</label><input type="text" class="form-control" id="query" name="query"></div><div class="form-group"><label for="value">Value:</label><input type="text" class="form-control" id="value" name="value"></div><div class="form-group"><label for="gte">GTE:</label><input type="text" class="form-control" id="gte" name="gte"></div><div class="form-group"><label for="lte">LTE:</label><input type="text" class="form-control" id="lte" name="lte"></div><div class="form-group"><label for="values">Values (comma separated):</label><input type="text" class="form-control" id="values" name="values"></div><button type="submit" class="btn btn-primary">Search</button></form><hr><h2>Results:</h2><table class="table table-striped"><thead><tr><th>ID</th><th>Title</th><th>Content</th><th>Age</th><th>Date</th><th>Status</th><th>Tags</th><th>Username</th></tr></thead><tbody><tr th:each="document : ${results}"><td th:text="${document.id}"></td><td th:text="${document.title}"></td><td th:text="${document.content}"></td><td th:text="${document.age}"></td><td th:text="${document.date}"></td><td th:text="${document.status}"></td><td th:text="${#strings.arrayJoin(document.tags, ', ')}"></td><td th:text="${document.username}"></td></tr></tbody></table>
</div>
</body>
</html>

8. 启动类

创建启动类 SpringBootElasticsearchDemoApplication.java

java

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootElasticsearchDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootElasticsearchDemoApplication.class, args);}
}

9. 测试数据

确保 Elasticsearch 中有一些测试数据以便进行查询。你可以使用 Kibana 或 curl 命令插入一些文档到 documents 索引中。

示例文档

json

POST /documents/_doc/1
{"title": "Introduction to Elasticsearch","content": "Elasticsearch is a distributed, RESTful search and analytics engine.","age": 5,"date": "2023-01-01","status": "published","tags": ["elasticsearch", "search"],"username": "john_doe"
}POST /documents/_doc/2
{"title": "Advanced Elasticsearch Techniques","content": "Learn advanced techniques in Elasticsearch for better performance.","age": 3,"date": "2023-06-15","status": "draft","tags": ["elasticsearch", "advanced"],"username": "jane_smith"
}

10. 运行项目

  1. 启动 Elasticsearch:确保 Elasticsearch 服务器正在运行。
  2. 插入测试数据:使用上述示例文档插入测试数据。
  3. 启动 Spring Boot 应用

bash

./mvnw spring-boot:run

4.访问应用:打开浏览器,访问 http://localhost:8080/search

使用说明

在前端页面中,可以选择不同的查询类型并输入相应的参数,点击“Search”按钮即可查看查询结果。以下是每种查询类型的示例参数:

  • Match Query

    • Query Type: match
    • Field: content
    • Query: introduction
  • Term Query

    • Query Type: term
    • Field: status
    • Value: published
  • Terms Query

    • Query Type: terms
    • Field: tags
    • Values: elasticsearch,search
  • Range Query

    • Query Type: range
    • Field: age
    • GTE: 1
    • LTE: 5
  • Bool Query

    • Query Type: bool
    • Field: status
    • Query: published
  • Wildcard Query

    • Query Type: wildcard
    • Field: username
    • Value: john*
  • Fuzzy Query

    • Query Type: fuzzy
    • Field: username
    • Value: jon_doe
  • Match Phrase Query

    • Query Type: match_phrase
    • Field: title
    • Query: Introduction to Elasticsearch

通过这种方式,你可以在 Web 前端展示和测试八种常见的 Elasticsearch 查询类型。

相关文章:

【Elasticsearch】搜索类型介绍,以及使用SpringBoot实现,并展现给前端

Elasticsearch 提供了多种查询类型&#xff0c;每种查询类型适用于不同的搜索场景。以下是八种常见的 Elasticsearch 查询类型及其详细说明和示例。 1. Match Query 用途&#xff1a;用于全文搜索&#xff0c;会对输入的文本进行分词&#xff0c;并在索引中的字段中查找这些分…...

K8S中的Pod调度之亲和性调度

亲和性调度 亲和性调度是一种比硬性指定节点&#xff08;使用 nodeName 或 nodeSelector&#xff09;更灵活的调度策略&#xff0c;它允许定义一组规则&#xff0c;根据这些规则&#xff0c;调度器会尝试将 Pod 调度到最合适的节点上&#xff0c;但如果找不到完全匹配的节点&a…...

高等数学学习笔记 ☞ 不定积分的积分法

1. 第一换元积分法 1. 基础概念&#xff1a;形如的过程&#xff0c;称为第一换元积分法。 2. 核心思想&#xff1a;通过对被积函数的观察(把被积函数的形式与积分表的积分公式进行比较)&#xff0c;把外部的部分项拿到的内部(求原函数)&#xff0c; 然后进行拼凑&#xff0c;…...

【HTTP】详解

目录 HTTP 基本概念啥是HTTP&#xff0c;有什么用&#xff1f;一次HTTP请求的过程当你在浏览器中输入一个浏览器地址&#xff0c;它会发送什么 &#xff1f;---&#xff08;底层流程&#xff09;HTTP的协议头请求头&#xff08;对应客户端&#xff09;一些请求头请求方法 响应头…...

cursor重构谷粒商城01——为何要重构谷粒商城

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…...

如何在 ASP.NET Core 中实现速率限制?

在 ASP.NET Core 中实现速率限制&#xff08;Rate Limiting&#xff09;中间件可以帮助你控制客户端对 API 的请求频率&#xff0c;防止滥用和过载。速率限制通常用于保护服务器资源&#xff0c;确保服务的稳定性和可用性。 ASP.NET Core 本身并没有内置的速率限制中间件&…...

STM32-笔记43-低功耗

一、什么是低功耗&#xff1f; 低功耗‌是指通过优化设计和采用特定的技术手段&#xff0c;降低电子设备在运行过程中消耗的能量&#xff0c;从而延长电池寿命、提高性能和减少发热。低功耗设计主要从芯片设计和系统设计两个方面进行&#xff0c;旨在减少所有器件的功率损耗&am…...

Facebook 隐私风波:互联网时代数据安全警钟

在社交媒体飞速发展的今天&#xff0c;个人数据的隐私保护已成为全球关注的焦点。作为全球最大的社交平台之一&#xff0c;Facebook面临的隐私问题&#xff0c;尤其是数据泄露事件&#xff0c;频繁引发公众的广泛讨论。从用户信息被滥用到数据泄漏&#xff0c;Facebook的隐私挑…...

Java 中的 ZoneOffset

介绍 在我们的这个世界上因为地球是圆的&#xff0c;所以每个国家都会有自己特定的时区。 时区在我们对时间的使用上扮演了非常重要的角色。但又因为时区的存在&#xff0c;又给我们带来了很多的麻烦&#xff0c;比如北美地区使用的夏令时和中国统一使用东 8 区的时间等。 当…...

amis模板语法、数据映射与表达式

模板字符串 表达式中获取变量 可以支持在普通文本中&#xff0c;使用数据映射语法&#xff1a;${xxx} 获取数据域中变量的值 "Hello ${text}"渲染 html 使用数据映射语法&#xff1a;${xxx} 获取数据域中变量的值&#xff0c;并渲染 HTML "<h1>Hello<…...

频域增强通道注意力机制EFCAM模型详解及代码复现

背景与动机 在深度学习领域,如何有效处理时间序列数据一直是一个重要的研究方向。近年来, 频域分析技术 在时间序列处理中展现出了巨大潜力,特别是离散余弦变换(DCT)因其能够高效捕捉低频信息并避免高频噪声干扰而受到广泛关注。 FECAM模型的开发正是基于这一背景,旨在…...

GitLab 国际站中国大陆等地区停服,如何将数据快速迁移到云效

代码托管平台 GitLab 国际站&#xff08;GitLab.com&#xff09;近日发布公告&#xff0c;官宣即将停止对中国大陆、香港、澳门地区的用户账号提供服务&#xff0c;并提供 60 天过渡期自行迁移账户数据&#xff0c;超期未迁移的账号可能会被 GitLab 清除。这一重要决策引起了全…...

BPG图像库和实用程序(译)

1)快速介绍 编辑Makefile以更改编译选项&#xff08;默认编译选项对于Linux应该是OK的&#xff09;。输入make来编译&#xff0c;输入make install来安装编译后的二进制文件。bpgview&#xff1a;为了编译它&#xff0c;你需要安装SDL和SDL_image库。Emscripten的使用&#xff…...

简述1个业务过程:从客户端调用接口,再到调用中间件(nacos、redis、kafka、feign),数据库的过程

以下是一个常见的业务过程示例&#xff0c;展示了从客户端调用接口&#xff0c;再到调用中间件&#xff08;Nacos、Redis、Kafka、Feign&#xff09;和数据库的过程&#xff1a; 假设我们有一个电商系统&#xff0c;客户端要查询某个商品的详细信息&#xff0c;这个商品信息可…...

01.02、判定是否互为字符重排

01.02、[简单] 判定是否互为字符重排 1、题目描述 给定两个由小写字母组成的字符串 s1 和 s2&#xff0c;请编写一个程序&#xff0c;确定其中一个字符串的字符重新排列后&#xff0c;能否变成另一个字符串。 在这道题中&#xff0c;我们的任务是判断两个字符串 s1 和 s2 是…...

什么是.NET中的反射,它有哪些应用场景

反射是.NET框架提供的一种强大的机制&#xff0c;它允许程序在运行时查询和操作对象的类型信息。以下是对.NET中反射的详细解释及其应用场景&#xff1a; 一、反射的定义 在.NET中&#xff0c;所有类型的信息&#xff08;包括类、结构、委托、接口、枚举等以及它们的成员信息…...

Linux离线部署ELK

文章目录 前期准备开始安装安装elastic search安装logstash安装kibana 配置ELK配置ElasticSearch配置logstash配置kibana 启动ELK启动命令启动测试 设置ELK策略创建ILM策略将ILM策略与日志index关联查看索引是否被ILM策略管理 前期准备 ELK包含三部分软件 ElasticSearch用作搜…...

解决 chls.pro/ssl 无法进入问题

使用charles的xdm不知道有没有遇到这样的问题。手机上访问 chls.pro/ssl 就始终进不去了… 各种检查&#xff0c;ip地址、证书&#xff0c;ssl设置等等都正常&#xff0c;就是进不去。 在一位好心人的提醒下得到了一个解决办法。那就是换一个地址 最新地址是: charlesproxy…...

Rust 游戏开发框架指南

Rust 游戏开发框架指南 主流游戏引擎 1. Bevy 最受欢迎的 Rust 游戏引擎之一&#xff0c;基于 ECS&#xff08;实体组件系统&#xff09;架构。 特点&#xff1a; &#x1f680; 高性能 ECS 系统&#x1f4e6; 热重载支持&#x1f3a8; 现代渲染器&#x1f50a; 内置音频系…...

hadoop3.3和hive4.0安装——单节点

hadoop3.3x和hive4.0安装部署 为什么我要安装hive4.0&#xff0c;因为阿里云镜像只有hive4.0 软件相互兼容性版本 系统centos7 uname -a如果内核3.0以上可以用 安装jdk1.8以上的版本&#xff08;配置好环境变量&#xff09; hadoop3.3.x与hive4.0.x 创建目录 mkdir -p /us…...

centos安装golang

1.下载golang golang所有版本网址 https://studygolang.com/dl //下载并解压到/usr/local文件下 wget https://studygolang.com/dl/golang/go1.18.3.linux-amd64.tar.gz //解压并复制到/user/local文件夹下 tar -C /usr/local -zxf go1.18.3.linux-amd64.tar.gz 2.编辑环境变…...

博图 linucx vmware

电脑与 PLC 的连接 博图装在虚拟机里&#xff0c;PLC 通过网线与电脑连接 可以是使用网线直接连接&#xff0c;也可以中间接个路由器或交换机 问题在于虚拟机提供多种网络连接方式&#xff0c;但不是每种都可以与 PLC 建立连接 以 VMware 虚拟机为例&#xff0c;进入编辑/虚拟网…...

Service Work离线体验与性能优化

Service Work离线体验与性能优化 引言 先放个意外事件&#xff0c;万事开头难&#x1f923;&#x1f923;&#x1f923; 原计划是分享离线应用与数据资源缓存的应用实践&#xff0c;结果发现这一技术已被web标准废弃 曾经做过一个PC应用&#xff0c;业务需求要求应用具备容灾…...

Unity 语音转文字 Vosk 离线库

市场有很多语音库&#xff0c;这里介绍Vosk SDK 除了支持untiy外还有原生开发服务器等 目录 安装unity示例demo下载语音训练文件运行demo结尾一键三联 注意事项 有可能debug出来的文本是空的&#xff0c;&#xff08;确保麦克风正常&#xff0c;且索引正确&#xff09;分大…...

VSCode连接Github的重重困难及解决方案!

一、背景&#xff1a; 我首先在github创建了一个新的项目&#xff0c;并自动创建了readme文件其次在vscode创建项目并写了两个文件在我想将vscode的项目上传到对应的github上时&#xff0c;错误出现了 二、报错及解决方案&#xff1a; 1.解决方案&#xff1a; 需要在git上配置用…...

《AI赋能鸿蒙Next,打造极致沉浸感游戏》

在游戏开发领域&#xff0c;鸿蒙Next系统与人工智能技术的结合为开发者们带来了前所未有的机遇&#xff0c;使打造更具沉浸感的游戏成为可能。以下将深入探讨如何利用人工智能在鸿蒙Next上开发出令人身临其境的游戏。 利用AI优化游戏角色智能行为 在传统游戏中&#xff0c;非…...

小白:react antd 搭建框架关于 RangePicker DatePicker 时间组件使用记录 2

文章目录 一、 关于 RangePicker 组件返回的moment 方法示例 一、 关于 RangePicker 组件返回的moment 方法示例 moment方法中日后开发有用的方法如下&#xff1a; form.getFieldsValue().date[0].weeksInWeekYear(),form.getFieldsValue().date[0].zoneName(), form.getFiel…...

<C++学习>C++ std 多线程教程

C std 多线程教程 理解多线程的概念 多线程是一种并发编程技术&#xff0c;它允许程序同时运行多个任务。每个线程共享同一进程的资源&#xff08;如内存&#xff09;&#xff0c;但拥有独立的执行路径。多线程编程在现代 C 中变得更加便捷和安全&#xff0c;标准库提供了强大…...

用 Python 自动化处理日常任务

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(28):DSA数字签名

《深入浅出HTTPS​​​​​​​​​​》读书笔记&#xff08;28&#xff09;&#xff1a;DSA数字签名 对称加密算法有很多算法&#xff0c;标准算法是RSA机密算法&#xff0c;数字签名技术也有一个标准DSS&#xff08;Digital Signature Standard&#xff09;&#xff0c;其标准…...