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

【lucene】livedocs描述

在 Lucene 里,liveDocs(通常写作 `liveDocs`) 是一个非常轻量的只读位图(`Bits`),用来快速回答“当前索引段里哪些文档还活着(即未被删除)”。  未被逻辑删除

(可能存在逻辑上已删除,但物理上还在,这种文档在livedocs认为是已经删除的)

一句话理解:  

> `liveDocs` 就是“未删除文档的身份证列表”,搜索时凡是位为 `1` 的 docID 就参与打分、返回;为 `0` 的直接跳过。

要点拆解:

1. 数据结构  

   - 类型:`org.apache.lucene.util.Bits`(位图)  

   - 长度 = 段内最大 docID + 1  

   - 每个 bit 对应一个 docID:`true` 表示存活,`false` 表示已逻辑删除。

2. 从哪来  

   - `LeafReader.getLiveDocs()` 返回。  

   - 底层由 `LiveDocsFormat` 从 `.liv` 文件读取(Lucene 8.x 默认是 `Lucene50LiveDocsFormat`)。

3. 用来干什么  

   - 搜索阶段:

     `IndexSearcher` 把 `liveDocs` 作为 `acceptDocs` 参数传给 `scoreAll`,见源码:

    

```java

     scorer.score(leafCollector, ctx.reader().getLiveDocs());

     ```

   - 合并阶段:`IndexWriter` 根据 `liveDocs` 把已删除文档真正丢弃,生成新的干净段。

4. 不存“删除文档”  

   - 它只记录“谁还活着”,并不保存删除文档的原始内容或列表。  

   - 已删除文档的数据仍在段文件里,只是被位图屏蔽,直到下次段合并才被物理清除。

因此,当你看到  

```java

Bits liveDocs = reader.getLiveDocs();

```  

就把它当成一张“快速通行证”:搜索时只让通行证上打钩的文档通过即可。

也就是说livedocs存的是所有没删除的文档?

是的,可以这么理解:

`liveDocs` 这个 `Bits` 对象覆盖了整个段的所有 docID,其中值为 `true` 的位正好对应当前仍然存活(未删除)的文档。  

换句话说,它不是“存文档”,而是用一个位图标记每个 docID 是否有效。  

- 位图长度 = 段内最大 docID + 1  

- 位为 1 → 该 docID 对应的文档未删除  

- 位为 0 → 该 docID 对应的文档已删除(逻辑删除)

所以 `liveDocs` 并不是把“没删除的文档列表”存进去,而是用“位数组”告诉我们哪些 docID 仍然可用。

http://www.xdnf.cn/news/17637.html

相关文章:

  • 【华为机试】208. 实现 Trie (前缀树)
  • 图像打标工具/方法的分类和特点说明
  • Launcher3启动
  • 实战:用 PyTorch 复现一个 3 层全连接网络,训练 MNIST,达到 95%+ 准确率
  • IoT/透过oc_lwm2m/boudica150 源码中的AT指令序列,分析NB-IoT接入华为云物联网平台IoTDA的工作机制
  • Java使用“Microsoft Print To PDF”打印时如何指定输出路径
  • Vue 利用el-table和el-pagination组件,简简单单实现表格前端分页
  • AI时代基于云原生的 CI/CD 基础设施 Tekton
  • Dubbo从入门到实战:分布式服务开发指南
  • USB 基本描述符
  • 视频播放器哪个好用?视频播放器PotPlayer,KMP Player
  • 下一个排列 的 思路总结
  • 从零开始的云计算生活——项目实战容器化
  • 标准IO详解(fgets、gets、fread、fwrite、fseek 等应用)
  • Java 包装类简单认识泛型
  • 《深度解构:React与Redux构建复杂表单的底层逻辑与实践》
  • C#使用EPPlus读写Excel
  • ubuntu20.04交叉编译vlc3.0.21 x64 windows版本
  • 大模型落地:AI 技术重构工作与行业的底层逻辑
  • Pytest 全流程解析:执行机制与报告生成实战指南
  • java 插入式注解的打开方式!
  • MySQL,Redis重点面试题
  • SQL179 每个6/7级用户活跃情况
  • Spring Framework源码解析——BeanPostProcessor
  • 【学习嵌入式day-22-Linux软件编程-IO】
  • SpringBoot集成支付宝二维码支付接口详解
  • Python3.10 + Firecrawl 下载 Markdown 文档:构建高效通用文章爬虫
  • 不同FPGA开发板系统移植步骤
  • Chrome插件开发【Service Worker练手小项目】
  • 【LeetCode刷题集】--排序(三)