
lucene源码
文章平均质量分 72
risc123456
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【lucene】currentFrame与staticFrame
currentFrame` 负责 把 `.tim` 文件里的一个压缩 block 解包到内存,然后提供 在该 block 里顺序/二分查找 term 的能力,并且在找到目标 term 后,把指向 `.doc/.pos/.pay` 的指针解析出来。block 用完就 弹栈 / 进栈 新的 `currentFrame`。`currentFrame` 是 `SegmentTermsEnum`(`TermsEnum` 的一个具体实现)里 “当前正在扫描的那个 block” 的 状态容器。原创 2025-07-29 17:41:29 · 344 阅读 · 0 评论 -
【lucene】SegmentCoreReaders
供 SegmentReader 使用 `SegmentReader` 的所有公开查询 API(`terms()`, `storedFields()`, `getNumericDocValues(...)` 等)最终都委托给 `SegmentCoreReaders` 里保存的实例。`org.apache.lucene.index` 包中。`fields` `FieldsProducer`(倒排索引) `.tim`, `.tip`, `.doc`, `.pos`, `.pay`变量名 对应格式 文件名示例。原创 2025-07-29 12:00:46 · 193 阅读 · 0 评论 -
【lucene】DocIdSetIterator
`DocIdSetIterator` 是一个只进(forward-only)迭代器,用于遍历满足某条件的 docId 列表,支持 `nextDoc()`、`advance(target)` 等方法,广泛用于查询、过滤、缓存等场景。`int docID()` 返回当前迭代到的 docId,未开始时为 `-1`,结束为 `NO_MORE_DOCS`(即 `Integer.MAX_VALUE`)`int nextDoc()` 移动到下一个 docId,返回新的 docId 或 `NO_MORE_DOCS`原创 2025-07-28 10:07:29 · 430 阅读 · 0 评论 -
【lucene】BlockMaxConjunctionScore
它基于 Block-Max WAND(BMW)算法,可以提前跳过不具竞争力的文档块(block),从而显著减少倒排表的解码和打分开销。> `BlockMaxConjunctionScorer` 是 Lucene 8.5+ 对多条件 AND 查询的 Top-K 优化利器,通过 block-max 上界 + 提前跳过 技术,大幅减少不必要的倒排解码与打分,显著提升性能。- 如果当前 doc 的 maxScore < minCompetitiveScore − 其他子句 maxScore,则该 doc 被跳过。原创 2025-07-28 10:01:34 · 400 阅读 · 0 评论 -
【lucene】向量搜索底层文件关系梳理
下面用“一张图 + 两条流程”把 **`.vec` / `.vem` / `.vex`** 三件套以及 **HNSW vs 暴力搜索** 时如何配合这三个文件彻底讲清。- **HNSW** 用三件套做“跳读”,**暴力搜索** 跳过 `.vex` 直接扫 `.vec`,但都靠 `.vem` 快速定位向量。- **`.vec`** 是“仓库”,**`.vem`** 是“索引目录”,**`.vex`** 是“楼层导航图”。4. **无图参与**:**不读 `.vex`**,顺序读 `.vec`。原创 2025-07-27 22:07:26 · 400 阅读 · 0 评论 -
【lucene】MMapDirectory 在FSDirectory基础上干了啥?
最终都会走到 `SegmentCoreReaders` → `openInput(name, IOContext.READONCE / RANDOM / MERGE)` 去为每个段文件(`.cfs`, `.fdx`, `.tim`, `.doc`, …)创建 `IndexInput`。)感知不到,只是底层 `IndexInput` 实现不同。- 可插拔的 `FSIndexOutput`/`FSIndexInput` 实现(用 `FileChannel.read/write` 做真正的 I/O)原创 2025-07-27 15:14:19 · 263 阅读 · 0 评论 -
【lucene】SegmentReader初始化过程概述
这一步对 **每一个涉及的索引文件**(`.tim/.tip/.doc/.fdt/.fdx/.dim/.dvd/.vex/.vec…| **读取所有倒排表、doc values、stored fields 内容** | ❌ **按需 lazily** |- **数据主体**(倒排表、BKD 块、向量、stored fields 内容)**仍懒加载**,不会一次性读空磁盘。| **把整个文件内容拷贝到内存** | ❌ **不会** || `.fdt/.fdx` | ✅ 文件头 | ✅ | ❌ |原创 2025-07-27 02:06:12 · 247 阅读 · 0 评论 -
【lucene]hnsw 向量索引文件格式说明
这些文件**始终独立存在**,不会被合并进 `.cfs`,以便支持 mmap 和高效跳读。| `.vem` | **HNSW 元数据**(维度、连接数、度量方式等) || `.vex` | **HNSW 图结构数据**(邻居连接、层级信息) || `.vec` | 原始向量数据(Flat 索引基础) || `.veq` | 量化后的向量数据(如 int8) || `.vemf` | Flat 索引的元数据 || `.vemq` | 量化索引的元数据 || 文件类型 | 作用 |原创 2025-07-27 01:22:14 · 125 阅读 · 0 评论 -
【lucene】不用indexSearcher可以自定义实现评分吗?
Lucene 的评分逻辑是内建在 `IndexSearcher`、`Weight`、`Scorer`、`Similarity` 这套框架里的;| 3️⃣ 遍历文档并打分 | 逐文档调 `Scorer.score()` 取得分值 | `Scorer.iterator()` + `Scorer.score()` |`Scorer` 自带一个 `DocIdSetIterator`;| 3 | 遍历文档并调用 `Scorer.score()` | `Scorer.iterator()` |原创 2025-07-27 00:44:55 · 716 阅读 · 0 评论 -
【lucene】仅使用IndexReader来实现搜索功能代码案例
/ 全局 docId(可选)// System.out.println("内容: " + doc.get("content"));System.out.println("全局 DocId: " + globalDocId);System.out.println("路径: " + doc.get("path"));// 2. 遍历所有段(LeafReaderContext)// 5. 遍历匹配的文档。// 4. 查找关键词是否存在。// 3. 获取字段的倒排表。// 1. 打开索引。原创 2025-07-26 19:07:19 · 275 阅读 · 0 评论 -
org.apache.lucene.search.Query#rewrite(IndexSearcher)过时讲解
**`IndexSearcher` 是面向用户的高级接口,Lucene 对其进行了大量优化,适合直接使用;Lucene 对 `IndexSearcher` 做了大量优化,使其更适合用户直接使用,而 `IndexReader` 则需要用户对底层实现有更深入的了解。**`IndexSearcher` 是面向用户的高级接口**,而 **`IndexReader` 是面向底层实现的低级接口**。#### 2️⃣ **`IndexReader` 是面向底层实现的低级接口**- **封装了索引的高级功能**原创 2025-07-26 17:49:35 · 433 阅读 · 0 评论 -
【lucene】AttributeSource概述
`AttributeSource` 是 Lucene 的“零拷贝属性仓库”,让 TokenStream 链里的所有组件共享同一份 Attribute 实例,实现高效、低 GC 的流式分词。`OffsetAttribute` `OffsetAttributeImpl` 起始/结束偏移。`TypeAttribute` `TypeAttributeImpl` token 类型。整个链共享 `termAtt` / `offAtt`,无需拷贝。3. 使用示例(自定义 TokenFilter)原创 2025-07-25 13:58:39 · 340 阅读 · 0 评论 -
【lucene】自定义tokenfilter 自带payload
只要在自定义 `TokenFilter` 里给 `PayloadAttribute` 赋值,并在 FieldType 里打开 `setStoreTermVectorPayloads(true)`,就能把任意二进制/字符串 payload 跟每个分词一起存进索引,再通过 `TermsEnum/PostingsEnum` 原样读出。整段代码 零依赖(除了 lucene-core、lucene-analysis-common),直接 `main` 方法即可跑。// 简单规则:名词/动词/其它。原创 2025-07-25 10:55:20 · 589 阅读 · 0 评论 -
【lucene】高亮案例
只要 字段存储原文并开启 Term Vector,Lucene 8.5 用 Highlighter + QueryScorer 即可轻松实现关键字高亮,无需 ES 也能获得 `<font>` 或 `<span>` 标签效果。高亮器 `Highlighter`(普通文本) / `FastVectorHighlighter`(性能更好,但需额外配置)/* ---------- 2. 搜索 + 高亮 ---------- *//* ---------- 1. 建索引 ---------- */原创 2025-07-25 08:51:19 · 824 阅读 · 0 评论 -
【lucene】实现knn
KnnFloatVectorQuery` 是 Lucene 用于执行最近邻搜索的查询类,它可以在一个字段中搜索与目标向量最相似的 k 个向量。- `KnnFloatVectorQuery` 的 rewrite 过程:在 rewrite 之后,`KnnFloatVectorQuery` 会变成 `DocAndScoreQuery`,它内部已经存储了符合条件的 `docId` 和 `score`。- HNSW 算法:HNSW 算法将新节点链接到 M 个最近邻,通过反向链接和修剪来保留多样性。原创 2025-07-23 16:11:01 · 380 阅读 · 0 评论