Elasticsearch 8.16.0:革新大数据搜索的新利器

举报
程风破浪 发表于 2024/11/28 11:35:00 2024/11/28
【摘要】 BBQ)是中一种开创性的向量数据量化方法。它的核心目标是在提高向量数据压缩率的同时,维持高召回率,并提供自定义选项。其原理是通过巧妙地结合标量量化和位向量支持来实现这一目标。在实际的数据处理中,向量数据往往占据大量的存储空间。传统的量化方法可能会在压缩数据的过程中损失一定的准确性,导致搜索结果的召回率下降。而BBQ则打破了这种局限,它能够在不影响准确性的情况下,将向量数据的压缩率提高32倍。

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

a06527d9099b437585ee6ae4761197c3.png


Elasticsearch 8.16.0:革新大数据搜索的新利器

一、引言

在当今数字化飞速发展的时代,数据量呈爆炸式增长,数据的复杂性也日益提高。企业和开发者们都在寻求更高效、更强大的搜索和分析解决方案,以应对海量数据带来的挑战。Elasticsearch 作为一款广受欢迎的开源搜索和分析引擎,一直在不断进化,以满足用户日益增长的需求。
fba25202fc564759a84ef1c73d850b5a.png

本次Elasticsearch 8.16.0 版本的发布(Release date: November 13, 2024),带来了一系列具有变革性的新功能,进一步巩固了其在数据领域的重要地位。其主要新功能如下:

1. BBQ(Better Binary Quantization)‌

这是一种创新的向量数据量化方法,旨在提高向量数据的压缩率,同时保持高召回率和自定义选项BBQ通过标量量化和位向量支持,能够在不影响准确性的情况下将向量数据的压缩率提高32倍,特别适用于大型工作负载‌。

2. 倒数排名融合(Reciprocal Rank Fusion, RRF)‌

RRF是一种生产就绪的混合对话搜索功能,提供了便捷的结果归一化和组合能力,能够增强生成式 AI 驱动的搜索体验‌。

3. 检索器和开放推理 API‌

这些API的发布使得用户可以更方便地构建基于混合搜索和检索增强生成(Retrieval Augmented Generation, RAG)的应用程序。

4. 可观察性增强‌

Elastic Observability通过基于搜索的相关性、不折不扣的数据保留、改进的运营效率和成本,提供了增强的日志分析和简化的入门流程。此外,还支持Amazon Bedrock集成,为基于Amazon Bedrock构建的大型语言模型(LLM)提供全面的监控功能‌。

5. 云资产保护‌

通过SIEMSecurity Information and Event Management)功能,保护云资产并解决云保护和上下文调查问题,最终在一个许可证中解决了云保护和上下文调查问题‌。

6. 本地部署简化‌

通过start-local脚本,用户可以在几分钟内在笔记本电脑上进行本地部署,从而快速开始使用Elasticsearch进行本地开发运行‌。

7. 内存优化‌

Elasticsearch 8.16.0对内存管理进行了优化,引入了一种新的内存分配算法,能够更有效地利用内存资源,同时使用更高效的数据结构来存储索引数据,减少了内存的占用。

接下来,让我们深入了解这些令人兴奋的新特性。

二、BBQ:创新的向量数据量化方法

1. BBQ 原理概述

BBQBetter Binary Quantization)是 Elasticsearch 8.16.0 中一种开创性的向量数据量化方法。它的核心目标是在提高向量数据压缩率的同时,维持高召回率,并提供自定义选项。其原理是通过巧妙地结合标量量化和位向量支持来实现这一目标。

在实际的数据处理中,向量数据往往占据大量的存储空间。传统的量化方法可能会在压缩数据的过程中损失一定的准确性,导致搜索结果的召回率下降。而 BBQ 则打破了这种局限,它能够在不影响准确性的情况下,将向量数据的压缩率提高 32 倍。这对于处理大型工作负载,特别是那些包含大量向量数据的应用场景来说,具有极其重要的意义。

2. 用法介绍

以下演示如何在 Elasticsearch 中使用 BBQ 进行向量数据的量化和查询。

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.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class BBQExample {
    public static void main(String[] args) throws IOException {
        // 假设已经创建了 RestHighLevelClient 实例
        RestHighLevelClient client = createClient(); 

        // 创建搜索请求
        SearchRequest searchRequest = new SearchRequest("your_index_name");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 使用 BBQ 相关的查询构建器(这里只是示例,实际使用可能需要更多配置)
        searchSourceBuilder.query(QueryBuilders.bbqQuery("your_vector_field", "your_vector_value")); 

        searchRequest.source(searchSourceBuilder);

        // 执行搜索请求
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        // 处理搜索结果
        handleSearchResponse(searchResponse); 

        client.close();
    }

    private static RestHighLevelClient createClient() {
        // 创建并返回 RestHighLevelClient 实例的代码,这里省略详细实现
        return null; 
    }

    private static void handleSearchResponse(SearchResponse searchResponse) {
        // 处理搜索结果的代码,这里省略详细实现
        System.out.println("Search results: " + searchResponse); 
    }
}

在上述代码中,我们首先创建了一个 SearchRequest,并通过 SearchSourceBuilder 构建查询条件。这里使用了 bbqQuery 方法来构建基于 BBQ 的查询,其中 your_index_name 是索引名称,your_vector_field 是存储向量数据的字段名,your_vector_value 是要查询的向量值。然后通过 RestHighLevelClient 执行搜索请求,并对搜索结果进行处理。需要注意的是,实际应用中需要完善 createClienthandleSearchResponse 方法的实现。

三、倒数排名融合(RRF):提升混合对话搜索体验

1. RRF 功能解析

倒数排名融合(Reciprocal Rank Fusion, RRF)是 Elasticsearch 8.16.0 中一个生产就绪的混合对话搜索功能。在现代搜索应用中,尤其是那些结合了生成式 AI 的应用场景,搜索结果的质量和相关性至关重要。RRF 的出现为解决这一问题提供了有力的支持。

RRF 的主要优势在于它提供了便捷的结果归一化组合能力。在复杂的搜索环境中,我们可能会从多个不同的数据源或者搜索算法中获取结果,这些结果的排名和相关性可能各不相同。RRF 能够将这些不同来源的结果进行有效的融合,通过其独特的算法,重新计算排名,从而提高搜索结果的整体质量,增强生成式 AI 驱动的搜索体验。

2. 用法介绍

以下是一个使用 RRF 进行混合对话搜索的 Java 示例。

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.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;

import java.io.IOException;

public class RRFExample {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = createClient();

        SearchRequest searchRequest = new SearchRequest("your_index_name");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 使用 RRF 相关的查询构建器(这里只是示例,实际使用可能需要更多配置)
        searchSourceBuilder.query(QueryBuilders.rrfQuery("your_text_field", "your_search_query")
               .addSource("source1", 0.5) 
               .addSource("source2", 0.3) 
               .addSource("source3", 0.2)); 

        // 添加排序条件(这里只是示例,可根据实际情况调整)
        searchSourceBuilder.sort(SortBuilders.fieldSort("_score").order(SortOrder.DESC)); 

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        handleSearchResponse(searchResponse);

        client.close();
    }

    private static RestHighLevelClient createClient() {
        // 创建并返回 RestHighLevelClient 实例的代码,这里省略详细实现
        return null;
    }

    private static void handleSearchResponse(SearchResponse searchResponse) {
        // 处理搜索结果的代码,这里省略详细实现
        System.out.println("Search results with RRF: " + searchResponse);
    }
}

在这个示例中,我们创建了一个 SearchRequest,并在 SearchSourceBuilder 中使用 rrfQuery 构建基于 RRF 的查询。your_index_name 是索引名称,your_text_field 是文本字段名,your_search_query 是搜索关键词。通过 addSource 方法可以指定不同数据源的权重,这里模拟了三个数据源 source1source2source3 及其权重。然后添加了按照得分降序排序的条件,最后执行搜索请求并处理结果。同样,在实际应用中需要完善 createClienthandleSearchResponse 方法。

四、检索器和开放推理 API:构建混合搜索和 RAG 应用的利器

1. API 功能介绍

Elasticsearch 8.16.0 发布的检索器和开放推理 API 为开发者们开启了构建强大应用程序的新大门。在混合搜索和检索增强生成(Retrieval Augmented Generation, RAG)应用日益流行的今天,这些 API 的出现具有里程碑意义。

检索器 API 允许开发者更方便地从 Elasticsearch 索引中获取相关数据,无论是基于文本的查询还是向量相似性查询。它提供了一种灵活且高效的方式来检索数据,满足不同应用场景的需求。

开放推理 API 则进一步扩展了功能,它与各种推理引擎和模型集成,使得开发者可以在 Elasticsearch 中直接进行复杂的推理操作。这对于构建智能搜索应用、知识图谱应用等需要高级推理能力的场景非常有帮助。通过这些 API,开发者可以轻松地将 Elasticsearch 与其他机器学习和人工智能技术相结合,创造出更具创新性的应用程序。

2. 用法介绍

以下展示如何使用检索器 API 进行数据检索。

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.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;

import java.io.IOException;

public class RetrieverAPIExample {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = createClient();

        SearchRequest searchRequest = new SearchRequest("your_index_name");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 使用检索器 API 相关的查询构建器(这里只是示例,实际使用可能需要更多配置)
        searchSourceBuilder.query(QueryBuilders.matchQuery("your_text_field", "your_search_term")); 

        // 添加高亮显示配置(可选,这里只是示例)
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("your_text_field");
        searchSourceBuilder.highlighter(highlightBuilder);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        handleSearchResponse(searchResponse);

        client.close();
    }

    private static RestHighLevelClient createClient() {
        // 创建并返回 RestHighLevelClient 实例的代码,这里省略详细实现
        return null;
    }

    private static void handleSearchResponse(SearchResponse searchResponse) {
        // 处理搜索结果的代码,这里省略详细实现
        System.out.println("Search results with Retriever API: " + searchResponse);
    }
}

在这个示例中,我们通过 SearchRequestSearchSourceBuilder 构建搜索请求。使用 matchQuery 方法(这是检索器 API 中一种常见的查询方式)在指定的索引 your_index_nameyour_text_field 字段中搜索关键词 your_search_term。我们还添加了一个简单的高亮显示配置,用于突出显示搜索结果中的关键词。最后执行搜索请求并处理结果。同样,实际应用中需要完善 createClienthandleSearchResponse 方法的实现。

五、可观察性增强:优化日志分析与监控

1. 可观察性增强功能概述

Elastic ObservabilityElasticsearch 8.16.0 中得到了显著的增强在处理大规模数据复杂系统时,日志分析和监控是确保系统稳定运行和性能优化的关键环节。

新的可观察性增强功能基于搜索的相关性,能够更准确地从海量日志数据中提取有价值的信息。通过不折不扣的数据保留策略,确保数据的完整性,为后续的分析和故障排查提供了坚实的基础。同时,改进的运营效率和成本控制,使得企业可以在不增加过多资源投入的情况下,获得更优质的日志分析服务。

此外,支持 Amazon Bedrock 集成是一个重要的亮点。对于那些基于 Amazon Bedrock 构建的大型语言模型(LLM),Elasticsearch 现在可以提供全面的监控功能。这意味着开发者和运维人员可以实时监控 LLM 的运行状态、性能指标等,及时发现并解决潜在问题。

2. 用法介绍

以下是一个简单的 Java 代码示例,用于查询 Elasticsearch 中的日志数据(这里只是一个简单的示例,实际的日志查询和监控可能更复杂)。

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.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class LogQueryExample {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = createClient();

        SearchRequest searchRequest = new SearchRequest("your_log_index_name");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 根据特定条件查询日志(这里只是示例,实际查询条件可能更复杂)
        searchSourceBuilder.query(QueryBuilders.termQuery("log_level", "ERROR")); 

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        handleSearchResponse(searchResponse);

        client.close();
    }

    private static RestHighLevelClient createClient() {
        // 创建并返回 RestHighLevelClient 实例的代码,这里省略详细实现
        return null;
    }

    private static void handleSearchResponse(SearchResponse searchResponse) {
        // 处理搜索结果的代码,这里省略详细实现
        System.out.println("Log query results: " + searchResponse);
    }
}

在这个示例中,我们创建了一个针对日志索引 your_log_index_name 的搜索请求。通过 termQuery 方法查询日志级别为 ERROR 的日志记录。这只是一个简单的日志查询示例,实际的监控和分析场景可能需要更复杂的查询条件、聚合操作等。在实际应用中,需要完善 createClienthandleSearchResponse 方法。

六、云资产保护新特性

1. SIEM 功能介绍

在云计算环境中,数据的安全性是重中之重。Elasticsearch 8.16.0 引入了强大的 SIEMSecurity Information and Event Management)功能。SIEM 是一种将安全信息管理和事件管理相结合的技术,它能够实时收集、分析和关联来自各种安全设备和应用程序的日志数据。

Elasticsearch 中,SIEM 功能通过整合安全相关的数据,为用户提供了一个全面的视角来监控和保护云资产。它可以检测到潜在的安全威胁,如恶意攻击未经授权的访问等,并及时发出警报。这一功能在解决云保护和上下文调查问题方面表现卓越,因为它能够将安全事件与相关的上下文信息(如用户行为、网络活动等)关联起来。

2. 用法介绍

以下代码演示如何使用 Elasticsearch 的 SIEM 功能来查询安全相关的事件:

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.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class SIEMSample {
    public static void main(String[] args) throws IOException {
        // 假设已经创建了 RestHighLevelClient 实例
        RestHighLevelClient client = createClient(); 

        SearchRequest searchRequest = new SearchRequest("your_security_index_name");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        // 使用 QueryBuilders 构建查询条件,这里查询特定类型的安全事件
        sourceBuilder.query(QueryBuilders.termQuery("event_type", "security_alert"));

        searchRequest.source(sourceBuilder);

        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

        // 处理搜索结果
        processSearchResponse(response); 

        client.close();
    }

    private static RestHighLevelClient createClient() {
        // 这里是创建 RestHighLevelClient 的代码,根据你的 Elasticsearch 配置进行修改
        // 示例代码可能如下:
        // RestHighLevelClient client = new RestHighLevelClient(
        //         RestClient.builder(new HttpHost("localhost", 9200, "http")));
        return null; 
    }

    private static void processSearchResponse(SearchResponse response) {
        // 在这里解析搜索结果,获取安全事件信息
        // 例如,可以遍历命中的文档并打印相关字段
        response.getHits().forEach(hit -> {
            System.out.println("Security event: " + hit.getSourceAsString());
        });
    }
}

在上述代码中,我们首先创建了一个SearchRequest对象,指定要查询的索引(这里假设你已经将安全相关的数据存储在名为your_security_index_name的索引中)。然后,使用SearchSourceBuilder构建查询条件,通过QueryBuilders.termQuery来查询特定类型(security_alert)的安全事件。最后,使用RestHighLevelClient执行查询并处理结果。请注意,在实际使用中,需要根据你的 Elasticsearch 环境正确配置RestHighLevelClient的创建过程。

七、本地部署简化特性

1. start-local 脚本解析

Elasticsearch 8.16.0 为本地开发带来了极大的便利,通过start-local脚本,用户可以在短短几分钟内就在笔记本电脑上完成本地部署。这个脚本封装了一系列复杂的配置和启动步骤,使得即使是对 Elasticsearch 部署不太熟悉的开发者也能轻松上手。

当你运行start-local脚本时,它会自动处理诸如环境变量设置依赖检查和服务启动等任务。这意味着你无需手动配置大量的参数,也不需要担心复杂的安装过程,就可以快速启动 Elasticsearch 实例,开始进行本地开发和测试。

2. 用法介绍

以下是一个简单的 Java 代码示例,用于在本地启动 Elasticsearch 后连接并执行一个简单的索引创建操作:

import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import java.io.IOException;

public class LocalDeploymentSample {
    public static void main(String[] args) throws IOException {
        // 使用 start - local 脚本启动 Elasticsearch 后,创建 RestHighLevelClient 连接
        RestHighLevelClient client = new RestHighLevelClient(
                // 根据本地启动的 Elasticsearch 配置修改主机和端口
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        CreateIndexRequest request = new CreateIndexRequest("local_test_index");
        try {
            CreateIndexResponse createIndexResponse = client.admin().indices().create(request, RequestOptions.DEFAULT);
            if (createIndexResponse.isAcknowledged()) {
                System.out.println("Index created successfully.");
            } else {
                System.out.println("Index creation failed.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
    }
}

在这个示例中,我们首先创建了一个RestHighLevelClient对象,连接到本地运行的 Elasticsearch 实例(假设start - local脚本已经成功启动 Elasticsearch,并且默认监听在localhost:9200)。然后,我们创建了一个CreateIndexRequest对象,指定要创建的索引名称为local_test_index。通过client.admin().indices().create方法执行索引创建操作,并根据响应结果判断索引是否创建成功。最后,关闭RestHighLevelClient连接。

八、内存优化特性

1. 新内存分配算法介绍

Elasticsearch 8.16.0 在内存管理方面进行了重大优化,引入了一种全新的内存分配算法。这种算法能够更加智能地根据系统的资源状况数据的访问模式来分配内存

传统的内存分配方式可能会导致内存资源的浪费或者在处理大规模数据时出现内存不足的情况。新的算法通过动态分析索引数据的使用频率数据大小等因素,合理地分配内存块。 例如,对于频繁访问的数据,它会优先分配更多的内存缓存,以提高查询性能;而对于不常使用的数据,则会适当减少其占用的内存空间。

2. 高效数据结构解析

除了新的内存分配算法,Elasticsearch 8.16.0 还采用了更高效的数据结构来存储索引数据。这些数据结构经过精心设计,能够在减少内存占用的同时,保持快速的数据读写能力。

新的数据结构在存储索引数据时,通过对数据进行压缩和优化存储布局,降低了数据在内存中的冗余。例如,对于相似的数据类型,它们会采用更紧凑的存储方式,避免了不必要的内存开销。这不仅提高了内存的利用率,还加快了查询和分析操作的速度,尤其是在处理大规模数据集时效果更为显著。

3. 用法介绍

以下是一个简单的 Java 代码示例,用于演示在内存优化后的 Elasticsearch 中进行数据索引和查询操作:

import org.elasticsearch.action.index.IndexRequest;
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.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class MemoryOptimizationSample {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        // 准备要索引的数据
        Map<String, Object> data = new HashMap<>();
        data.put("name", "example_document");
        data.put("value", "This is an example document for memory optimization test.");

        IndexRequest indexRequest = new IndexRequest("memory_optimized_index");
        indexRequest.source(data, XContentType.JSON);

        client.index(indexRequest, RequestOptions.DEFAULT);

        SearchRequest searchRequest = new SearchRequest("memory_optimized_index");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("name", "example_document"));
        searchRequest.source(sourceBuilder);

        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        response.getHits().forEach(hit -> {
            System.out.println("Found document: " + hit.getSourceAsString());
        });

        client.close();
    }
}

在这个示例中,我们首先创建了一个RestHighLevelClient连接到本地的 Elasticsearch 实例。然后,我们准备了一个简单的文档数据,并使用IndexRequest将其索引到名为memory_optimized_index的索引中。在索引过程中,Elasticsearch 8.16.0 的内存优化特性会自动发挥作用,根据新的内存分配算法和数据结构来存储数据。

接着,我们创建了一个SearchRequest对象,并使用SearchSourceBuilder构建了一个查询条件,通过QueryBuilders.matchQuery来查询名称为example_document的文档。当执行查询操作时,内存优化后的 Elasticsearch 能够更高效地利用内存资源来快速定位和返回结果。最后,我们遍历查询结果并打印相关信息。

九、参考资料文献

  1. Elasticsearch 8.16.0 发布说明
  2. What’s new in 8.16
  3. Elasticsearch 官方文档
  4. 相关技术论文和研究报告(可根据 Elasticsearch 官方推荐或相关学术数据库查找)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。