lucene 8.7.0 版本中的倒排索引、数字、DocValues三种类型的查询性能对比 - 教程

news/2025/10/3 10:27:17/文章来源:https://www.cnblogs.com/tlnshuju/p/19124371

lucene 8.7.0 版本中的倒排索引、数字、DocValues三种类型的查询性能对比 - 教程

2025-10-03 10:24  tlnshuju  阅读(0)  评论(0)    收藏  举报

大家来详细对比一下 Lucene 8.7.0 中倒排索引、数字(Points)和 DocValues 这三种核心数据结构在查询性能上的差异。

:就是首先,一个关键的理念它们被设计用来解决不同的问题,因此性能对比必须基于具体的应用场景。将它们放在不适合的场景下对比,性能差异会非常悬殊。

下面我们逐一分析,然后进行总结和场景化对比。


1. 倒排索引 (Inverted Index)

倒排索引是 Lucene 的基石,主要为文本搜索而生。

  • 核心数据结构:

    • Term Dictionary (词典):一个包含了所有文档中经过分词、处理后的所有 Term (词项) 的有序列表。在 Lucene 8.x 中,通常使用 FST (Finite State Transducer) 结构,它极大地压缩了词典的存储空间,并能快速定位 Term。
    • Postings List (倒排列表):对于词典中的每一个 Term,都有一个列表记录了囊括该 Term 的所有文档 ID。这个列表还可能包含 Term 在文档中出现的频率 (freq)、位置 (position)、偏移量 (offset) 等信息。
  • 主要用途:

    • 全文检索:快速找到包含特定词语的文档。例如:"search engine"
    • 关键词精确匹配:对于 keyword 类型的字段(不分词),可以快速找到字段值完全匹配的文档。例如:status: "published"
  • 查询性能特点:

    • 极快:就是:对于查找包含某个 Term 的文档,其性能非常高。查询过程
      1. 在 FST 词典中飞快定位 Term (类似 O(logN) 或更快)。
      2. 获取指向 Postings List 的指针。
      3. 遍历 Postings List 得到所有匹配的文档 ID。
    • 性能与 Term 的稀有度相关
      • 稀有 Term (Low-frequency Term):查询极快,基于 Postings List 很短。
      • 常见 Term (High-frequency Term):查询相对较慢,缘于 Postings List 很长,需要处理和合并更多的文档 ID。例如,搜索 “的” 会比搜索 “Lucene” 慢得多。
    • 不适合范围查询:对于文本,没有“范围”的概念。对于数字或日期,如果用倒排索引存储(老版本 Lucene 的做法),范围查询会变成一个巨大的布尔查询(OR 连接范围内所有的 Term),性能相当低下。
  • 典型查询: TermQuery, BooleanQuery, PhraseQuery, MatchQuery (in Elasticsearch)


2. 数字类型 (Points)

从 Lucene 6.x 开始,引入了 Points 类型来专门处理数值、日期、地理坐标等多维数据。它彻底改变了 Lucene 处理数值范围查询的方式。

  • 核心数据结构: BKD 树 (Block K-D Tree)。这是一种为多维空间数据检索优化的平衡树结构。

    • 对于数字,是一维 BKD 树。
    • 二维 BKD 树。就是对于地理坐标,
  • 主要用途:

    • 数值、日期的范围过滤:例如,查找价格在 [100, 500] 之间的商品,或者2023年的订单。
    • 地理空间位置过滤:例如,查找某个点周围5公里内的所有店铺。
  • 查询性能特点:

    • 范围查询极快:BKD 树的结构使得范围查询的复杂度大致为 O(logN),其中 N 是文档总数。它能够非常高效地剪掉不符合范围条件的文档块,无需逐一检查。
    • 性能与范围大小无关:查询一个很小的范围(如 [100, 101])和一个很大的范围(如 [0, 10000])的性能差异不大。这与倒排索引形成鲜明对比。
    • 精确值查询也很快:相当于一个范围为 [N, N] 的查询。
    • 不用于全文检索:它不存储原始文本,也不进行分词。
  • 典型查询: PointRangeQuery (in Elasticsearch)


3. DocValues

DocValues 是一个“正向”的索引结构,也被称为“列式存储”。它将字段值按文档 ID 进行了组织。


性能对比总结表

特性 / 类型倒排索引 (Inverted Index)数字 (Points)DocValues
核心思想Term -> Docs (反向映射)多维空间分割树DocID -> Value (正向映射/列存)
数据结构FST + Postings ListBKD Tree列式存储
最擅长的查询文本搜索、关键词精确匹配数值/日期/地理位置的范围过滤排序、聚合、脚本访问字段值
查询性能Term 越稀有越快对范围大小不敏感,对数级复杂度,非常快用于过滤时性能极差(线性扫描)
不擅长的场景数值范围查询、排序、聚合文本搜索任何形式的搜索/过滤
典型查询TermQuery, BooleanQueryPointRangeQuery不用于查询,用于 sortaggs
磁盘占用相对较大,尤其包含位置信息时相对紧凑相对紧凑,压缩率高
内存占用词典(FST)常驻内存,Postings按需加载索引的内部节点常驻内存,叶子节点按需加载严重依赖 OS Cache,按列加载,对 JVM 堆内存友好

场景化性能分析

假设我们有一个包含商品信息的索引,字段有 description (text), price (float), category (keyword)。

场景一:查找所有描述中包含 “durable” 的商品

场景二:查找价格在 100 到 200 之间的所有商品

场景三:按价格从高到低对搜索结果进行排序

场景四:统计每个分类 (category) 下有多少商品(聚合)

结论

在 Lucene 8.7.0 (以及现代所有版本) 中,这三种结构协同工作,缺一不可:

  1. 启用倒排索引和 Points 来“查找”和“过滤”文档集。这是查询的第一步,目标是尽可能快地缩小文档范围。
  2. 使用 DocValues 对“找到的”文档集进行“处理”,如排序、聚合或在脚本中提取值。

一个典型的复杂查询(如在电商网站上搜索)会同时利用到它们:

// 伪代码,类似 Elasticsearch 的查询
{"query": {"bool": {"must": [{ "match": { "description": "durable" } } // 使用倒排索引],"filter": [{ "range": { "price": { "gte": 100, "lte": 200 } } } // 使用 Points]}},"sort": [{ "price": "desc" } // 使用 DocValues],"aggs": {"categories": {"terms": { "field": "category" } // 使用 DocValues}}
}

理解它们的根本区别和适用场景,是进行 Lucene/Elasticsearch 性能优化的关键。

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

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

相关文章

500亿网站建设wordpress首页模块修改

题目描述 现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的降序排序…

数哈多应用授权系统如何为Go语言编程开发者给予知识产权保护?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数哈多应用授权系统如何为Go语言编程开发者给予知识产权保护?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站开发的公司电话微信h5手机网站

微信公众平台:https://mp.weixin.qq.com/ 第一次需要注册,有账号直接扫扫码登陆即可

2018企业网站优化应该怎么做做外贸主要看什么网站

信号处理函数可以正常返回&#xff0c;也可以调用其他函数返回到程序的主函数中&#xff0c;而不是从处理程序返回。 setjmp/longjmp 使用longjmp可以跳转到setjmp设置的位置 这两个函数原型如下 #include<setjmp.h> int setjmp(jmp_buf env); void longjmp(jmp_buf …

好听的音乐地址

好听的音乐地址https://www.youtube.com/watch?v=6T6Lj4Sdu6o&list=RD6T6Lj4Sdu6o&start_radio=1本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多…

雁塔区住房和城乡建设局网站中宁网站建设公司

随着家庭娱乐需求日益旺盛&#xff0c;越来越多的家庭消费者和游戏玩家开始追求大屏游戏带来的沉浸感。玩家在玩游戏的时候用大屏能获得更广阔的视野和更出色的视觉包围感&#xff0c;因此用大屏玩游戏已经成为了一种潮流。用酷开系统玩大屏游戏&#xff0c;过瘾又刺激&#xf…

服务器和网站维护太原注册公司网站

目录 一、安装XPath 二、XPath的基础语法 1.选取节点 三、使用XPath匹配数据 1.浏览器审查元素 2.具体实例 四、总结 一、安装XPath 控制台输入指令&#xff1a;pip install lxml 二、XPath的基础语法 XPath是一种在XML文档中查找信息的语言&#xff0c;可以使用它在HTM…

网站域名到期登不上是怎么回事想建书画网站怎么做的

第三章:处理机调度与死锁 处理机调度算法的目标 处理机调度算法的共同目标 资源利用率:CPU的利用率CPU有效工作时间/(CPU有效工作时间CPU空闲等待时间)公平性平衡性策略强制执行 批处理系统的目标 平均周转时间短系统吞吐量高处理机利用率高 分时系统的目标 响应时间快均…

旗讯OCR表格识别精准还原复杂表格,识别还原准确率95%+,还能结构化 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

二手车网站制作软件工程师面试常见问题

一、 MySQL建表&#xff0c;字段需设置为非空&#xff0c;需设置字段默认值。二、 MySQL建表&#xff0c;字段需NULL时&#xff0c;需设置字段默认值&#xff0c;默认值不为NULL。三、 MySQL建表&#xff0c;如果字段等价于外键&#xff0c;应在该字段加索引。四、 MySQL建表&a…

银河麒麟V10服务器桌面SP1、SP2、SP3国防版集采版国防集采版教育版

银河麒麟V10服务器桌面SP1、SP2、SP3国防版集采版国防集采版教育版 下载地址: kylin_gfb.zip 👍

戴尔网站建设规划旅游门户网站有哪些

2023年7月25日至26日&#xff0c;由中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;、中国通信标准化协会主办的以“云领创新&#xff0c;算启新篇”为主题的“2023可信云大会”在北京成功举办。会上公布了多项前瞻领域的评估结果和2023年度最佳实践案例&#x…

上海备案证查询网站查询网站查询系统网站建设公司专业网站费用报价

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…

凭祥网站建设php怎么做搭建网站

主题是拥抱开源 拥抱开源&#xff1a;开放是互联终端不断增长的主旨和核心——使技术世界变得越来越复杂&#xff0c;联系越来越紧密。在微软&#xff0c;我们专注于向客户提供任何信息支持&#xff0c;即使在任何设备或者在多个平台上。 未来是开放的&#xff0c;未来的云是开…

display ip routing-table故障判断及题目 - 详解

display ip routing-table故障判断及题目 - 详解2025-10-03 10:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

完整教程:华为eNSP环境安装和命令使用教程

完整教程:华为eNSP环境安装和命令使用教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

分布式架构初识:为什么需要分布式 - 教程

分布式架构初识:为什么需要分布式 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

[IOI 1998 / USACO2.2] 派对灯 Party Lamps 题解 + bitset浅谈

现在有这些按钮:按钮 \(1\):当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮; 按钮 \(2\):当按下此按钮,将改变所有奇数号的灯; 按钮 \(3\):当按下此按钮,将改变所有偶数号的灯; 按…

解题报告-小 A 的树

小 A 的树 题目描述 小 A 有一棵 \(N\) 个点的树,每个点都有一个小于 \(2^{20}\) 的非负整数权值。现在小 A 从树中随机选择一个点 \(x\),再随机选择一个点 \(y\)(\(x\)、\(y\)可以是同一个点),并对从 \(x\) 到 \…