对于SetDocValue的读取很简单,因为他的写入的格式和之前的SortedDocValue和SortedNumericDocValue有很多重复的地方,所以在读取的时候也是有很多重复的地方。
先看看最终要返回的接口吧,
public abstract class SortedSetDocValues { /** Sole constructor. (For invocation by subclass constructors, typically implicit.) */ protected SortedSetDocValues() {} /*** When returned by {@link #nextOrd()} it means there are no more ordinals for the document. */ public static final long NO_MORE_ORDS = -1; /** 读取当前的doc的下一个byte[]的排序 */ public abstract long nextOrd(); /** 设置要读取的doc的id */ public abstract void setDocument(int docID); /** 查找指定排序的byte[] */ public abstract BytesRef lookupOrd(long ord); /** 返回所有的byte[]的个数 */ public abstract long getValueCount(); /** 查询某个byte[]是否存在,如果不存在返回一个负数,这个方法被覆写了 */ public long lookupTerm(BytesRef key) { long low = 0; long high = getValueCount() - 1; while (low <= high) { long mid = (low + high) >>> 1; final BytesRef term = lookupOrd(mid); int cmp = term.compareTo(key); if (cmp < 0) { low = mid + 1; } else if (cmp > 0) { high = mid - 1; } else { return mid; // key found } } return -(low + 1); // key not found. } /** 返回迭代所有的byte[]的对象 ,这个方法也被覆写了*/ public TermsEnum termsEnum() { return new SortedSetDocValuesTermsEnum(this); } }
上面的功能很简单,基本和之前的SortedDocValue和SortedNumericDocValue一样。再看看具体的操作:
public SortedSetDocValues getSortedSet(FieldInfo field) throws IOException { SortedSetEntry ss = sortedSets.get(field.number); if (ss.format == SORTED_SINGLE_VALUED) { final SortedDocValues values = getSorted(field); return DocValues.singleton(values); } else if (ss.format != SORTED_WITH_ADDRESSES) { throw new AssertionError(); } final long valueCount = binaries.get(field.number).count;//所有的byte[]的个数 // we keep the byte[]s and list of ords on disk, these could be large final LongBinaryDocValues binary = (LongBinaryDocValues) getBinary(field);//获得所有的byte[]。 final LongValues ordinals = getNumeric(ords.get(field.number));//读取第二部分,也就是每个doc的所有的排序的地方, // but the addresses to the ord stream are in RAM, 读取第三部分,即地址部分,用于计算每个doc的排序的地址 final MonotonicBlockPackedReader ordIndex = getOrdIndexInstance(field, ordIndexes.get(field.number)); return new RandomAccessOrds() { long startOffset;//当前的doc的第一个byte[]是总的byte[]的多少个。 long offset;// long endOffset;//当前的doc的下一个doc的第一个byte[]是总的byte[]的多少个。 public long nextOrd() {//读取当前doc的下一个byte的排序 if (offset == endOffset) { return NO_MORE_ORDS; } else { long ord = ordinals.get(offset); offset++; return ord; } } public void setDocument(int docID) {//读取指定的doc, startOffset = offset = ordIndex.get(docID); endOffset = ordIndex.get(docID + 1L); } @Override public BytesRef lookupOrd(long ord) {//根据排序获得byte[] return binary.get(ord); } @Override public long getValueCount() {//所有的byte[]的个数 return valueCount; } @Override public long lookupTerm(BytesRef key) {//返回一个byte[]是否存在,如果存在返回其排序,否则返回一个负数 if (binary instanceof CompressedBinaryDocValues) {//进入 return ((CompressedBinaryDocValues) binary).lookupTerm(key); } else { return super.lookupTerm(key); } } @Override public TermsEnum termsEnum() { if (binary instanceof CompressedBinaryDocValues) {//这个是进入的,因为在存储所有的byte[]的时候,就是前缀压缩的,和之前的SortedDocValue的格式是一样的,所以返回的结果也是一样的 return ((CompressedBinaryDocValues) binary).getTermsEnum(); } else { return super.termsEnum(); } } @Override public long ordAt(int index) { return ordinals.get(startOffset + index); } @Override public int cardinality() { return (int) (endOffset - startOffset); } }; }
如果看懂了SortedDocValue其实这里也很简单。
过年夜,少写点。。
相关推荐
源码阅读是理解任何软件内部工作原理的最好方式,通过研究Lucene的源码,我们可以深入了解其内部的数据结构、算法实现以及优化技巧。例如,可以学习到如何实现Trie数据结构进行高效查询,或者如何使用BitSet进行布尔...
### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...
通过深入理解Lucene.Net 2.9.2的源码,开发者可以定制自己的分析器、优化查询性能、调整索引策略,从而在实际项目中充分发挥Lucene.Net的潜力。在构建查询网站时,结合C#的特性,可以构建出高效、灵活且用户体验良好...
【Lucene源码解读1】 Lucene是一款开源的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。其强大的搜索功能和高效的性能深受开发者喜爱。在深入理解Lucene之前,我们需要先了解它的核心概念...
在Java开发中,Lucene被广泛用于实现文件的全文检索功能,包括对doc、docx、pdf、txt等常见格式文档的文本内容检索。在本文中,我们将探讨如何使用Lucene对这些文件类型进行全文检索的实现。 首先,为了实现全文...
《深入剖析Lucene.NET 2.9.4.2源码》 Lucene.NET是一个开源全文搜索引擎库,它是Apache Lucene项目的.NET版本。这个源码版是2.9.4.2版本,相较于2.9.4版进行了一些局部改进,以适应.NET平台的需求和优化。在本文中...
总的来说,深入学习Lucene 3.5.0的源码,可以帮助开发者掌握全文检索的核心技术,了解其内部工作原理,并能灵活应用到自己的项目中。这份源码不仅适用于初学者,也是经验丰富的开发者的宝贵参考资料。通过阅读和理解...
学习这个源码包可以帮助你理解如何在Java环境中使用Lucene进行全文检索,以及如何实现数据库与索引之间的交互。这不仅涉及到了Lucene的核心功能,也涵盖了实际项目中常见的增量索引和数据库集成问题。通过阅读和理解...
本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...
通过对“lucene全文检索案例源码”的学习,我们可以理解Lucene如何在实际项目中实现全文检索。从索引构建到搜索执行,每个步骤都至关重要。通过源码的深入研究,有助于我们在实际开发中更好地运用Lucene,提升搜索...
《深入剖析Lucene.NET 2.9.1:源码解析与应用开发》 Lucene.NET 2.9.1是开源搜索引擎库Lucene的.NET版本,它为.NET开发者提供了强大的全文检索和索引功能。这个版本的源码提供了一个宝贵的资源,帮助我们理解其内部...
总之,《Lucene in Action》的源码是一份宝贵的教育资源,它能帮助开发者深入理解搜索引擎的运作原理,从而在实际项目中更好地利用Lucene。通过细致研究源码,我们不仅可以解决具体的技术问题,还能培养出更强的解决...
本文将结合“lucene 华电项目 源码”,深度解析Lucene的核心原理以及在华电项目中的实际应用。 首先,我们要理解Lucene的基本架构。Lucene的核心组件包括Analyzer(分析器)、Document(文档)、IndexWriter(索引...
4. FSTHashMap:这是一个基于探测法实现的HashMap,其key是基于FSTNode生成的hash值,而value是FSTnode在FSTbytes数组中的位置索引。FSTHashMap可以加速判断某个节点是否已经被存储到FSTbytes中。 5. Frontier:这...
源码文件通常包含了书中各个章节的示例程序,这些示例涵盖了Lucene的基本用法到高级特性的实现,如文档索引、搜索查询、结果排序、过滤器、分词器、高亮显示等。通过研究这些源码,开发者可以了解如何有效地利用...
**Lucene.Net** 是一个基于 .NET Framework 的全文搜索引擎库,它是 Apache Lucene 项目的 .NET 实现。这个开源项目提供了高效、可扩展的搜索功能,使得开发者能够在其应用程序中轻松地实现高级的文本检索功能。 **...
在`lucene-1.4-final`这个压缩包中,包含了Lucene 1.4版本的源代码,你可以深入研究其内部实现,理解各个类和方法的工作原理。同时,这也可以帮助你定制分析器、优化搜索性能,或者扩展Lucene的功能,例如集成到你的...
《深入剖析Lucene中的中文分词算法源码》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种数据检索系统。而中文分词是Lucene处理中文文本时的关键步骤,它决定了搜索的准确性和效率。本文将...
- **索引读取**:了解 Luke 是如何使用 Lucene 的 `IndexReader` 和 `Directory` 接口来访问和加载索引的。 - **字段和文档处理**:观察 Luke 如何获取和显示文档字段,以及如何解析和展示不同类型的字段值。 - **...
深入理解 Lucene 的源码对于 Java 开发者来说,不仅可以提升对搜索引擎原理的理解,还能在实际项目中更好地利用 Lucene 的功能。 **1. Lucene 的核心组件** Lucene 的主要组成部分包括索引(Indexing)、查询解析...