`
weitao1026
  • 浏览: 1034365 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Lucene的索引过程,非常简洁,

阅读更多
Lucene的索引过程,非常简洁,我们只需要调用Lucene提供的几个API方法即可,看似简单的过程,其实在lucene的内部,是非常复杂巧妙的,只不过它给我们提供的外部API非常精简轻便。



Java代码 复制代码 收藏代码
1.Directory    directory=FSDirectory.open(new File("E:\\1111111111111111111\\1\\"));//打开存放索引的路径 
2.        IndexWriter writer1=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_45, new IKAnalyzer(true))); 
3.        Document doc=new Document(); 
4.        doc.add(new StringField("id", "11", Store.YES)); 
5.        doc.add(new StringField("name","三劫散仙", Store.YES)); 
6.        writer1.addDocument(doc); 
7.          
8.         writer1.forceMerge(1);//优压缩段 
9.         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中有初始化




Java代码 复制代码 收藏代码
1.[static final IndexingChain defaultIndexingChain = new IndexingChain() { 
2. 
3.    @Override 
4.    DocConsumer getChain(DocumentsWriterPerThread documentsWriterPerThread) { 
5.      /*
6.      This is the current indexing chain:
7.
8.      DocConsumer / DocConsumerPerThread
9.        --> code: DocFieldProcessor
10.          --> DocFieldConsumer / DocFieldConsumerPerField
11.            --> code: DocFieldConsumers / DocFieldConsumersPerField
12.              --> code: DocInverter / DocInverterPerField
13.                --> InvertedDocConsumer / InvertedDocConsumerPerField
14.                  --> code: TermsHash / TermsHashPerField
15.                    --> TermsHashConsumer / TermsHashConsumerPerField
16.                      --> code: FreqProxTermsWriter / FreqProxTermsWriterPerField
17.                      --> code: TermVectorsTermsWriter / TermVectorsTermsWriterPerField
18.                --> InvertedDocEndConsumer / InvertedDocConsumerPerField
19.                  --> code: NormsConsumer / NormsConsumerPerField
20.          --> StoredFieldsConsumer
21.            --> TwoStoredFieldConsumers
22.              -> code: StoredFieldsProcessor
23.              -> code: DocValuesProcessor
24.    */ 
25. 
26.    // Build up indexing chain: 
27. 
28.      final TermsHashConsumer termVectorsWriter = new TermVectorsConsumer(documentsWriterPerThread); 
29.      final TermsHashConsumer freqProxWriter = new FreqProxTermsWriter(); 
30. 
31.      final InvertedDocConsumer termsHash = new TermsHash(documentsWriterPerThread, freqProxWriter, true, 
32.                                                          new TermsHash(documentsWriterPerThread, termVectorsWriter, false, null)); 
33.      final NormsConsumer normsWriter = new NormsConsumer(); 
34.      final DocInverter docInverter = new DocInverter(documentsWriterPerThread.docState, termsHash, normsWriter); 
35.      final StoredFieldsConsumer storedFields = new TwoStoredFieldsConsumers( 
36.                                                      new StoredFieldsProcessor(documentsWriterPerThread), 
37.                                                      new DocValuesProcessor(documentsWriterPerThread.bytesUsed)); 
38.      return new DocFieldProcessor(documentsWriterPerThread, docInverter, storedFields); 
39.    } 
40.  }; 


经过一系列链式传递后,索引并不会马上写入磁盘中,而是先写入内存中,然后到一定时机会flush到磁盘上,这实际上也是一种优化策略,从而避免了频繁访问磁盘带来的IO开销,当然我们也可以显式得调用commit方法,将其刷新到磁盘上。
分享到:
评论

相关推荐

    Lucene检索文本,建立索引

    在这个场景中,我们将探讨如何利用Lucene来检索文本并建立索引,同时结合Struts框架构建一个Web程序。 首先,**Lucene** 是一个开源的Java库,它提供了完整的搜索功能,包括分词、索引创建、查询解析和结果排序。它...

    spring-lucene简单项目

    在本项目中,Spring将作为管理和协调各个组件的平台,包括Lucene索引的创建、更新和查询。 接下来,我们关注Apache Lucene。Lucene是一个纯Java库,提供了强大的文本分析、索引构建和搜索功能。它能够对大量数据...

    Lucene资料大全(包括Lucene_in_Action书等)

    它可能以简洁易懂的方式解释Lucene的关键概念,对于快速入门Lucene是非常有价值的资源。 总的来说,这个压缩包提供了一个全面的Lucene学习路径,既有理论书籍也有实践教程,对于想要深入理解或开始使用Lucene的人来...

    lucene1.ppt

    Lucene的API设计简洁,易于使用,使得开发者可以专注于业务逻辑,而非信息检索的复杂算法。 随着互联网的快速发展,搜索引擎已经成为必不可少的工具。从早期的Excite、Yahoo到Google,再到百度,搜索引擎的发展推动...

    lucene4.6jar

    在Lucene 4.6中,索引过程更加高效,支持分词、TF-IDF(Term Frequency-Inverse Document Frequency)权重计算等,使得搜索速度显著提升。 2. **文档模型**:Lucene中的每个文档由一系列字段(Field)组成,每个...

    Lucene3.0.1 jar包

    10. **API 简洁易用**:Lucene 的Java API 设计简洁,易于理解和使用,使得开发者可以快速集成全文检索功能到自己的应用中。 在开发过程中,使用 Lucene 3.0.1 jar 包,开发者可以将全文检索功能无缝集成到Java应用...

    Weblucene 站内搜索

    - **易用API**:提供了简洁的API接口,开发者可以方便地将Weblucene集成到自己的项目中。 - **定制化**:支持自定义分词器、评分策略等,满足不同场景下的需求。 **2. Weblucene 工作原理** Weblucene的核心是倒排...

    lucene-3.6.0

    在3.6.0版本中,索引的构建和优化过程更为稳定和高效。 2. **查询处理**:Lucene支持多种查询类型,如布尔查询、短语查询、模糊查询、范围查询等。用户可以通过QueryParser类来构建复杂的查询表达式,3.6.0版本对...

    Lucene3.1使用教程

    1. **索引(Index)**:Lucene首先将数据转换成索引,这个过程类似于传统书籍的目录。索引包含文档的关键词及其位置信息,使得快速查找和排序变得可能。 2. **文档(Document)**:在Lucene中,文档是存储和检索的...

    基于lucene的问答系统

    Lucene支持多种编程语言,包括Java,这使得它在Java开发环境下如Eclipse中的应用变得非常方便。 构建问答系统的第一步是设置开发环境。Eclipse作为Java开发的主流IDE,提供了丰富的插件和便捷的代码管理功能,便于...

    lucene-7.4.0jar包

    《Apache Lucene 7.4.0:全文检索与索引库详解》 Apache Lucene 是一个开源的全文检索库,被广泛应用于各种搜索引擎和信息检索系统中。这个压缩包“lucene-7.4.0”包含了Lucene 7.4.0版本的所有核心组件和模块,为...

    lucene5.X与lucene3.60的版本差异

    这使得配置更加简洁明了。 二、Bug修复 Lucene 5.x版本修复了大量bug,提高了程序的稳定性和性能。其中包括对查询解析、索引构建、内存管理等多个方面的改进,为开发者提供了更加可靠的搜索服务。 三、其他改动 ...

    Laravel开发-laravel-lucene-search

    `laravel-lucene-search`扩展包则为Laravel应用提供了一个适配器,允许开发者通过Eloquent模型来操作Lucene索引。 安装`laravel-lucene-search`通常是通过Composer,Laravel的依赖管理工具来完成的。在你的项目目录...

    最新版windows lucene-8.9.0.zip

    6. **API改进**:Lucene的API通常会随着版本迭代而变得更为友好和完善,8.9.0可能会提供更简洁、直观的编程接口,让开发者更容易集成和使用。 7. **错误修复**:每个新版本都会包含之前版本中发现的错误和问题的...

    lucene3.0

    Lucene 3.0是Lucene发展过程中的一个重要里程碑,它在稳定性、性能和功能上都有所提升。这一版本引入了更优化的索引结构,提高了查询速度,并且增强了对多语言的支持。Lucene 3.0还引入了新的API,使得开发者更容易...

    基于Lucene的桌面搜索软件

    1. **快速索引**:利用Lucene的强大索引机制,对用户指定的硬盘分区或文件夹进行快速索引,构建出高效的全文索引库。 2. **全文搜索**:用户可以通过输入关键词的方式,对索引库中的内容进行全文搜索,快速定位到...

    基于Lucene的小型搜索引擎

    本篇将详细介绍一个基于Apache Lucene的小型搜索引擎的构建过程,包括数据获取、处理和索引建立,以及用户界面的实现。 首先,搜索引擎的核心在于数据源。在这个项目中,数据源自百度音乐,通过Heritrix网络爬虫...

Global site tag (gtag.js) - Google Analytics