当前位置: 首页 > 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.lryc.cn/news/615805.html

相关文章:

  • LeetCode 869.重新排序得到 2 的幂:哈希表+排序(一次初始化)
  • Java设计模式之开闭原则介绍与说明
  • 深入解析Go设计模式:命令模式实战
  • 分布微服务电商订单系统Rust编码开发[上]
  • Rust进阶-part6-宏
  • [激光原理与应用-224]:机械 - 机械设计与加工 - 常见的术语以及含义
  • 每日算法刷题Day60:8.10:leetcode 队列5道题,用时2h
  • 机器学习-增加样本、精确率与召回率
  • Modbus RTU转Profinet网关接在线循环Na离子实现PLC读取温度值
  • C# 中常用集合以及使用场景
  • 本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕增加利用 Whisper 分段信息,全新 Prompt功能
  • Framework开发之Zygote进程2(基于开源的AOSP15)--init.rc在start zygote之后的事情(详细完整版逐行代码走读)
  • 《解锁 C++ 基础密码:输入输出、缺省参数,函数重载与引用的精髓》
  • 【Linux | 网络】数据链路层
  • 九、Linux Shell脚本:运算符与表达式
  • 开启单片机
  • 服务器硬件电路设计之 I2C 问答(三):I2C 总线上可以接多少个设备?如何保证数据的准确性?
  • 笔试——Day34
  • 亚麻云之全球加速器——CloudFront(CDN)服务入门
  • 【Docker实战】Spring Boot应用容器化
  • ShadowKV 机制深度解析:高吞吐长上下文 LLM 推理的 KV 缓存“影子”方案
  • Python爬虫-爬取政务网站的文档正文内容和附件数据
  • 【后端】Java 8 特性 `User::getId` 语法(方法引用)介绍
  • 【东枫科技】NTN-IOT 卫星互联网原型系统,高达1.6G大带宽
  • MPLS特性之PHP(Penultimate Hop Popping)
  • Android快速视频解码抽帧FFmpegMediaMetadataRetriever,Kotlin(2)
  • 【软考中级网络工程师】知识点之 DCC 深度剖析
  • 【21】OpenCV C++实战篇——OpenCV C++案例实战二十七《角度测量》
  • Perplexity 为特朗普 Truth Social 提供技术支持
  • 如何培养自己工程化的能力(python项目)