深入 lucene 索引机制
lucene 是一个基于 java 的全文检索工具包,你可以利用它来为你的应用程序加入索引和检索功能。lucene 目前是著名的 apache jakarta 家族中的一个开源项目,下面我们即将学习 lucene 的索引机制以及它的索引文件的结构。
在这篇文章中,我们首先演示如何使用 lucene 来索引文档,接着讨论如何提高索引的性能。最后我们来分析 lucene 的索引文件结构。需要记住的是,lucene 不是一个完整的应用程序,而是一个信息检索包,它方便你为你的应用程序添加索引和搜索功能。
架构概览
lucene 的索引机制的架构。lucene 使用各种解析器对各种不同类型的文档进行解析。比如对于 html 文档,html 解析器会做一些预处理的工作,比如过滤文档中的 html 标签等等。html 解析器的输出的是文本内容,接着 lucene 的分词器(analyzer)从文本内容中提取出索引项以及相关信息,比如索引项的出现频率。接着 lucene 的分词器把这些信息写到索引文件中
用lucene索引文档
接下来我将一步一步的来演示如何利用 lucene 为你的文档创建索引。只要你能将要索引的文件转化成文本格式,lucene 就能为你的文档建立索引。比如,如果你想为 html 文档或者 pdf 文档建立索引,那么首先你就需要从这些文档中提取出文本信息,然后把文本信息交给 lucene 建立索引。我们接下来的例子用来演示如何利用 lucene 为后缀名为 txt 的文件建立索引。
1. 准备文本文件
首先把一些以 txt 为后缀名的文本文件放到一个目录中,比如在 windows 平台上,你可以放到 c:\\files_to_index 下面。
2. 创建索引
清单1是为我们所准备的文档创建索引的代码。
清单1:用 lucene 索引你的文档
package lucene.index;
import java.io.file;
import java.io.filereader;
import java.io.reader;
import java.util.date;
import org.apache.lucene.analysis.analyzer;
import org.apache.lucene.analysis.standard.standardanalyzer;
import org.apache.lucene.document.document;
import org.apache.lucene.document.field;
import org.apache.lucene.index.indexwriter;
/**
* this class demonstrates the process of creating an index with lucene
* for text files in a directory.
*/
public class textfileindexer {
public static void main(string[] args) throws exception{
//filedir is the directory that contains the text files to be indexed
file filedir = new file("c:\\files_to_index ");
//indexdir is the directory that hosts lucene's index files
file indexdir = new file("c:\\luceneindex");
analyzer luceneanalyzer = new standardanalyzer();
indexwriter indexwriter = new indexwriter(indexdir,luceneanalyzer,true);
file[] textfiles = filedir.listfiles();
long starttime = new date().gettime();
//add documents to the index
for(int i = 0; i < textfiles.length; i++){
if(textfiles[i].isfile() >> textfiles[i].getname().endswith(".txt")){
system.out.println("file " + textfiles[i].getcanonicalpath()
+ " is being indexed");
reader textreader = new filereader(textfiles[i]);
document document = new document();
document.add(field.text("content",textreader));
document.add(field.text("path",textfiles[i].getpath()));
indexwriter.adddocument(document);
}
}
indexwriter.optimize();
indexwriter.close();
long endtime = new date().gettime();
system.out.println("it took " + (endtime - starttime)
+ " milliseconds to create an index for the files in the directory "
+ filedir.getpath());
}
}
|
正如清单1所示,你可以利用 lucene 非常方便的为文档创建索引。接下来我们分析一下清单1中的比较关键的代码,我们先从下面的一条语句开始看起。
analyzer luceneanalyzer = new standardanalyzer();
|
这条语句创建了类 standardanalyzer 的一个实例,这个类是用来从文本中提取出索引项的。它只是抽象类 analyzer 的其中一个实现。analyzer 也有一些其它的子类,比如 simpleanalyzer 等。
我们接着看另外一条语句:
indexwriter indexwriter = new indexwriter(indexdir,luceneanalyzer,true);
|
这条语句创建了类 indexwriter 的一个实例,该类也是 lucene 索引机制里面的一个关键类。这个类能创建一个新的索引或者打开一个已存在的索引并为该所引添加文档。我们注意到该类的构造函数接受三个参数,第一个参数指定了存储索引文件的路径。第二个参数指定了在索引过程中使用什么样的分词器。最后一个参数是个布尔变量,如果值为真,那么就表示要创建一个新的索引,如果值为假,就表示打开一个已经存在的索引。
接下来的代码演示了如何添加一个文档到索引文件中。
document document = new document();
document.add(field.text("content",textreader));
document.add(field.text("path",textfiles[i].getpath()));
indexwriter.adddocument(document);
|
首先第一行创建了类 document 的一个实例,它由一个或者多个的域(field)组成。你可以把这个类想象成代表了一个实际的文档,比如一个 html 页面,一个 pdf 文档,或者一个文本文件。而类 document 中的域一般就是实际文档的一些属性。比如对于一个 html 页面,它的域可能包括标题,内容,url 等。我们可以用不同类型的 field 来控制文档的哪些内容应该索引,哪些内容应该存储。如果想获取更多的关于 lucene 的域的信息,可以参考 lucene 的帮助文档。代码的第二行和第三行为文档添加了两个域,每个域包含两个属性,分别是域的名字和域的内容。在我们的例子中两个域的名字分别是"content"和"path"。分别存储了我们需要索引的文本文件的内容和路径。最后一行把准备好的文档添加到了索引当中。
当我们把文档添加到索引中后,不要忘记关闭索引,这样才保证 lucene 把添加的文档写回到硬盘上。下面的一句代码演示了如何关闭索引。
利用清单1中的代码,你就可以成功的将文本文档添加到索引中去。接下来我们看看对索引进行的另外一种重要的操作,从索引中删除文档。
从索引中删除文档
类indexreader负责从一个已经存在的索引中删除文档,如清单2所示。
清单2:从索引中删除文档
file indexdir = new file("c:\\luceneindex");
indexreader ir = indexreader.open(indexdir);
ir.delete(1);
ir.delete(new term("path","c:\\file_to_index\lucene.txt"));
ir.close();
|
在清单2中,第二行用静态方法 indexreader.open(indexdir) 初始化了类 indexreader 的一个实例,这个方法的参数指定了索引的存储路径。类 indexreader 提供了两种方法去删除一个文档,如程序中的第三行和第四行所示。第三行利用文档的编号来删除文档。每个文档都有一个系统自动生成的编号。第四行删除了路径为"c:\\file_to_index\lucene.txt"的文档。你可以通过指定文件路径来方便的删除一个文档。值得注意的是虽然利用上述代码删除文档使得该文档不能被检索到,但是并没有物理上删除该文档。lucene 只是通过一个后缀名为 .delete 的文件来标记哪些文档已经被删除。既然没有物理上删除,我们可以方便的把这些标记为删除的文档恢复过来,如清单 3 所示,首先打开一个索引,然后调用方法 ir.undeleteall() 来完成恢复工作。
清单3:恢复已删除文档
file indexdir = new file("c:\\luceneindex");
indexreader ir = indexreader.open(indexdir);
ir.undeleteall();
ir.close();
|
你现在也许想知道如何物理上删除索引中的文档,方法也非常简单。清单 4 演示了这个过程。
清单4:如何物理上删除文档
file indexdir = new file("c:\\luceneindex");
analyzer luceneanalyzer = new standardanalyzer();
indexwriter indexwriter = new indexwriter(indexdir,luceneanalyzer,false);
indexwriter.optimize();
indexwriter.close();
|
在清单 4 中,第三行创建了类 indexwriter 的一个实例,并且打开了一个已经存在的索引。第 4 行对索引进行清理,清理过程中将把所有标记为删除的文档物理删除。
lucene 没有直接提供方法对文档进行更新,如果你需要更新一个文档,那么你首先需要把这个文档从索引中删除,然后把新版本的文档加入到索引中去。
<转自:http://hi.baidu.com/sunsonruby/blog/item/e66dc618ec94c70434fa4168.html>
分享到:
相关推荐
2. **架构设计**:设计基于Lucene的分布式并行索引架构,包括数据分片策略、计算节点配置、数据传输方案等。 3. **实现细节**:开发具体的代码实现,如文档分割逻辑、节点间通信协议、合并索引算法等。 4. **测试...
在IT行业中,实时建立索引的架构是一种关键的技术,特别是在大数据和搜索引擎领域。这个主题涉及到如何高效、实时地处理和索引大量数据,以便进行快速的查询和分析。以下是对"实时建立索引的架构"的详细解释: 一、...
在这个场景中,我们将探讨如何利用Lucene来检索文本并建立索引,同时结合Struts框架构建一个Web程序。 首先,**Lucene** 是一个开源的Java库,它提供了完整的搜索功能,包括分词、索引创建、查询解析和结果排序。它...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
**Lucene索引分析工具详解** Lucene是一个高性能、全文本搜索库,它为开发者提供了在应用程序中实现全文检索功能的基础。在这个场景中,我们关注的是一个专门针对Lucene.net的索引分析工具,该工具被称为"Lucene...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
《深入理解Lucene5增量索引与Zoie系统》 在信息检索领域,Lucene是一个广泛使用的全文搜索引擎库,其强大的索引能力和高效的搜索性能为开发者提供了强大的支持。然而,随着数据量的不断增长,如何高效地进行增量...
Lucene并非一个完整的全文检索引擎,而是提供了一套用于构建此类引擎的基础架构,包括完整的查询引擎、索引引擎以及部分文本分析引擎(主要支持英语和德语)。 **优点总结:** 1. **跨平台性:** Lucene定义了一种...
《Lucene4.X实战类baidu搜索的大型文档海量搜索系统》课程主要涵盖了Lucene的基础概念、架构、索引原理及优化、搜索实现、实战应用等多个方面,旨在帮助学习者深入理解并掌握Lucene这一强大的全文搜索引擎库。...
在架构商业周期中,Lucene的架构设计与期望的质量属性紧密关联。它的客户是开发者,他们使用Lucene构建具有全文检索功能的应用,最终用户则是这些应用的使用者。Lucene的架构允许在开发过程中与质量属性如性能、可...
在给定的`MailDAO.java`文件中,可能包含了一个用于操作邮件数据的DAO(Data Access Object)类,通过这个类,我们可以将邮件内容存储到Lucene索引中,或者从索引中检索相关的邮件信息。使用DAO模式,有助于保持业务...
Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引擎,还是论坛中的搜索功能,还是其它C/S...本文主要是利用Lucene对MS Sql Server 2000进行建立索引,然后进行全文索引。
Lucene学习总结之四:Lucene索引过程分析(1) Lucene学习总结之四:Lucene索引过程分析(2) Lucene学习总结之四:Lucene索引过程分析(3) Lucene学习总结之四:Lucene索引过程分析(4) www.chinaandroid.com
第2章 Lucene索引 Lucene索引里有什么 Lucene索引深入 Lucene索引深入优化 Lucene索引搜索 第3章 Lucene搜索实战 Lucene搜索实战 Lucene搜索深入实战 Lucene搜索深入实战进阶 第4章 Lucene高级 Lucene高级进阶 ...
综上所述,Lucene 3.0.1提供了强大的文本搜索能力,能够处理各种文件格式,对文件和数据库内容建立索引,并进行高效的查询。开发者可以利用源码进行定制,配合相应的工具库,实现复杂的信息检索需求。在实际应用中,...
文档是Lucene索引的基本单元,每个文档都包含多个字段,每个字段又包含多个词项,词项是Lucene索引的最小单元。词典是Lucene索引的核心部分,记录了所有词项的信息。 Lucene的查询方式有多种,包括 TermQuery、...
**Lucene架构及实现**: Lucene的架构包括多个组件,如`Analyzer`负责文本分析,`Document`表示待索引的文档,`Field`定义文档的字段,`IndexWriter`负责创建和更新索引,`Directory`管理磁盘上的索引文件,`...
#### 四、Lucene3建立索引的步骤 1. **创建Directory对象**:指定索引文件的存储位置。 2. **创建IndexWriter对象**:初始化索引写入器,设置分析器、是否创建新索引等参数。 3. **获取源文件**:加载需要索引的...
Lucene的架构提供了完整的查询引擎和索引引擎,部分文本分析引擎,能够满足各种应用场景的需求。 在基于Lucene的Oracle数据库全文检索中,首先需要将数据源转化成通用的结构,以屏蔽源数据的不同。然后,使用...