由上一文章,我们知道Lucene中的索引库的概念,我们可以把索引库理解是一个目录,里面是一些二级制文件,就如同数据库,所有的数据也是以文件的形式存放在文件系统中的。
那么在Lucene中文件是怎么存储到索引库中,在Lucene中资源存储的API工具有哪些呢,各有什么特点?这节我们着重说说这些问题。
Lucene资源存储靠的Dircetory类(这是一个抽象类,真正实现靠其子类),在Lucene对索引文件进行读写操作时,都会调用Directory子类对应的方法。那么先列举一下Directory有哪些子类?具体结构如下
Directory
--RAMDirectory
--NRTCachingDirectory
--FileSwitchDirectory
--FSDirectory
--SimpleFSDirectory
--MmapDirectory
--NIOFSDirectory
1、RAMDirectory
RAMDirectory是将即将索引的数据资源存在在内存中而不是磁盘中,这使得文件的读写操作非常的迅速
缺点:因为在内存中,所以在程序退出后索引数据就不存在了。
public RAMDirectory() {
try {
setLockFactory(new SingleInstanceLockFactory());
} catch (IOException e) {
// Cannot happen
}
}
此构造函数初始化的时候,指定的是LockFactory抽象类的一个具体实现类SingleInstanceLockFactory。SingleInstanceLockFactory类的特点是,所有的加锁操作必须通过该SingleInstanceLockFactory的一个实例而发生,也就是说,在进行加锁操作的时候,必须获取到这个SingleInstanceLockFactory的实例。
实际上,在获取到一个SingleInstanceLockFactory的实例后,那么对该目录Directory进行的所有的锁都已经获取到,这些锁都被存放到SingleInstanceLockFactory类定义的locks中。
因此,多个线程要进行加锁操作的时候,需要考虑同步问题。这主要是在获取SingleInstanceLockFactory中的SingleInstanceLock的时候,同步多个线程,包括请求加锁、释放锁,以及与此相关的共享变量。
private RAMDirectory(Directory dir, boolean closeDir) throws IOException {
this();
IndexFileNameFilter filter = IndexFileNameFilter.getFilter();
for (String file : dir.listAll()) {
if (filter.accept(null, file)) {
dir.copy(this, file, file);
}
}
if (closeDir) {
dir.close();
}
}
public RAMDirectory(Directory dir) throws IOException {
this(dir, false);
}
这两个构造方法,就是根据一个FSDirectory进行初始化的,即在打开一个FSDirectory的时候,同时FSDirectory中的索引文件转入到RAMDirectory被创建了。
就是将指定的dir目录拷贝到当前的内存中,即实例化一个RAMDirectory。这里,closeDir是一个很重要的状态变量,指定了拷贝完成后,源目录dir是否关闭。如果实例化一个RAMDirectory完成后就关闭源目录dir,可能会因为处理的时间非常短,而需要再次打开源目录dir,持久化到文件系统目录,开销可能会比直接操作源目录dir要大,这点要权衡。
2、NRTCachingDirectory
NRTCachingDirectory是用来在内存中缓存一些小的 segments,以减少应用对 IO的负载过高,更快速的 NRT 再次打开的效率
这个Directory子类是在Lucene3.2版本增加的。具体使用可以自己仔细研究;
分享到:
相关推荐
- `IndexSearcher`:执行搜索操作的核心类,可以接受Query对象并返回匹配的文档集。 - `Query`:代表用户输入的搜索条件,如TermQuery、BooleanQuery、PhraseQuery等。 - `ScoreDoc`和`TopDocs`:用于存储搜索...
`Directory`类及其子类封装了对索引文件的读写操作。 6. **更新与删除** `IndexWriter`不仅用于创建索引,还支持对索引的动态更新。通过添加、删除`Document`,可以实现对已有索引的修改。删除操作通过添加删除...
1. 创建索引:使用`IndexWriter`将文档写入索引,这个过程包括分词、建立倒排索引等操作。 2. 分析文本:通过`Analyzer`对输入文本进行处理,生成适合搜索的术语。 3. 查询索引:使用`IndexSearcher`和`QueryParser`...
例如,`FSDirectory`用于将索引存储在文件系统中,`RAMDirectory`则用于内存中的索引,这使得在内存有限的情况下也能进行快速测试。`SegmentReader`和`IndexReader`是读取索引的主要类,它们提供了对索引数据的访问...
项目开始时,你需要在Spring配置文件中声明Lucene的相关bean,如Analyzer(分析器)、Directory(存储索引的目录)和IndexWriter(负责创建和更新索引)。Analyzer用于分词,将输入的文本拆分成可搜索的单元。...
以上是Lucene2.9开发的关键概念和操作步骤,掌握这些知识后,开发者可以构建起基本的全文搜索引擎。然而,实际应用中可能还需要考虑更多的细节,比如优化索引性能、处理多语言文本、提升搜索精度等。随着对Lucene的...
Apache Lucene是一个高性能、全文本搜索库,由Java编写,被广泛用于开发搜索引擎和信息检索系统。这个离线版的Lucene 5.4.1官方文档提供了关于该版本的详细信息,包括API参考、指南和示例,帮助开发者更好地理解和...
1. **分词和索引**:Lucene的核心功能之一是将文本分词并创建倒排索引。它使用Analyzer类来处理输入文本,将其分解为关键词(称为术语或Token),然后将这些术语与文档关联,形成索引结构。例如,StandardAnalyzer...
- `org.apache.lucene.store.Directory`接口定义了存储索引的基本行为,其实现类包括基于文件系统的`FSDirectory`和基于内存的`RAMDirectory`。 - `org.apache.lucene.store.IndexInput`和`org.apache.lucene....
通过 `API_lucene3.0.0.chm` 文件,开发者可以找到完整的 Lucene 3.0 API 文档,包括类、方法、接口的详细说明,以及示例代码,这对于理解和使用新版本的 Lucene 非常有帮助。 同样,`lucene-2.0.CHM` 文件则提供了...
- `Directory`: 用于存储索引数据的抽象接口,例如FSDirectory(文件系统目录)和RAMDirectory(内存目录)。 - `IndexWriter`: 负责创建、修改和删除索引的主要类,可以添加、删除和更新文档。 - `Document`: 代表...
1. **Analyzer**: 分析器是Lucene的核心组件之一,负责将输入文本拆分成一系列可搜索的术语(tokens)。例如,`StandardAnalyzer` 是一个常用的分析器,它按照英文语法规则进行分词。初学者应了解如何根据需求选择或...
### Lucene3总体架构与操作流程 #### 一、Lucene3概述 Lucene是一款高性能、全功能的文本搜索引擎库,被广泛应用于多种场景下的文本检索。Lucene3相较于之前的版本,主要增加了对国际化的支持,引入了`message`包...
`IndexWriter` 是 Lucene 中的核心类之一,用于创建或更新索引。它提供了添加文档、删除文档、优化索引等操作的功能。 **1.1.2 Directory** `Directory` 在 Lucene 中代表了存储索引的地方,可以是硬盘上的文件...
二、Lucene.Net 2.9.2源码结构 源码主要分为几个关键部分: 1. 分析器(Analyzers):包含各种语言的分析器实现,如StandardAnalyzer、SimpleAnalyzer、WhitespaceAnalyzer等。 2. 搜索(Search):实现搜索算法...
通过阅读这份API文档,开发者可以深入了解全文检索的基本原理,理解如何利用Lucene进行索引构建、查询执行、结果处理等一系列操作,从而在实际项目中高效地实现全文搜索功能。对于Java开发者来说,掌握Lucene的API是...
1. **Lucene-Misc**: 这可能包含各种杂项工具和功能,如倒排索引查看器(Luke)或其他辅助工具。 2. **Lucene-Queries**: 提供了高级查询结构,例如BooleanQuery、PhraseQuery、WildcardQuery等。 3. **Lucene-...
本文档将深入探讨Lucene API的核心组件和主要操作。 ### 1. Lucene基本概念 - **索引(Index)**: 在Lucene中,索引是对文本数据进行结构化的表示,使得快速查询成为可能。索引过程包括分析文本、创建倒排索引等...
对索引进行读取和删除操作的IndexReader类。 3) store模块:负责索引的存储。提供索引的各种存储类:FSDirectory,RAMDirectory等。 4) document模块:索引文件内部的基础存储结构封装。如:Document类和Field类等...