Elasticsearch中什么是倒排索引?

news2024/12/26 23:44:07

倒排索引(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)的检索模式

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

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

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

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

相关文章

excel-VLOOKUP函数使用/XVLOOKUP使用

多个窗口同时编辑表格&#xff0c;方便对照操作 使用开始-视图-新建窗口 将战区信息表的三列数据匹配到成交数据表上 可以使用VLOOKUP函数 有4个参数&#xff08;必须要查找的值&#xff0c; 要查找的区域&#xff0c;要返回区域的第几列数据&#xff0c;一个可选参数查找匹…

netcore 静态文件目录浏览

环境&#xff1a;Net6 string dirPath "C:\\Users\\15298\\Pictures"; var fileProvider new PhysicalFileProvider(dirPath); app.UseStaticFiles(new StaticFileOptions {FileProvider fileProvider,RequestPath new PathString(("/files")) }); // …

1Panel修改PostgreSQL时区

需求 1Panel安装的PostgreSQL默认是UTC时区&#xff0c;需要将它修改为上海时间 步骤 进入PostgreSQL的安装目录 /opt/1panel/apps/postgresql/postgresql/data打开postgresql.conf文件 修改&#xff1a; log_timezone Asia/Shanghai timezone Asia/Shanghai保存后重启…

函数式接口和stream

函数式接口&#xff08;Functional Interface&#xff09;是Java 8引入的一个新特性&#xff0c;它只有一个抽象方法的接口。这意味着你可以将一个函数式接口作为参数传递给方法&#xff0c;或者将其实现为一个lambda表达式。函数式接口的主要目的是允许你以声明性方式处理操作…

Oracle 高水位线和低-高水位线(High Water Mark Low High Water Mark)

在Oracle的逻辑存储结构中&#xff08;表空间-段-区-块&#xff09;&#xff0c;数据是存在数据段中的&#xff0c;通常一个表就是一个数据段&#xff0c;而段最终又由许多数据块组成。当数据存入数据块时&#xff0c;需要对块进行格式化&#xff0c;高水位线&#xff08;High …

科技资讯|Matter 1.4 标准正式发布,低功耗蓝牙助力其发展

连接标准联盟&#xff08;CSA&#xff09;宣布推出最新的 Matter 1.4 版本&#xff0c;引入了一系列新的设备类型和功能增强&#xff0c;有望提高包括 HomeKit 在内的智能家居生态系统之间的互操作性。 设备供应商和平台能够依靠增强的多管理员功能改善多生态系统下的用户体验&…

python练习-Django web入门

python -m pip install --user requests使用API调用请求数据 处理API响应 import requestsclass Requests:def request(self):url "https://www.toutiao.com/stream/widget/local_weather/data/?city北京"headers {"Accept": "application/json;…

元器件封装

元器件封装类型 为什么越来越多用贴片元件&#xff0c;而不是插件元件 为什么越来越多用贴片元件&#xff0c;而不是插件元件 1.体积小、质量小、容易保存和运输&#xff1b; 2.容易焊接和拆卸。抗震效果好。 贴片元件不用过孔&#xff0c;用锡少。直插元件最麻烦的就是拆卸&a…

[SaaS] 数禾科技 AIGC生成营销素材

https://zhuanlan.zhihu.com/p/923637935https://zhuanlan.zhihu.com/p/923637935

自顶向下逐步求精解决LeetCode第3307题找出第K个字符II题

3307.找出第K个字符II 难度&#xff1a;困难 问题描述&#xff1a; Alice和Bob正在玩一个游戏。最初&#xff0c;Alice有一个字符串word"a"。 给定一个正整数k和一个整数数组operations&#xff0c;其中operations[i]表示第i次操作的类型。 现在Bob将要求Alice按…

v-html 富文本中图片使用element-ui image-viewer组件实现预览,并且阻止滚动条

效果 导入组件 import ElImageViewer from "element-ui/packages/image/src/image-viewer"; components:{ ElImageViewer },模板使用组件 <el-image-viewerv-if"isShowPics":on-close"closeViewer":url-list"srcList"/>定义两…

Redis - 哨兵(Sentinel)

Redis 的主从复制模式下&#xff0c;⼀旦主节点由于故障不能提供服务&#xff0c;需要⼈⼯进⾏主从切换&#xff0c;同时⼤量 的客⼾端需要被通知切换到新的主节点上&#xff0c;对于上了⼀定规模的应⽤来说&#xff0c;这种⽅案是⽆法接受的&#xff0c; 于是Redis从2.8开始提…

使用wordpress搭建简易的信息查询系统

背景 当前有这样的一个需求&#xff0c;要实现让客户能够自助登录系统查询一些个人的信息&#xff0c;市面上没有特别符合我的需求的产品&#xff0c;经过一段时间的研究&#xff0c;想出了一个用wordpress实现简易信息查询系统&#xff0c;有两种方式。 方式一&#xff1a;使…

探索 Python HTTP 的瑞士军刀:Requests 库

文章目录 探索 Python HTTP 的瑞士军刀&#xff1a;Requests 库第一部分&#xff1a;背景介绍第二部分&#xff1a;Requests 库是什么&#xff1f;第三部分&#xff1a;如何安装 Requests 库&#xff1f;第四部分&#xff1a;Requests 库的基本函数使用方法第五部分&#xff1a…

【青牛科技】 GC6153——TMI8152 的不二之选,可应用于摇头机等产品中

在电子工程领域&#xff0c;不断寻求性能更优、成本更低的解决方案是工程师们的永恒追求。今天&#xff0c;我们要为广大电子工程师带来一款极具竞争力的产品 —— GC6153&#xff0c;它将成为 TMI8152 的完美替代之选。 一、产品背景 随着科技的飞速发展&#xff0c;电子设备…

基于yolov8、yolov5的番茄成熟度检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;番茄成熟度检测在农业生产及质量控制中起着至关重要的作用&#xff0c;不仅能帮助农民及时采摘成熟的番茄&#xff0c;还为自动化农业监测提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的番茄成熟度检测模型&#xff0c;该模型使用了…

艾体宝干货丨微突发流量检测与分析:IOTA让网络监控更精准

网络流量中的微突发问题常常难以察觉&#xff0c;但它们可能对网络性能产生显著影响。这篇文章深入探讨了如何利用IOTA来捕捉和分析微突发&#xff0c;帮助您快速有效地解决网络中的突发流量问题。 什么是微突发&#xff08;Microburst&#xff09;流量&#xff1f; 微突发是…

论文略读: ALPAGASUS: TRAINING A BETTER ALPACA WITH FEWER DATA

ICLR 2024 1 背景 大模型通常需要在有监督指令数据集上进行指令微调来加强指令遵循能力 但是广泛使用的数据集包含许多具有不正确或不相关响应的低质量样本&#xff0c;这对大模型微调具有误导性——>论文提出了一种简单有效的数据选择策略&#xff0c;使用ChatGPT自动识别…

【Android】ANR监控治理技术方案

一、 背景 1、 bugly针对crash监控做的比较好&#xff0c;但是对anr监控&#xff0c;早期版本监听 /data/anr 目录的变化可以拿到数据&#xff0c;但是现在高版本已经没有权限监听此目录&#xff0c;当前数据非常少&#xff0c;结合历次数据来看对我们解决ANR问题没有任何帮助…

FreeRTOS学习11——时间片任务调度

时间片任务调度 时间片任务调度 时间片任务调度 概念&#xff1a;时间片调度主要针对优先级相同的任务&#xff0c;当多个任务的优先级相同时&#xff0c;任务调度器会在每一次系统时钟节拍到的时候切换任务&#xff0c;也就是说 CPU 轮流运行优先级相同的任务&#xff0c;每个…