之前写完了docValue的内容,但是如何获取docValue呢?或者将这个问题在宽泛一些,如何获取doc的正向信息,很简单,就是FieldCache,FieldCache采取了一个单利模式,他有一个实现类叫做FieldCacheImpl。所有的获取正向信息的操作都是通过这个类的getxxx方法,在这个通用的方法里面,所有的逻辑都是一样,如果一个域有docValue,则优先会的dcoValues,如果没有则读取这个域的词典表,unInvert,即将倒排表读取到内存中,然后每个doc再进行计算,将每个doc和每个term对应起来,然后再一个大Map中存起来。从效果上来看,在第一次读取的时候,如果没有docValue则会很慢,而且即使读取到内存中也是很消耗资源的,所以在facet、sort的时候,还是建议将对应的类做docValue,这样会更快。
看一下源码吧,这里以getInts为例:
public Ints getInts(AtomicReader reader, String field, IntParser parser, boolean setDocsWithField) throws IOException { final NumericDocValues valuesIn = reader.getNumericDocValues(field);//优先读取docValue, if (valuesIn != null) {//如果没有docValue,则使用 // Not cached here by FieldCacheImpl (cached instead // per-thread by SegmentReader): return new Ints() { @Override public int get(int docID) { return (int) valuesIn.get(docID); } }; } else {//如果没有docValue, final FieldInfo info = reader.getFieldInfos().fieldInfo(field); if (info == null) {//没有这个域 return Ints.EMPTY; } else if (info.hasDocValues()) {//有docValue,报错 throw new IllegalStateException("Type mismatch: " + field + " was indexed as " + info.getDocValuesType()); } else if (!info.isIndexed()) {//没有建立索引,则无法读取词典表,返回empty return Ints.EMPTY; } return (Ints) caches.get(Integer.TYPE).get(reader, new CacheKey(field, parser), setDocsWithField);//这个就是读取词典表。 } }
最关键的就是最后一行,从cache中获得int类型的对象,在FiledCacheImpl初始化的时候,就会向一个很大的map中写入很多对象,作为代理类,然后再读取的时候再从词典表中读取具体的term,然后再放入到原来的map中缓存起来,这样就完成了再没有docValue的情况下正向信息的获取。
相关推荐
Lucene.Net 2.3.1开发介绍 —— 二、分词(四),这是一个系列的文档,太多了,只好分开
在信息检索和存储系统中,Lucene是一个开源的全文搜索引擎库,广泛应用于各种需要全文搜索功能的软件项目中。为了高效地处理和检索存储的词项(term),Lucene使用了FST(有限状态转换器,Finite State Transducer)...
在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备丰富的词汇库和优秀的分词算法,能有效地对中文文本进行拆分。 - **IK Analyzer**:是一个开源的...
正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的优化处理 3. 对未知词汇采用自识别结合二元切分算法,确保搜索召回率 (使用方法请参考...
《开发自己的搜索引擎——Lucene+Heritrix(第2版)_随书光盘.rar》是一个包含资源的压缩包,主要用于帮助读者深入理解并实践搜索引擎的开发。Lucene和Heritrix是两个重要的开源工具,它们在构建搜索引擎的过程中起着...
《Lucene中文分词器——Paoding解牛详解》 在中文信息检索领域,分词是至关重要的一环,它能够将连续的汉字序列切割成具有独立意义的词语,为后续的索引和查询提供基础。Lucene作为Java最著名的全文搜索引擎库,其...
全面支持Lucene 2.0 增强了词典维护的API 增加了商品编码的匹配 增加了Mail地址的匹配 实现了词尾消歧算法第二层的过滤 整理优化了词库 1.4.0 —— 2006-08-21 增加词典的动态扩展能力 1.3.3 ...
Java搜索工具——Lucene实例总结(一) 在Java开发中,搜索引擎已经成为不可或缺的一部分,而Apache Lucene正是一个强大的全文搜索...在后续的文章中,作者可能还会介绍更多关于Lucene的高级特性和使用技巧,敬请期待。
Lucene是一个强大的全文检索库,广泛应用于搜索引擎开发和其他信息检索系统中。它提供了高效、可扩展的文本搜索功能,但是默认情况下并不支持中文处理。为了在Lucene中处理中文文本,我们需要引入专门的中文分词器...
在信息技术领域,中文分词是文本处理的一个关键步骤,尤其是在搜索引擎和自然语言处理应用中。Lucene是一个高性能、全文检索库,而“lucene中文分词工具包”则为Lucene提供了一个专门针对中文分词的解决方案。这个...
虽然提供的资源中没有代码,但通过学习《开发自己的搜索引擎——Lucene+Heritrix》这本书,开发者可以了解到构建搜索引擎的基本流程和技术细节,再通过其他途径获取代码示例,实现在实际项目中的应用。
赠送Maven依赖信息文件:lucene-core-7.2.1.pom; 包含翻译后的API文档:lucene-core-7.2.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.lucene:lucene-core:7.2.1; 标签:apache、lucene、core、...
**Lucene 3.0 全文信息检索** Lucene 是一个由Apache软件基金会4 Jakarta项目组开发的开源全文检索引擎工具包。自1999年发布以来,Lucene 已经发展成为Java世界中最为广泛使用的全文检索库,为开发者提供了构建高...
Lucene是一个强大的全文检索库,它被广泛应用于各种信息检索和搜索引擎系统中。这个“完整版”可能指的是提供了一个完整的项目,包含了源代码,使得用户可以直接运行并理解其工作原理。 描述中的“又完整工程,源...
《Lucene中文分词——庖丁解牛》 在自然语言处理领域,中文分词是基础且关键的一环。在Java开发中,Apache Lucene是一个强大的全文搜索引擎库,但默认并不支持中文,这就需要借助第三方分词工具。本文将深入探讨...
在实践中,作者发现按行处理的方式更有效,尤其是在需要保留每行完整信息的情况下。例如,如果每行数据包含多个字段,按行创建Document可以确保检索时能够准确匹配到所需的行。 【中文乱码问题】 中文乱码问题通常...
【基于Java的全文索引检索引擎——Lucene】 Lucene是一个用Java编写的开源全文检索引擎库,由Doug Cutting创建并贡献给Apache基金会,成为Jakarta项目的一部分,后来成为Apache软件基金会下的顶级项目。它的主要...
其中,Apache Lucene作为一个开源的全文检索库,被广泛应用于各种项目中,尤其对于处理中文文本,分词是其关键的一环。本文将深入探讨如何在Lucene中高效地进行中文分词,借助“庖丁解牛”的概念,以求在理解与应用...
首先,我们来了解核心组件——Lucene 6.6。这个版本的Lucene引入了多项改进,包括更快的搜索速度、更稳定的性能以及对多语言的支持。然而,对于中文文本,Lucene默认的分词器并不理想,因此我们需要引入专门针对中文...