`
suichangkele
  • 浏览: 200334 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene中的docValue实现源码解读(十一)——SortedSet的读取

阅读更多

对于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项目的文档和源码

    源码阅读是理解任何软件内部工作原理的最好方式,通过研究Lucene的源码,我们可以深入了解其内部的数据结构、算法实现以及优化技巧。例如,可以学习到如何实现Trie数据结构进行高效查询,或者如何使用BitSet进行布尔...

    lucene3源码分析

    ### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...

    Lucene.Net-2.9.2 c#源码

    通过深入理解Lucene.Net 2.9.2的源码,开发者可以定制自己的分析器、优化查询性能、调整索引策略,从而在实际项目中充分发挥Lucene.Net的潜力。在构建查询网站时,结合C#的特性,可以构建出高效、灵活且用户体验良好...

    Lucene源码解读1

    【Lucene源码解读1】 Lucene是一款开源的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。其强大的搜索功能和高效的性能深受开发者喜爱。在深入理解Lucene之前,我们需要先了解它的核心概念...

    使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现 - 干勾鱼的CSDN博客 - CSDN博客1

    在Java开发中,Lucene被广泛用于实现文件的全文检索功能,包括对doc、docx、pdf、txt等常见格式文档的文本内容检索。在本文中,我们将探讨如何使用Lucene对这些文件类型进行全文检索的实现。 首先,为了实现全文...

    lucene.net2.9.4.2源码版

    《深入剖析Lucene.NET 2.9.4.2源码》 Lucene.NET是一个开源全文搜索引擎库,它是Apache Lucene项目的.NET版本。这个源码版是2.9.4.2版本,相较于2.9.4版进行了一些局部改进,以适应.NET平台的需求和优化。在本文中...

    Lucene3.5源码jar包

    总的来说,深入学习Lucene 3.5.0的源码,可以帮助开发者掌握全文检索的核心技术,了解其内部工作原理,并能灵活应用到自己的项目中。这份源码不仅适用于初学者,也是经验丰富的开发者的宝贵参考资料。通过阅读和理解...

    基于lucene搜索引擎的java源码

    学习这个源码包可以帮助你理解如何在Java环境中使用Lucene进行全文检索,以及如何实现数据库与索引之间的交互。这不仅涉及到了Lucene的核心功能,也涵盖了实际项目中常见的增量索引和数据库集成问题。通过阅读和理解...

    Lucene学习源码.rar

    本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...

    lucene全文检索案例源码

    通过对“lucene全文检索案例源码”的学习,我们可以理解Lucene如何在实际项目中实现全文检索。从索引构建到搜索执行,每个步骤都至关重要。通过源码的深入研究,有助于我们在实际开发中更好地运用Lucene,提升搜索...

    lucene.net 2.9.1 源码

    《深入剖析Lucene.NET 2.9.1:源码解析与应用开发》 Lucene.NET 2.9.1是开源搜索引擎库Lucene的.NET版本,它为.NET开发者提供了强大的全文检索和索引功能。这个版本的源码提供了一个宝贵的资源,帮助我们理解其内部...

    lucene in action源码2

    总之,《Lucene in Action》的源码是一份宝贵的教育资源,它能帮助开发者深入理解搜索引擎的运作原理,从而在实际项目中更好地利用Lucene。通过细致研究源码,我们不仅可以解决具体的技术问题,还能培养出更强的解决...

    lucene 华电项目 源码

    本文将结合“lucene 华电项目 源码”,深度解析Lucene的核心原理以及在华电项目中的实际应用。 首先,我们要理解Lucene的基本架构。Lucene的核心组件包括Analyzer(分析器)、Document(文档)、IndexWriter(索引...

    Lucene中的FST算法描述

    4. FSTHashMap:这是一个基于探测法实现的HashMap,其key是基于FSTNode生成的hash值,而value是FSTnode在FSTbytes数组中的位置索引。FSTHashMap可以加速判断某个节点是否已经被存储到FSTbytes中。 5. Frontier:这...

    Lucene In Action 2源码

    源码文件通常包含了书中各个章节的示例程序,这些示例涵盖了Lucene的基本用法到高级特性的实现,如文档索引、搜索查询、结果排序、过滤器、分词器、高亮显示等。通过研究这些源码,开发者可以了解如何有效地利用...

    Lucene.Net源码与说明文档

    **Lucene.Net** 是一个基于 .NET Framework 的全文搜索引擎库,它是 Apache Lucene 项目的 .NET 实现。这个开源项目提供了高效、可扩展的搜索功能,使得开发者能够在其应用程序中轻松地实现高级的文本检索功能。 **...

    lucene源码和程序

    在`lucene-1.4-final`这个压缩包中,包含了Lucene 1.4版本的源代码,你可以深入研究其内部实现,理解各个类和方法的工作原理。同时,这也可以帮助你定制分析器、优化搜索性能,或者扩展Lucene的功能,例如集成到你的...

    运用在lucene中的中文分词算法源码

    《深入剖析Lucene中的中文分词算法源码》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种数据检索系统。而中文分词是Lucene处理中文文本时的关键步骤,它决定了搜索的准确性和效率。本文将...

    lucene索引查看工具及源码

    - **索引读取**:了解 Luke 是如何使用 Lucene 的 `IndexReader` 和 `Directory` 接口来访问和加载索引的。 - **字段和文档处理**:观察 Luke 如何获取和显示文档字段,以及如何解析和展示不同类型的字段值。 - **...

    lucene源码

    深入理解 Lucene 的源码对于 Java 开发者来说,不仅可以提升对搜索引擎原理的理解,还能在实际项目中更好地利用 Lucene 的功能。 **1. Lucene 的核心组件** Lucene 的主要组成部分包括索引(Indexing)、查询解析...

Global site tag (gtag.js) - Google Analytics