当前位置: 首页 > news >正文

【lucene】BlockDocsEnum 跟BlockImpactsDocsEnum 的区别

区别集中在 **“如何计算/利用 impacts 并对结果进行提前裁剪”** 这一件事上。  
在 Lucene 的代码里,对应的核心方法只有两处,其余接口(nextDoc、advance、docID、freq 等)完全一致,因此:

1. 构造函数  
BlockImpactsDocsEnum 在构造时多干了一件事:把 impacts 读出来并缓存  
```
BlockImpactsDocsEnum(...){
super(...);            // 和 BlockDocsEnum 一样先初始化
readImpacts();         // ← 额外步骤:把 block 内的 impactData 读到内存
}
```

2. advance(int targetDoc)  
这是两者真正出现分叉的唯一方法:  
- BlockDocsEnum.advance()  
只按 doc id 做跳表定位 → 顺序落到 targetDoc 所在的 block → 结束。  

   - BlockImpactsDocsEnum.advance()  
在跳表定位后,还会 **用已缓存的 impacts 做一次上限预估**  
→ 如果当前 block 的 maxScore < minCompetitiveScore(全局当前第 N 名的分数),  
就继续跳到下一段,**直到找到一个“可能进 Top-N”的 block** 才真正落地,  
否则可能直接跳到倒排链末尾,整个子句提前结束。  

其余所有 public 方法(nextDoc、docID、freq、cost、positions 等)实现完全相同。  
因此:  
**差异 = 构造函数里多读的 impacts + advance() 里多做的 score 上限剪枝。**

http://www.dtcms.com/a/325056.html

相关文章:

  • C++入门学习5
  • Boost.Asio io_service 与 线程 的分析
  • playwright-mcp 项目全解析:从理论到实践
  • 消息队列系统测试报告
  • Effective C++ 条款33:避免遮掩继承而来的名称
  • 企业临时文件分享方案:基于本地加密的轻量级实现
  • Unity3D游戏中如何制作空气墙
  • 动态群签名-DGS:实现抗女巫攻击
  • eBay功能升级:卖家提升流量与转化的新契机
  • 深入解析NumPy广播机制:让不同形状的数组无缝运算
  • 【MySQL——第三章 :MySQL库表操作】
  • Redis 数据类型和单线程模型补充
  • HyDE 在 RAG 知识问答助手中的应用解析
  • CentOS7安装和使用Workbench
  • AtomicStampedReference解决方案
  • 基于python/django框架的车型识别系统
  • 复现论文《基于Retinex理论和深度学习的低照度图像增强算法研究》
  • 问津集 #4:The Five-Minute Rule for the Cloud: Caching in Analytics Systems
  • windows运维
  • SF-CPI-SAP问题收集24:集成地址信息的村里字段无法页面显示问题
  • ECharts 的理解和简单应用笔记
  • 【无标题】消息队列(Message Queue)是一种**进程间通信(IPC)机制
  • 深度学习-卷积神经网络-AlexNet
  • index.d.ts 是什么?作用 + 怎么生成?
  • 糖果大冒险:公平分发的智慧挑战
  • Stagewise使用指南:从项目集成到效能跃迁的深度解析
  • 【算法题】:和为N的连续正数序列
  • AI大模型-提示词工程
  • 01 词法分析陷阱:C编程中的符号误解
  • 深度解析 Spring Boot 循环依赖:原理、源码与解决方案