Lucene搜索流程(2.IndexReader)

本文深入探讨了Lucene中IndexReader的使用及其实现原理,包括如何通过DirectoryReader打开目录,SegmentReader的角色,以及IndexReader的重要方法如terms(), termDocs(), maxDoc()和document()等的详细解释。

上一篇说到了Directory为我们搜索提供了基础,下面我们就要开始打开这个Directory了。

用IndexReader打开一个Directory还是包含了不少细节的,下面我们一起来探讨下

 首先IndexReader其实是一个abstract的类,所以我们打开不可能实例化这个类,那我们打开一个FSDreictory究竟打开的是啥呢?看看下面这断代码就明了了

public static IndexReader open(final Directory directory) throws CorruptIndexException, IOException {
    return DirectoryReader.open(directory, null, null, true, DEFAULT_TERMS_INDEX_DIVISOR);
  }

IndexReader里面还有很多个open方法的重载版本,其实就是调用了DirectoryReader.open了,这个DirectoryReader是个啥玩意呢,我们去探探究竟。看名字就很简单,这个DirectoryReader就是用来打开一个Directory的嘛,但是有的童鞋要问了,lucene里面的索引不都是保存在Directory里面吗?不就是用DirectoryReader就行了么?

这个嘛,其实lucene在搜索的时候为了将搜索任务细分到不同的Reader(比如并行搜索),因此在DirectoryReader里面其实是有很多的子Reader的,这里就是SegmentReader(段索引Reader)了,这个就是最终的底层Reader了,所有的操作都是通过它来进行的,在open一个目录的时候,会读取索引文件里面的segment_*这个文件的相关信息,得出这个目录里面的索引断详细信息,然后每个段都会打开一个SegmentReader,单独负责这个断的信息读取,我们最终的所有的索引搜索操作就都是由他们完成了,这样做的目的前面我也说了,我们可以用一个线程池,然后再每个断上用一个线程对其进行搜索,然后将结果合并起来,这样是不是提高了很大的效率,其实lucene就用这样的功能的,这个等我们说到IndexSearcher的时候再细说。

然后根据是否可以用这个Reader可以进行索引写操作,还有ReaderOnlySegmentReader。我们知道可以通过IndexReader来删除文档,用了ReaderOnly的IndexReader的话就相当于将这一操作给禁止了,相信用过luke的童鞋都知道luke有个以只读模式打开索引的选项,其实就是用的这个IndexReader,这里啰嗦一句,其实我也建议大家不要用IndexReader对索引进相关的操作,因为涉及到了锁和并发各方面的原因,结果也许会出现不可预想的后果(比如索引损坏),那个时候就只有哭了T_T,而且读和写分开,对我们的程序的设计有很大的方便,听说在4.0里面已经不能再IndexReader里面删除了,不知道是不是真的?

下面来介绍几个IndexReader的重要方法:

public TermEnum terms();

这个方法的作用是获取一个所有索引里面保存的词的一个枚举,通过这个枚举我们可以用类似while循环获取这个索引里面保存的所有的分词信息(不是保存的信息,是一个字段通过分词器分词后的词信息),这个方法有大用,以后我们讲查询的时候详细再说。

public TermEnum terms(Term t) throws IOException ;

这个方法和上面的类似,但是这个方法可以通过一个词(Term)对要获取的词进行定位,比如索引中存在如下词

Field:0

Field:1

Field:2

Field:3

Field:4

如果这里我们传入一个new Term("Field","3")的话,就可以获得一个从(Filed:4)开始的词枚举。

如果传入的词不存在呢?如果不存在。Lucene会找到一个比我们传入的词大的词,这个大是怎么解释呢,其实就是Term实现了Comparable接口,然后compareTo返回大于或等于1的就行了,这个方法也是非常重要的,对查询重写有很大的意义,这里暂时也还是不讲。

下面看看这两个方法:

public TermDocs termDocs() throws IOException

public TermDocs termDocs(Term term) throws IOException;

这两个方法的作用从词义上将就是获取一个文档枚举器,我们当然同样可以通过这个枚举获取这个Reader里面读取的文档ID号,这里为啥不是目录而是Reader里面的呢?因为我们知道文档ID只有在索引打开的时候存在,只存在于运行时,并不是一个持久化的标示符。上面那个方法和下面那个方法的区别在于,上面的方法或得得TermDocs并不能直接使用,因为是未定位的(unposition),在使用前我们要先使用seek来定位,下面则可以直接通过一个词来定位指定的文档,Lucene的索引保存方式是以倒排表的方式来存储的,因此可以通过这个词来快速定位包含这个词的文档,这个方法就是这种倒排表的体现,另外这两个方法获取出来的文档都是不包含已经删除的文档的哦。

public int maxDoc();
public int numDocs()

这两个方法也是两兄弟,上面按个方法是获取比当前索引中的最大的那个文档号还要大1的一个int值,下面那个下面按个一般来说就是调用上面那个方法然后减去已经删除掉的文档的数量,就是这个索引包含的全部的文档的数量,两个的区别在于定义上上面一个是获取最大的文档号,下面只是获取文档的数量。

 最后两个方法

public abstract Document document(int n, FieldSelector fieldSelector) throws CorruptIndexException, IOException;
public final Document document(int n) throws CorruptIndexException, IOException ;

最后两个方法也是我们的重中只重了,光能搜索不行,我们还要获取我们保存在索引里面的相关信息,这个两个方法就是通过一个文档ID来获取指定文档保存的信息,下面那个方法是final的,其实就是调用了上面的方法的一个重载,关于那个FieldSelctor说明下,这个是一个接口,相当于一个过滤器,用来过滤我们获取文档里面的数据的时候对字段进行一些过滤操作(也不完全是过滤,但是包含过滤),这个接口里面定义了一个单独的方法:

FieldSelectorResult accept(String fieldName);

就是Lucene读取到指定的字段的时候会调用这个方法,然后根据返回的FieldSelectorResult来进行不同的操作,这个等到后面我们说到document的时候在详解。

OK,今天这篇博文先写到这里,如果有什么看不懂或者不妥的地方欢迎联系我,最近人都变懒了,还有最近本人在追北京青年这部电视剧,每天差不多都是2点去了。。。。表示很累啊(T_T),更新都比较慢,希望能够对大家学习Lucene的过程中有所帮助!

转载于:https://my.oschina.net/zengjie/blog/74668

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值