Elasticsearch中什么是倒排索引?

倒排索引(Inverted Index)是一种索引数据结构,它在信息检索系统中被广泛使用,特别是在全文搜索引擎中。倒排索引允许系统快速检索包含给定单词的文档列表。它是文档内容(如文本)与其存储位置之间的映射,通常用于快速检索。

倒排索引的工作原理:

  1. 文档处理:首先,系统会处理每个文档,将其分解为单独的单词或术语。

  2. 构建索引:对于每个单词或术语,倒排索引会记录它出现的所有文档的位置(或位置列表)。这些位置可以是文档的物理地址,也可以是文档ID。

  3. 存储结构:倒排索引通常以键值对的形式存储,其中键是单词或术语,值是包含该单词的文档列表(或文档ID列表)。

倒排索引的组成部分:

  • 词汇表(Term Dictionary):包含所有唯一单词的列表。
  • 文档频率(Document Frequency):每个单词出现的文档数量。
  • 位置列表(Posting List):每个单词对应的文档列表,包括文档ID和单词在文档中的位置信息。

倒排索引的优点:

  • 快速检索:由于倒排索引存储了单词到文档的映射,因此可以快速检索包含特定单词的文档。
  • 节省空间:相比于正向索引(每个文档存储所有单词),倒排索引可以更有效地存储数据,因为它避免了重复存储相同的单词。
  • 支持复杂查询:倒排索引支持布尔查询和其他复杂查询,如短语搜索和模糊搜索。

倒排索引在Elasticsearch中的应用:

在Elasticsearch中,倒排索引是其核心组件之一。Elasticsearch使用倒排索引来实现快速的全文搜索。当文档被索引时,Elasticsearch会创建一个倒排索引,其中包含了文档中所有单词的列表以及这些单词在文档中的位置信息。这使得Elasticsearch能够快速响应搜索请求,找到包含特定单词或短语的文档。

倒排索引是全文搜索引擎中实现高效搜索的关键技术,它通过预先计算和存储单词与文档之间的关系,使得搜索操作能够迅速完成。

倒排索引代码案例

下面是一个简单的Java示例,展示了如何构建一个倒排索引。这个例子中,我们将创建一个简单的倒排索引,用于存储一些文档中的单词及其出现的位置。

倒排索引构建器类(InvertedIndexBuilder.java)

import java.util.*;

public class InvertedIndexBuilder {
    private Map<String, List<DocWord>> invertedIndex = new HashMap<>();

    public void addDocument(String docId, String[] words) {
        for (String word : words) {
            word = word.toLowerCase(); // 转换为小写以实现大小写不敏感的搜索
            if (!invertedIndex.containsKey(word)) {
                invertedIndex.put(word, new ArrayList<>());
            }
            invertedIndex.get(word).add(new DocWord(docId, words.length)); // 存储文档ID和单词数量
        }
    }

    public Map<String, List<DocWord>> getInvertedIndex() {
        return invertedIndex;
    }

    public static void main(String[] args) {
        InvertedIndexBuilder builder = new InvertedIndexBuilder();
        builder.addDocument("1", "The quick brown fox".split(" "));
        builder.addDocument("2", "The quick brown rabbit".split(" "));
        builder.addDocument("3", "The fox jumps over the lazy dog".split(" "));

        System.out.println(builder.getInvertedIndex());
    }
}

class DocWord {
    String docId;
    int wordCount;

    public DocWord(String docId, int wordCount) {
        this.docId = docId;
        this.wordCount = wordCount;
    }

    @Override
    public String toString() {
        return "DocWord{" +
                "docId='" + docId + '\'' +
                ", wordCount=" + wordCount +
                '}';
    }
}

代码解释:

  1. InvertedIndexBuilder类:这个类负责构建倒排索引。

    • invertedIndex:一个HashMap,存储单词到文档列表的映射。
    • addDocument:添加一个文档到索引中。它接受文档ID和单词数组,然后将每个单词与其出现的位置(文档ID和单词数量)关联起来。
    • getInvertedIndex:返回构建的倒排索引。
  2. DocWord类:表示文档中的一个单词。

    • docId:文档ID。
    • wordCount:该文档中的单词数量。
    • toString:重写toString方法以便于打印DocWord对象。
  3. main方法:示例中添加了三个文档到倒排索引构建器中,并打印出构建的倒排索引。

输出示例:


> {the=[DocWord{docId='1', wordCount=4}, DocWord{docId='2',
> wordCount=3}], quick=[DocWord{docId='1', wordCount=4},
> DocWord{docId='2', wordCount=3}], brown=[DocWord{docId='1',
> wordCount=4}, DocWord{docId='2', wordCount=3}],
> fox=[DocWord{docId='1', wordCount=4}, DocWord{docId='3',
> wordCount=7}], jumps=[DocWord{docId='3', wordCount=7}],
> over=[DocWord{docId='3', wordCount=7}], lazy=[DocWord{docId='3',
> wordCount=7}], dog=[DocWord{docId='3', wordCount=7}]}

这个简单的倒排索引示例展示了如何将文档中的单词与其出现的位置关联起来。在实际应用中,倒排索引可能需要包含更多的信息,如单词在文档中的具体位置、词频等,以支持更复杂的搜索操作。

复杂的倒排索引代码案例

创建一个更复杂的倒排索引涉及到处理实际文本数据、分词、去除停用词、记录词频和位置信息等。以下是一个Java实现的示例,它展示了如何构建一个包含这些特性的倒排索引。

倒排索引构建器类(AdvancedInvertedIndexBuilder.java)

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;

public class AdvancedInvertedIndexBuilder {

    private Map<String, Map<String, List<WordInfo>>> invertedIndex = new HashMap<>();

    public void buildIndex(String filePath) throws IOException {
        List<String> lines = Files.readAllLines(Paths.get(filePath));
        String[] stopWords = {"the", "and", "a", "is", "in", "it"};

        int docId = 1;
        for (String line : lines) {
            String[] words = line.toLowerCase().split("\\W+");
            Map<String, Integer> wordCounts = new HashMap<>();
            List<WordInfo> wordInfos = new ArrayList<>();

            for (String word : words) {
                if (!Arrays.asList(stopWords).contains(word) && !word.isEmpty()) {
                    wordCounts.put(word, wordCounts.getOrDefault(word, 0) + 1);
                    wordInfos.add(new WordInfo(docId, wordCounts.get(word)));
                }
            }

            String docIdStr = "doc" + docId;
            invertedIndex.put(docIdStr, new HashMap<>());
            for (Map.Entry<String, Integer> entry : wordCounts.entrySet()) {
                String word = entry.getKey();
                int count = entry.getValue();
                invertedIndex.get(docIdStr).put(word, wordInfos.stream()
                        .filter(info -> info.getDocId() == docId && info.getWordCount() == count)
                        .collect(Collectors.toList()));
            }
            docId++;
        }
    }

    public Map<String, Map<String, List<WordInfo>>> getInvertedIndex() {
        return invertedIndex;
    }

    public static void main(String[] args) {
        AdvancedInvertedIndexBuilder builder = new AdvancedInvertedIndexBuilder();
        try {
            builder.buildIndex("path/to/your/textfile.txt");
            System.out.println(builder.getInvertedIndex());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class WordInfo {
    private int docId;
    private int wordCount;
    private List<Integer> positions;

    public WordInfo(int docId, int wordCount) {
        this.docId = docId;
        this.wordCount = wordCount;
        this.positions = new ArrayList<>();
    }

    public void addPosition(int position) {
        this.positions.add(position);
    }

    public int getDocId() {
        return docId;
    }

    public int getWordCount() {
        return wordCount;
    }

    public List<Integer> getPositions() {
        return positions;
    }

    @Override
    public String toString() {
        return "WordInfo{" +
                "docId=" + docId +
                ", wordCount=" + wordCount +
                ", positions=" + positions +
                '}';
    }
}

代码解释:

  1. AdvancedInvertedIndexBuilder类:这个类负责构建一个更复杂的倒排索引。

    • invertedIndex:一个HashMap,存储文档ID到单词到WordInfo列表的映射。
    • buildIndex:从文件中读取文档,对每个文档进行分词,去除停用词,记录词频和位置信息,并构建倒排索引。
    • getInvertedIndex:返回构建的倒排索引。
  2. WordInfo类:表示文档中的一个单词及其相关信息。

    • docId:文档ID。
    • wordCount:该文档中的单词数量。
    • positions:该单词在文档中的位置列表。
    • addPosition:添加单词在文档中的位置。
    • toString:重写toString方法以便于打印WordInfo对象。
  3. main方法:示例中从文件中读取文档,构建倒排索引,并打印出构建的倒排索引。

注意事项:

  • 这个示例假设文本文件中的每行是一个文档。
  • 停用词列表是硬编码的,实际应用中可能需要一个更全面的停用词列表。
  • 分词是通过正则表达式实现的,可能需要根据实际文本内容进行调整。
  • 这个示例没有实现复杂的查询功能,但它提供了倒排索引的基本结构,可以根据需要进行扩展。

这个更复杂的倒排索引示例展示了如何处理实际文本数据、分词、去除停用词、记录词频和位置信息,并构建一个倒排索引。在实际应用中,你可能需要根据具体需求进行调整和扩展。

📚 解释一下倒排索引中的词频和位置信息?

在倒排索引中,词频(Term Frequency)和位置信息(Position Information)是两个重要的概念,它们对于全文搜索引擎的效率和功能至关重要。

词频(Term Frequency)

词频指的是某个单词在特定文档中出现的次数。在倒排索引中,词频可以帮助确定单词在文档中的重要性。通常情况下,一个单词在文档中出现的次数越多,它对文档内容的表示就越重要。词频在以下方面有重要作用:

  1. 相关性评分:搜索引擎使用词频作为评分文档与查询相关性的因素之一。通常,一个单词在文档中出现频率越高,该文档对于包含该单词的查询就越相关。

  2. 文本分析:词频可以用于文本挖掘和分析,比如识别文档的关键主题或概念。

位置信息(Position Information)

位置信息指的是单词在文档中出现的具体位置。这些位置可以是单词在句子中的位置、在段落中的位置或者是单词在文档中的字符偏移量。位置信息在以下方面有重要作用:

  1. 短语匹配:位置信息允许搜索引擎执行短语查询,即搜索引擎可以查找包含特定单词序列的文档。

  2. 邻近性搜索:位置信息可以用于执行邻近性搜索,即查找单词彼此接近的文档,这对于理解文档的上下文非常有用。

  3. 排名和排序:位置信息可以帮助搜索引擎更准确地评估文档的相关性,因为单词的接近程度可能会影响文档的相关性。

结合词频和位置信息

在倒排索引中,通常会将词频和位置信息结合起来,为每个单词建立一个“posting list”(即单词的文档列表)。每个posting list条目不仅包含文档ID和词频,还可能包含单词在文档中的所有位置信息。

例如,对于文档 “The quick brown fox jumps over the lazy dog”,倒排索引可能包含如下信息:

  • 单词 “the”:

    • 文档ID:1
    • 词频:1
    • 位置信息:[1, 2](假设 “the” 在文档中出现了两次,分别在位置1和2)
  • 单词 “quick”:

    • 文档ID:1
    • 词频:1
    • 位置信息:[2]

这种结构允许搜索引擎快速定位到包含特定单词的所有文档,并且能够理解单词在文档中的分布情况,从而提供更准确、更相关的搜索结果。

🔍 如何优化倒排索引以提高搜索效率?

在这里插入图片描述
优化倒排索引以提高搜索效率可以通过以下几种策略实现:

  1. 压缩存储:通过使用压缩技术(如前缀压缩、位图索引)减少索引文件的大小,从而提高索引的查询速度。

  2. 分布式索引:将索引分布在多个服务器上,以处理大规模数据和高并发请求。使用哈希函数将索引均匀分布在不同节点,避免数据倾斜,提高并行处理能力。

  3. 增量构建:为了提高检索效率,可以采用增量构建技术,这意味着倒排索引的构建不是一次性完成,而是随着新文档的加入逐步更新,这样可以有效地减小索引大小,提高查询速度。

  4. 动态阈值设置:通过动态调整索引的阈值,可以控制索引的精细程度,从而在存储空间和查询效率之间取得平衡。

  5. 索引分片:Elasticsearch将每一个索引划分为若干分片,使得查询操作得以并行执行,进一步加快查询速度。

  6. 索引优化技术:Elasticsearch通过索引优化技术,如索引覆盖、索引下推等,进一步提升查询速度。

  7. 预存储结果:Elasticsearch在插入数据时预先处理,将结果预存至索引中,无需再次计算即可快速查询,提高查询效率。

  8. 高效的查询引擎:Elasticsearch拥有高效的查询引擎,支持各类查询,并针对复杂查询提供优化策略,确保查询速度极速。

  9. 异步请求处理:Elasticsearch采用异步请求处理机制,确保请求到达后立即响应,避免长时间等待,提升用户体验。

  10. 列式存储和压缩:Doris中不同列的倒排索引是相互独立的,因此倒排索引文件也采用列式存储,有利于向量化构建索引和提高压缩率。

  11. C++和向量化实现:Apache Doris的存储模块查询执行引擎以及倒排索引都用C++实现,避免了Java Lucene的JVM GC等开销,同样的计算C++实现相对于Java性能优势明显,而且更利于做向量化加速。

  12. 智能索引能力:在建表时利用Doris内置的智能索引能力,除了在建表时利用Doris内置的智能索引能力之外,还可以通过给对应的列增加倒排索引来加速查询。

通过这些策略,可以显著提高倒排索引的搜索效率,尤其是在大规模数据集和高并发场景下。
在这里插入图片描述

但我还没有遇到过,目前业务还没有到如此地步来使我优化,哈哈哈哈

🔍 倒排索引在实时数据处理中的角色是什么?

倒排索引在实时数据处理中扮演着至关重要的角色,主要体现在以下几个方面:

  1. 快速检索:倒排索引允许系统通过关键词快速定位到包含这些关键词的文档,这对于需要实时反馈的搜索系统尤为重要。在实时搜索中,倒排索引能够提供快速的匹配和排序,以保证快速有效地返回排序后的搜索结果。

  2. 实时更新:实时数据处理要求索引的数据能够同步更新。倒排索引支持快速的插入、删除和更新文本,采用增量索引的方式,以增量更新的方式来维护索引,实现文本实时索引的更新。

  3. 数据分片和负载均衡:在处理大规模实时数据时,倒排索引通过支持数据分片和负载均衡,实现对大规模数据进行高效索引和查询操作。

  4. 结果缓存和预取:为了提升搜索结果的响应速度,倒排索引可以采用结果缓存和预取的技术,这样可以减少实时搜索中的延迟。

  5. 全文检索能力:倒排索引是全文搜索的核心技术之一,它通过将每一行文本进行分词,构建词(Term)到行号列表(Posting List)的映射关系,大大减少了搜索时间,提高了检索效率。

  6. 支持复杂查询:倒排索引适合处理布尔查询(如AND、OR、NOT)。通过对不同词项的倒排列表进行交集、并集或差集运算,可以轻松实现复杂的布尔逻辑查询。

  7. 提高查询性能:倒排索引通过将文档中的每个词项映射到包含该词项的所有文档的列表,极大地加速了文本搜索和复杂查询的速度。

  8. 优化数据存储和访问模式:倒排索引文件采用列式存储,有利于向量化构建索引和提高压缩率,从而优化数据存储和访问模式。

综上所述,倒排索引在实时数据处理中的作用是多方面的,它不仅提高了检索速度和查询性能,还支持了数据的实时更新和高效管理,是实现实时搜索和数据处理的关键技术之一。

💡 有没有其他技术可以替代倒排索引用于实时数据处理?

大家看看就行了,平时根本用不到。。。。。。。。。。。。。。。。。。

在实时数据处理中,除了倒排索引,还有其他几种技术可以用于提高搜索效率和数据处理能力:

  1. 向量搜索(Vector Search)

    • 向量搜索技术通过将文本转换为高维向量,并使用这些向量的距离或内积来衡量它们在语义上的关联度或相似度,从而实现基于向量的检索方法。这种技术在自然语言处理和图像识别中得到了广泛应用,尤其是在私域数据上的应用。
  2. 流处理平台(如Apache Kafka和Apache Flink)

    • Apache Kafka是一个分布式流处理平台,能够实时摄取和处理大量数据,常被用作消息队列和流数据源。
    • Apache Flink是一个分布式流处理引擎,能够实时处理大量数据,支持流处理和批处理,以及低延迟处理和复杂事件处理。
  3. 实时数据仓库(如Amazon Kinesis、Google Cloud Dataflow和Microsoft Azure Stream Analytics)

    • 这些平台提供了实时数据摄取和分析的能力,可以与其他云服务集成,提供灵活的数据处理和分析选项。
  4. 多版本控制(MVCC)

    • MVCC是一种解决读写冲突的技术,允许数据的多个版本共存,使得查询可以在一个时间戳的快照上进行,而不被写入操作阻塞。这对于需要实时更新和查询的数据平台尤其重要。
  5. 搜索引擎技术(如Elasticsearch)

    • Elasticsearch是一个分布式搜索引擎,基于Lucene构建,不仅实现了倒排索引,还增加了分布式支持、全文检索和多租户的功能,适合构建日志分析和监控系统。
  6. 数据库内建的全文搜索功能(如RediSearch)

    • RediSearch是Redis的一个模块,提供全文搜索和倒排索引功能,适合在Redis内部实现简单的全文检索,支持实时搜索。
  7. 基于嵌入(Embedding)的检索模式

    • 这种模式通过为每条记录计算出一个高维嵌入向量,并利用这些向量的距离或内积来衡量它们在语义上的关联度或相似度,实现了一种基于向量的检索方法。

这些技术可以单独使用,也可以组合使用,以满足不同的实时数据处理需求。选择合适的技术需要根据具体的业务场景、数据特性和性能要求来决定。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

部署DNS域名解析服务

部署DNS域名解析服务 一.DNS介绍 域名 Domain Name&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的名字组成的 Intermet 上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时标识计算机的电子方位。具有独一无二&#xff0c;不可重复的特性。 DNS 域名…

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录&#xff1a;★★★★尤其注意&#xff1a;引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springb…

ubuntu18.04 安装与卸载NCCL conda环境安装PaddlePaddle

cuda版本11.2 说明PaddlePaddle需要安装NCCL 1、Log in | NVIDIA Developer 登录官网 找到对应版本 官方提供了多种安装方式&#xff0c;本文使用Local installers (x86)本地安装 点击对应的版本下载如&#xff1a; nccl-local-repo-ubuntu1804-2.8.4-cuda11.2_1.0-1_amd6…

FPGA实现以太网(二)、初始化和配置PHY芯片

系列文章目录 FPGA实现以太网&#xff08;一&#xff09;、以太网基础知识 文章目录 系列文章目录一、MDIO协议介绍二、PHY芯片管脚以及结构框图三、MDIO帧时序介绍3.1 MDIO帧格式3.2 MDIO写时序3.3 MDIO读时序 四、PHY芯片常用寄存器描述4.1 基本模式控制寄存器&#xff08;0…

leetcode day10 动态规划篇 64+139

64 最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 m grid.lengthn grid[i].length1 < m, n < 2000 < grid[i][j]…

【系统面试篇】其他相关题目——虚拟内存、局部性原理、分页、分块、页面置换算法

目录 一、相关问题 1. 什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f; &#xff08;1&#xff09;内存扩展 &#xff08;2&#xff09;内存隔离 &#xff08;3&#xff09;物理内存管理 &#xff08;4&#xff09;页面交换 &#xff08;5&#xff09;内存映…

【论文复现】ChatGPT多模态命名实体识别

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ChatGPT ChatGPT辅助细化知识增强&#xff01;1. 研究背景2. 模型结构和代码3. 任务流程第一阶段&#xff1a;辅助精炼知识启发式生成第二阶段…

深度学习之循环神经网络(RNN)

1 为什么需要RNN&#xff1f; ​ 时间序列数据是指在不同时间点上收集到的数据&#xff0c;这类数据反映了某一事物、现象等随时间的变化状态或程度。一般的神经网络&#xff0c;在训练数据足够、算法模型优越的情况下&#xff0c;给定特定的x&#xff0c;就能得到期望y。其一…

【从零开始的LeetCode-算法】3238. 求出胜利玩家的数目

给你一个整数 n &#xff0c;表示在一个游戏中的玩家数目。同时给你一个二维整数数组 pick &#xff0c;其中 pick[i] [xi, yi] 表示玩家 xi 获得了一个颜色为 yi 的球。 如果玩家 i 获得的球中任何一种颜色球的数目 严格大于 i 个&#xff0c;那么我们说玩家 i 是胜利玩家。…

GIT的基本使用与进阶

GIT的简单入门 一.什么是git&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;用于跟踪文件更改、管理代码版本以及协作开发。它主要由 Linus Torvalds 于 2005 年创建&#xff0c;最初是为 Linux 内核开发而设计的。如今&#xff0c;Git 已经成为现代软件开发中…

ReactPress:功能全面的开源发布平台

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的&#xff0c;包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的&#xff0c;项目已经开源&#xff0c;项目地址在 …

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效&#xff0c;但是它的大小是动态可变的&#xff0c;并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

sql专题 之 where和join on

文章目录 前言where介绍使用过滤结果集关联两个表 连接外连接内连接自然连接 使用inner join和直接使用where关联两个表的区别总结 前言 从数据库查询数据时&#xff0c;一张表不足以查询到我们想要的数据&#xff0c;更多的时候我们需要联表查询。 联表查询我们一般会使用连接…

服务器数据恢复—分区结构被破坏的reiserfs文件系统数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器中有一组由4块SAS硬盘组建的RAID5阵列&#xff0c;上层安装linux操作系统统。分区结构&#xff1a;boot分区LVM卷swap分区&#xff08;按照顺序&#xff09;&#xff0c;LVM卷中划分了一个reiserfs文件系统作为根分区。 服务器故障…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于稳态信息和条件分布自适应的风电场阻抗智能辨识和稳定性评估》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

vue反向代理配置及宝塔配置

vue生产环境和开发环境 反向代理 正向代理 宝塔面板配置 本地小皮面板---NginxApache解决方案_小皮面板反向代理-CSDN博客 上面这个链接供大家参考&#xff0c;我这里面提取vue配置反向代理格式 在vite.config.js页面写入 server: {proxy: {"/api": {target: "…

【NOIP普及组】统计单词数

【NOIP普及组】统计单词数 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 一般的文本编辑器都有查找单词的功能&#xff0c;该功能可以快速定位特定单词在文章中的位置&#xff0c;有的还能统计出特定单词在文章中出现的次数。 现在&#x…

uni-app中使用 unicloud 云开发平台③

文章目录 六、hbuilderX 中使用 unicloud 云开发平台文档传统业务开发流程什么是 unicloudunicloud 优点开发流程uncloud 构成云数据库云存储及 CDN创建云函数工程七、unicloud api 操作云函数调用云函数实现云数据库基本增删改查1. 获取数据库引用云存储操作六、hbuilderX 中使…

STM32 极速入门第一天 点亮一个LED( 使用PlatformIO开发STM32单片机 ) 2024/11/11

什么是STM32? STM32是STMicroelectronics&#xff08;意法半导体&#xff09;推出的一系列基于ARM Cortex-M内核的32位Flash微控制器。它们因高性能、低功耗、易于编程和广泛的外设集成而广泛应用于各种嵌入式系统项目中。 使用设备: STM32F103C6T6 我的 keil 装的是 C51 所以…

微信小程序使用阿里巴巴矢量图标库正确姿势

1、打开官网&#xff1a;https://www.iconfont.cn/&#xff0c;把整理好的图标下载解压。 2、由于微信小程序不支持直接在wxss中引入.ttf/.woff/.woff2&#xff08;在开发工具生效&#xff0c;手机不生效&#xff09;。我们需要对下载的文件进一步处理。 eot&#xff1a;IE系列…