《Lucene索引创建》系列文章将从源代码出发,详细揭示Lucene两大功能之一的索引创建过程。并阐述其中所用到的信息检索的相关技术。由于Lucene是基于多线程的,为了能够简洁明了的说明Lucene索引创建的过程,我们尽量会绕开Lucene多线程机制的处理细节。
1.1 准备工作
我们对content目录中1.txt、2.txt、3.txt这三个英文文档的文件名,路径,内容建立索引。代码如下:
//索引文件存放的位置
File indexDir=new File(".\index");
//需要建立索引的文档集合的位置
File docDir = new File(".\content");
//创建索引器(核心)
IndexWriter standardWriter = new IndexWriter(FSDirectory.open(indexDir),new StandardAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED);
//不建立复合式索引文件,默认的情况下是复合式的索引文件
standardWriter.setUseCompoundFile(false);
//为原文档集合中的每个文档的相关信息建立索引
for (File fileSrc : docDir.listFiles()) {
//Lucene的文档结构
Document doc = new Document();
//文件名称,可查询,不分词
String fileName=file.getName().substring(0,file.getName().indexOf("."));
doc.add(new Field("name",fileName, Field.Store.YES, Field.Index.NOT_ANALYZED));
//文件路径,可查询,不分词
String filePath=file.getPath();
doc.add(new Field("path", filePath, Field.Store.YES, Field.Index.NOT_ANALYZED));
//文件内容,需要检索
doc.add(new Field("content", new FileReader(file)));
//使用索引器对Document文档建索引
standardWriter.addDocument(doc);
}
//关闭索引器,并写入磁盘索引文件
standardWriter.optimize();
standardWriter.close();
其中,IndexWriter索引器用来创建索引。Document和Field类(详见《Document/Field 数据源组织结构》
)表示这三个文档的结构如下:
Document Field1(name) Field2(path) Field3(content)
doc1 1 e:\\content\\1.txt The lucene is a good IR. I hope I can lean well.
doc2 2 e:\\content\\2.txt You know it's difficult to learn Lucene well.
doc3 3 e:\\content\\3.txt Maybe is very hard. I must do it well.
1.2 IndexWriter 索引器
一个IndexWriter对象创建并且维护(maintains)
一条索引并生成segment,使用DocumentsWriter类来建立多个文档的索引数据,SegmentMerger类负责合并多个
segment。
1.2.1 构造器
org.apache.lucene.index包是lucene用来创建索引的。其中的IndexWriter类是Lucene的索引器。
下面是IndexWriter的构造器。
/**
* d 索引文件存储的目录类
* a 语言分析器,主要用于分词
* create 真—创建新的索引文件或者重新覆盖已存在的索引文件; 假—在已存在的索引文件后追加索引记录
* mfl 允许Field中的词的最大数量
*/
public IndexWriter(Directory d, Analyzer a, boolean create, MaxFieldLength mfl){
init(d, a, null, mfl.getLimit(), null, null);
}
其中Directory将在后面再谈;Analyzer详细可见《Lucene分析器—Analyzer》
;create确定是否一条新的索引将被创建,或者是否一条已经存在的索引将被打开;MaxFieldLength默认的最大长度为10000,在《Document-Field数据源
组织结构
》
中我们知道Field可以表示数据源的任何属性信息,如果Field中的value数据量非常大,那么很有可能在建索引的时候造成内存溢出。所以有必要限制每个Field中value的最大词数。
1.2.3 建立索引的方法:addDocument(Document)
该方法是用来创建索引的。我们进一步看看这个方法的源码:
public void addDocument(Document doc) {
addDocument(doc, analyzer);
}
public void addDocument(Document doc, Analyzer analyzer) {
ensureOpen();
boolean doFlush = false;
boolean success = false;
try {
try {
//使用DocumentWriter建立索引
doFlush = docWriter.addDocument(doc, analyzer);
success = true;
} finally {
if (!success) {
if (infoStream != null)
message("hit exception adding document");
synchronized (this) {
if (docWriter != null) {
final Collection<String> files = docWriter.abortedFiles();
if (files != null)
deleter.deleteNewFiles(files);
}
}
}
}
if (doFlush)
flush(true, false, false);
}catch (OutOfMemoryError oom) {
handleOOM(oom, "addDocument");
}
}
其中docWriter.addDocument(doc,analyzer);调用了DocumentWriter类来创建一个Document对象的索引。而DocumentWriter类将在《索引创建(2):DocumentWriter处理流程
》详细介绍。
分享到:
相关推荐
### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...
《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene3.0版本,结合“庖丁解...
二、Lucene索引流程 1. 文档分词:Lucene使用Analyzer对输入的文档进行分词,生成Token流。 2. 字符串到Term:将分词结果转化为Term对象,每个Term代表一个唯一的词汇项。 3. 建立Term Frequency(TF):记录每个...
2. 创建索引writer:`IndexWriter` 类负责创建和更新索引,使用 `IndexWriterConfig` 进行配置。 3. 构建文档:为每个要索引的文件创建 `Document` 对象,然后添加字段,如 `Field("content", fileContent, ...
1. 创建索引:首先,创建一个Directory实例,然后使用IndexWriter添加文档并建立索引。 2. 更新索引:当文档有变化时,可以使用IndexWriter的updateDocument方法进行更新。 3. 搜索索引:使用IndexSearcher实例和...
在这个例子中,我们创建了一个索引,包含一个文档,然后搜索包含"Lucene 3.0"的文档。这个简单的示例展示了Lucene的基本用法,实际应用中可以根据需要扩展,例如添加更多的文档字段、实现更复杂的查询逻辑,或者使用...
2. 创建索引写入器(IndexWriter):`IndexWriter`负责建立索引,通过它我们可以添加、删除和更新文档。 3. 创建文档(Document):`Document`对象用于存储要索引的信息,添加字段并赋值。 4. 添加文档到索引:使用`...
1. **索引构建**: Lucene 2.0 提供了 `IndexWriter` 类,用于创建和更新索引。开发者可以使用 `Document` 类来封装待索引的数据,然后通过 `addDocument()` 方法添加到索引中。 2. **查询构造**: 通过 `QueryParser...
在 Lucene 3.0 中,使用 `IndexWriter` 类来写入文档到索引中。相比于 2.0 版本,3.0 引入了更高级的分析器(Analyzer)和文档(Document)处理,使得对文本的预处理更为精细,支持更多的语言和特性。 ```java ...
在这个“Lucene3.0增删改查和关键字高亮实例”项目中,我们将深入理解如何利用Lucene 3.0版本进行索引构建、文档的增删改查操作,并学习关键字高亮显示的实现方法。 首先,我们要了解**创建索引**的基本流程。在...
1. **创建索引(Creating an Index)**: 首先,我们需要创建一个 IndexWriter 对象,配置相应的目录(Directory)和索引设置。然后,通过添加 Document 对象到 IndexWriter 来索引文档。 2. **索引字段(Indexing ...
1. **改进的性能**:Lucene 3.0引入了更高效的内存管理,优化了索引和搜索速度。 2. **多线程支持**:增加了对并发写入和读取的支持,提升了多用户环境下的性能。 3. **新的分析器**:提供了更多针对特定语言的...
- **IndexWriter** 类是用于创建和更新 Lucene 索引的主要接口。通过 IndexWriter,我们可以添加、删除或更新 Document。 - **倒排索引**:Lucene 使用倒排索引,将每个唯一的词(Term)映射到包含该词的所有文档...
1. **创建索引**: 首先,使用Analyzer处理文档内容,然后使用IndexWriter将处理后的文档添加到索引中。 2. **搜索索引**: 使用IndexSearcher和QueryParser解析查询,然后执行搜索。 3. **结果排序**: Lucene支持...
1. 创建索引:将数据源(如数据库、文件系统)中的内容读取并转换为Lucene的Document对象,然后添加到IndexWriter中进行索引。 2. 查询处理:用户输入查询后,使用Analyzer处理查询字符串,生成Query对象。 3. ...
Lucene的核心组件包括Analyzer(分析器)、IndexWriter(索引写入器)、IndexReader(索引读取器)和Searcher(搜索器)。Analyzer负责将文本分解为可搜索的词项,IndexWriter则用于创建和更新索引,IndexReader用于...
Lucene 3.0 提供了强大的文本检索功能,通过创建索引、更新和删除文档,开发者可以构建高效搜索引擎。索引创建涉及文档对象、Analyzer、IndexWriter等核心组件,而更新和删除则依赖于`IndexWriter`的相应方法。虽然...
`IndexWriter`在创建索引时会使用`Directory`来保存索引数据。 3. **查询解析**:用户输入的查询字符串需要通过`QueryParser`或`MultiFieldQueryParser`转换成`Query`对象。`Analyzer`同样在这个过程中起作用,用于...