倒排索引(Inverted Index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
倒排索引的应用场景
倒排索引作为一种高效的数据结构,在信息检索和文本搜索领域确实有着广泛的应用场景。以下是几个主要使用场景:
1. 搜索引擎
搜索引擎是倒排索引最典型的应用场景之一。搜索引擎如Google、百度等,利用倒排索引快速响应用户查询,通过扫描索引中的关键词来定位包含这些关键词的文档,从而大大提高了检索效率。搜索引擎会将文档集合中的每个文档进行分词处理,并建立关键词与文档ID的映射关系。用户查询时,只需在倒排索引中查找关键词对应的文档列表,即可快速获取相关结果。
2. 数据库索引
倒排索引不仅限于全文搜索引擎,还可以用于关系型或非关系型数据库的索引构建,以提高数据检索的速度和效率。相比于传统的正向索引,倒排索引能够更快地定位到包含特定关键词的记录,尤其适用于需要频繁进行全文搜索或复杂查询的数据库系统。
3. 文本检索
在文档库、图书馆、档案馆等场景中,文本检索是倒排索引的重要应用之一。通过倒排索引,可以快速查找包含指定关键词的文档,满足用户的信息检索需求。倒排索引能够大大减少搜索时间,提高检索效率,同时支持复杂的查询操作,如布尔检索、模糊检索等。
4. 推荐系统
在推荐系统中,倒排索引可以用于构建用户兴趣和行为数据的索引,以支持个性化推荐和相关推荐等功能。通过分析用户的历史行为数据,构建用户兴趣模型,并利用倒排索引快速召回与用户兴趣相关的内容或商品。
5. 日志分析
在大数据和云计算环境中,日志分析是保障系统稳定性和性能的重要手段。倒排索引可以用于快速检索和分析日志数据中的关键信息。通过倒排索引,可以快速地定位到包含特定日志级别的记录或包含特定关键字的日志条目,从而帮助开发者和运维人员快速排查问题。
6. 网络安全
在网络安全领域,倒排索引可以用于基于网络流量和日志数据的异常检测和入侵检测。通过分析网络流量和日志数据中的关键信息(如IP地址、端口号、关键字等),构建倒排索引以支持快速检索和匹配潜在的安全威胁。
7. 社交媒体
在社交媒体平台上,倒排索引可以用于构建用户搜索、内容推荐和精准广告等功能的索引。通过倒排索引,可以快速地响应用户的搜索请求,并基于用户的行为和兴趣推荐相关的内容或广告,提升用户体验和平台价值。
Apache Doris 倒排索引如何做到文本检索性能提升40倍的
为了能够更直观和有力的论证这个结论,接下来一起来看下在无索引硬匹配以及利用倒排索引加速查询的具体表现吧!
先搭建环境,我们进行集群创建和数据导入,使用单节点点集群(1FE、1BE)并按照以下步骤进行操作:
1.搭建 Apache Doris;
2.创建数据表:按照下列建表语句进行数据表创建;
3.下载数据集,数据集为 Parquet 格式,并经过 Snappy 压缩,总大小约为37GB;下载完成后,分别执行以下命令,导入数据集;
4.查看与验证:完成上述步骤后,可以在MySQL客户端执行!以下语句,来查看导入的数据行数和所占用空间。从下方代码可知:共导入135589433行数据,在Doris中占用空间25.873GB,比压缩后的 Parquet 列式存储进一步降低了30%。
无索引硬匹配
环境及数据准备就绪后,我们尝试对 review_body 列进行文本搜索查询。具体需求是在数据集中查出评论中包含" is super awesome "关键字的前5种产品,并按照评论数量降序排列,查询结果需显示每种产品的 ID、随机一个产品标题、平均星级评分以从及评论总数。review_body 列的特征是评论内容比较长,因此进行文本搜索会有一定的性能压力。
首先我们直接进行查询,以下是查询的示例语句:
执行结果如下,查询耗时为7.6秒
利用倒排索引加速查询
选择基于倒排索引进一步加速文本搜索的效率,可以通过以下步骤来构建倒排索引:
1.新增倒排索引:对 amazon_reviews 表的 review_body 列※添加倒排索引,该索引采用英文分词,并支持 Phrase 短语查询,短语查询即进行文本搜索时,分词后的词语顺序将会影响搜索结果。
2.为历史数据创建索引:按照新增索引信息对历史数据进行索引构建,使历史数据就也可以使用倒排索引进行查询。
3.查看及验证:构建完索引之后,可以通过以下方式对索引构建情况进行查看:
在倒排索引创建完成后,我们使用 MATCH_PHRASE 来查询包含关键词" issuperawesome "的产品评论信息(具体需求可回顾前文)。
执行结果如下所示,开启倒排索引后查询耗时仅0.19秒,性能较未开启索引时提升了近40倍,极大幅度提升了文本检索的效率。
究其加速原因可知,倒排索引是通过将文本分解为单词,并建立从单词到行号列表的映射。这些映射关系按照单词进行排序,并构建跳表索引。在查询特定单词时,可以通过跳表索引和二分查找等方法,在有序的映射中快速定位到对应的行号列表,进而获取行的内容。这种查询方式避免了逐行匹配,将算法复杂度从 O (n) 降低到 O (logn) ,在处理大规模数据时能显著提高查询性能。
Apache Doris 倒排索引五大核心优势
查询性能显著提升:倒排索引通过将文档中的每个词项映射到包含该词项的所有文档的列表,极大地加速了文本搜索和复杂查询的速度。在Apache Doris中,倒排索引特别适用于全文检索、模糊匹配以及非主键列检索等场景,能够显著降低查询SQL的运行时间和资源消耗;
支持复杂文本检索需求:支持多种语言的分词(如英文、中文等)、支持同时匹配多个关键字(MATCH_ALL)、匹配任意一个关键字(MATCH_ANY)以及匹配短语词组(MATCH_PHRASE)等。这使得Apache Doris能够满足多样化的文本检索需求,提升用户体验;
优化数据存储和访问模式:在Apache Doris中,倒排索引使用独立的文件进行存储,与segment文件有逻辑对应关系但存储相互独立。这种设计使得在创建、删除索引时无需重写tablet和segment文件,从而大幅降低了处理开销。同时,倒排索引的引入也促进了数据的有效组织和快速访问,提高了整体的数据处理效率。
性价比提升,主要从以下三方面间接体现:
- 存储成本降低:通过高效的索引技术和数据存储结构,Apache Doris能够在保证查询性能的同时降低存储成本。
- 写入速度提升:倒排索引的引入并未显著增加写入负担,反而可能通过优化数据访问模式提升写入速度(与基于ES的日志存储方案相比,Apache Doris的写入速度提升2倍以上,参考文章4)。
- 总体拥有成本(TCO)降低:由于查询性能的提升和存储成本的降低,Apache Doris在长期使用中的总体拥有成本可能会更低。
易于使用和维护:
- 灵活的索引管理:支持在建表时定义倒排索引,也支持在已有表上增加或删除倒排索引,且支持增量构建倒排索引,无需重写表中的已有数据。
- 标准的SQL查询:Apache Doris使用标准的SQL查询方式,对于创建了倒排索引的字段,查询时也遵循普通的SQL查询方式,这使得用户无需学习新的查询语言即可轻松上手。
- 丰富的分词器支持:虽然目前Apache Doris支持的分词器种类相对有限,但已经能够满足大多数常见需求,并且未来可能会继续增加新的分词器支持。
- 自动化管理:Doris提供了自动化的索引管理和优化策略,减轻了用户的维护负担。
#倒排索引#