转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/2017190
Lucene的索引过程,非常简洁,我们只需要调用Lucene提供的几个API方法即可,看似简单的过程,其实在lucene的内部,是非常复杂巧妙的,只不过它给我们提供的外部API非常精简轻便。
Directory directory=FSDirectory.open(new File("E:\\1111111111111111111\\1\\"));//打开存放索引的路径
IndexWriter writer1=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_45, new IKAnalyzer(true)));
Document doc=new Document();
doc.add(new StringField("id", "11", Store.YES));
doc.add(new StringField("name","三劫散仙", Store.YES));
writer1.addDocument(doc);
writer1.forceMerge(1);//优压缩段
writer1.commit();//提交数据
如上所示,就是一个索引的基本流程。当然上面的这个流程显的太简单了。而真正的情况可能要比这个复杂的多。
Lucene的索引过程主要分为3个主要的步骤:
1:将原始文档转换为文本
2:使用分词器分析文本
3:将分析好的文本保存到索引里。
当然,如果我们的应用是基于垂直搜索的,可能我们的数据源就是我们的数据库,或者是一些例如excel,word,pdf,txt之类的文件,如果是文件的话我们可以使用Apache Tika来解析文本,然后在分词后存入索引,但是Lucene是不直接具备这样的功能的,需要我们提前自己把数据的文本内容抽取出来。
当我们把我们所需要的文本抽取出来之后,下一步就开始分析我们的索引内容了,当然这个过程是非常复杂的,不过只需要提前设置好分词器就可以方便的完整这个过程,为什么要分词呢?
我们都知道lucene是基于倒排索引的形式,来构建整个索引的,把原来的根据一篇文章查找关键词,变成了根据关键词查找文章,这样一个反转,类似,书本的页码一样,就能够非常高效的检索了,在分析过程中,lucene会对一些token,做净化,清洗,归一,以及去掉一些禁用词等等,这个过程都是由Analyzer来完成的。当处理好最终的token时,我们就可以使用IndexWriter对象来把数据添加到磁盘的索引里,为以后的检索做准备。
下面我们来详细介绍下分词的过程,一般情况下分词指的是将Lucene中的Field文本,转换为最基本的索引表示单元,也就是term,分词器对分析操作进行了一系列的封装通过Tokenizer和一些TokenFilter,执行若干操作,将文本转换成便于索引查找的语汇单元。
这些操作可能包括:提取文本关键词,去除标点符号,去掉音调符号(拼音和英文),转换大小写,去除常用词,将单词还原成词干,或者将单词转为基本形式,词形归并,或者我们还需要在分词的过程中注入同义词等等。
文本中的每个语汇单元,都携带了一个文本值和其他的一些元数据信息,除了自身的文本值(即文本本身),还有原始文本从起点到终点的偏移量,语汇单元的类型,位置增量,标志位,和载荷。
注意起点的偏移量指的是语汇单元文本的的起始字符在原始文本中的位置,终点的偏移量指的是语汇单元终止字符的下一个位置,这一点需要注意并不是语汇单元的最后一个字符的位置,是其的下一位,偏移量在一些距离和跨度查询时非常有用,最重要的是这个偏移量对于搜索结果中的高亮显示非常有用,没有这些数据想完成高亮可能就有点麻烦了,但不是说不能完成,我们也可以在前台进行高亮,关于如何在前台高亮,可以参考散仙
修真篇的文章
在这里就不多涉及了。
当所有的文本被语汇成单元后,lucene将会通过一种链式方式,在后台层层把这些信息添加到lucene的各个索引文件里。默认的索引链在DocumentsWriterPerThread中有初始化
[static final IndexingChain defaultIndexingChain = new IndexingChain() {
@Override
DocConsumer getChain(DocumentsWriterPerThread documentsWriterPerThread) {
/*
This is the current indexing chain:
DocConsumer / DocConsumerPerThread
--> code: DocFieldProcessor
--> DocFieldConsumer / DocFieldConsumerPerField
--> code: DocFieldConsumers / DocFieldConsumersPerField
--> code: DocInverter / DocInverterPerField
--> InvertedDocConsumer / InvertedDocConsumerPerField
--> code: TermsHash / TermsHashPerField
--> TermsHashConsumer / TermsHashConsumerPerField
--> code: FreqProxTermsWriter / FreqProxTermsWriterPerField
--> code: TermVectorsTermsWriter / TermVectorsTermsWriterPerField
--> InvertedDocEndConsumer / InvertedDocConsumerPerField
--> code: NormsConsumer / NormsConsumerPerField
--> StoredFieldsConsumer
--> TwoStoredFieldConsumers
-> code: StoredFieldsProcessor
-> code: DocValuesProcessor
*/
// Build up indexing chain:
final TermsHashConsumer termVectorsWriter = new TermVectorsConsumer(documentsWriterPerThread);
final TermsHashConsumer freqProxWriter = new FreqProxTermsWriter();
final InvertedDocConsumer termsHash = new TermsHash(documentsWriterPerThread, freqProxWriter, true,
new TermsHash(documentsWriterPerThread, termVectorsWriter, false, null));
final NormsConsumer normsWriter = new NormsConsumer();
final DocInverter docInverter = new DocInverter(documentsWriterPerThread.docState, termsHash, normsWriter);
final StoredFieldsConsumer storedFields = new TwoStoredFieldsConsumers(
new StoredFieldsProcessor(documentsWriterPerThread),
new DocValuesProcessor(documentsWriterPerThread.bytesUsed));
return new DocFieldProcessor(documentsWriterPerThread, docInverter, storedFields);
}
};
经过一系列链式传递后,索引并不会马上写入磁盘中,而是先写入内存中,然后到一定时机会flush到磁盘上,这实际上也是一种优化策略,从而避免了频繁访问磁盘带来的IO开销,当然我们也可以显式得调用commit方法,将其刷新到磁盘上。
转载请务必注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/2017190
- 大小: 33.8 KB
- 大小: 37.1 KB
分享到:
相关推荐
在"lucene4.3 按坐标距离排序"这个主题中,我们将探讨如何在Lucene 4.3版本中利用地理位置信息进行文档排序,特别是在处理地理空间搜索时的应用。 首先,Lucene 4.3引入了对地理空间搜索的支持,这允许我们根据地理...
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会...
lucene4.3增删改查的的一个工具类,对新手来说是一份不可多得的入门资料。
全文检索lucene 4.3 所用到的3个jar包,包含lucene-queryparser-4.3.0.jar、 lucene-core-4.3.0.jar、lucene-analyzers-common-4.3.0.jar。
《Lucene高级搜索进阶项目_04》 在深入探讨Lucene的高级搜索进阶项目时,我们首先需要理解Lucene的核心概念及其在信息检索中的应用。Lucene是一个高性能、全文本搜索库,它提供了丰富的搜索功能,包括布尔运算、...
lucene4.3源代码 censed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information ...
本课程由浅入深的介绍了Lucene4的发展历史,开发环境搭建,分析lucene4的中文分词原理,深入讲了lucenne4的系统架构,分析lucene4索引实现原理及性能优化,了解关于lucene4的搜索算法优化及利用java结合lucene4实现...
Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。在Java编程环境中,它为开发者提供了强大的文本检索功能,使得在海量数据中快速查找相关信息变得简单易行。本篇文章将详细探讨Lucene 4.3.1版本的...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
1.XunTa是在lucene4.3上创建的通过“知识点”来找人的搜人引擎。 输入一个关键词(或组合),XunTa返回一个排名列表,排在前面的人是与该关键词(组合)最相关的“达人”。 可访问 http://www.xunta.so立即体验...
在本课程中,我们主要探讨了Lucene 4.x版本的高级进阶应用,特别是针对大规模文档搜索引擎的构建。Lucene作为一个开源全文搜索引擎库,它提供了高效、灵活的索引和搜索功能,是构建高性能搜索系统的基石。在这个部分...
结合笔者的实际开发经验,总结了一些新的开发技巧和开发思路,并对网上流传的一些错误...本书既可为零起点的Lucene初学者提供系统全面的学习指导,也可帮助有相关经验的开发者解决在开发过程中遇到的一些难题和疑惑。
在高级进阶部分,我们将重点探讨Lucene在索引、搜索、排序、过滤以及分词器等方面的高级用法,旨在帮助开发者掌握Lucene的精髓,打造高效、精确的搜索体验。 1. **Document与索引更新**: 在Lucene中,`Document`...
【Lucene4.X实战类baidu搜索的大型文档海量搜索系统】课程主要涵盖了Lucene搜索引擎的各个方面,包括基础和高级进阶。以下是课程的主要知识点: 1. **Lucene入门与系统架构**:介绍Lucene的基本概念,以及其系统...
Lucene是Java开发的开源库,它提供了文本分析、索引和搜索功能,使得开发者能够轻松地在应用程序中实现复杂的搜索功能。这个项目的重点在于提升对Lucene高级特性和优化技巧的理解。 首先,我们要了解Lucene的核心...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...
共13页07.Lucene搜索实战1 共4页08.Lucene搜索实战2 共5页09.Lucene搜索深入实战1 共5页10.Lucene搜索深入实战2 共11页11....Lucene高级进阶1 共23页16.Lucene高级进阶2 共4页17.Lucene高级进阶3 共4页18.Lucene排序...