转自:http://blog.csdn.net/wen158809179/article/details/7419254
1. 让程序中只有一个 IndexWriter。因为 IndexWriter 是对索引库目录下的文件进行操作,就算在多线程情况下,每次也只会有一个线程在访问这个文件。
因此,程序中没必要维持多个 IndexWriter。
- /**
- * 使用 IndexWriter 进行保存或更新操作时,
- * 若不手动调用 IndexWriter 的 close 方法,数据并不会持久化到索引库中。
- * IndexWriter 一般只需要在程序退出的时候再关闭。
- * 因此,需要调用它的 commit 方法手动提交。需要特别注意。
- */
- public class LuceneUtils {
- private static IndexWriter indexWriter;
- static {
- try {
- /* 最好将目录放在配置文件 */
- Directory directory = FSDirectory.open(new File("./indexDir/"));
- /* 最好将版本放在配置文件 */
- Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
- indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- /**
- * 获取 IndexWriter
- */
- public static IndexWriter getIndexWriter() {
- return indexWriter;
- }
- /**
- * 关闭 IndexWriter
- */
- public static void closeIndexWriter() {
- try {
- indexWriter.close();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
2. 文件优化
Lucene 会为每一次addDocument(document) 是在索引库目录下新增一个文件".cfs"后缀的文件。
这意味我们的程序将便对越来越多的文件(但是默认情况下,最多也不会超过10个,当文件达到10个的时候,lucene 会将它们合并为一个大的文件)。意味着 IO 流的打开和关闭也将越来越多。这对效率的影响是比较大的。
方式是调用 IndexWriter 的 IndexWriter.optimize() 或 indexWriter.setMergeFactor(int)
IndexWriter.optimize() 被调用后,lucene 会立即将索引库目录下所有 ".cfs" 后缀的文件合并为一个大的文件。但是它的数据是不会改变的。
indexWriter.setMergeFactor(int) 接收一个整型参数表示当 ".cfs" 文件达到多少数量时就自动合并。
3. 结合使用 FSDirectory 和 RAMDirectory
/*文件系统的索引库,指向物理介质上真实存在的文件 */
Directorydirectory = FSDirectory.open(new File("./indexDir/"));
/*内存索引库,是在内存中模拟的一个索引库 */
DirectoryRAMdir = new RAMDirectory();
优缺点:
FSDirectory 速度相对慢,但是 FSDirectory 的优点是能够在磁盘上持久化数据。
RAMDirectory 读写数据的速度明显要快,但是缺点是数据在程序退出时就没有了。而且受限制于内存的大小。
双剑合璧:
1. 在程序启动的时候,将磁盘上的索引库加载到内存中来。
2. 在程序退出的时候(或指定一个时机),将内存中的索引库数据状态同步会磁盘上。
怎样将磁盘上的索引库加载到内存中来?
Directory fsDir = FSDirectory.open(newFile("./indexDir/"));
//使用带参构造器创建 RAMDirectory 对象。下面代码参数为指向磁盘索引库的 FSDirectory 对象
Directory RAMdir = newRAMDirectory(directory);
怎样将内存中的索引库的数据同步回磁盘。
Directory RAMdir = newRAMDirectory();
Analyzeranalyzer = new StandardAnalyzer(Version.LUCENE_30);
IndexWriter ramIndexWriter = new IndexWriter(directory,analyzer,
MaxFieldLength.LIMITED);
//ramIndexWriter.update.delete... 更新索引库
/*同步数据回磁盘 */
DirectoryfsDir = FSDirectory.open(new File("./indexDir/"));
IndexWriter fsIndexWriter = new IndexWriter(directory,analyzer, MaxFieldLength.LIMITED);
fsIndexWriter.addIndexesNoOptimize(RAMdir);
以上是一种默认情况,就是 fsIndexWriter 会采用创建或追加的方式来同步数据。
-- 当磁盘上不存在对于索引库时则创建,并同步数据;否则,则追加和更新改变后的数据。
IndexWriter的另一个构造其可以改变这种默认形式:
IndexWriter fsIndexWriter =
new IndexWriter(directory,analyzer, [true | false], MaxFieldLength.LIMITED);
[true| false]: 若设置为 true,将总是创建或覆盖磁盘上的索引库。
-- 当磁盘上不存在对于索引库时则创建,并同步数据;否则,则覆盖掉原有的索引库的全部数据。
若设置为 false。则只追加和更新改变后的数据。若原有数据库不存在,将报错。
因此,一般用默认的就行了。true 的话要慎用。因为每次都推到重来,数据量很大的话,时间会比较久。
相关推荐
《lucene、lucene.NET 详细使用与优化详解》 lucene 是一个广泛使用的全文搜索引擎库,其.NET版本称为lucene.NET,它提供了强大的文本检索和分析能力,适用于各种场景下的全文搜索需求。lucene 并非一个可以直接...
Lucene 排序、设置权重、优化、分布式搜索 Lucene 是一个高性能的搜索引擎库,它提供了强大的文本搜索和索引能力。下面我们将详细介绍 Lucene 的排序、设置权重、优化和分布式搜索等知识点。 一、Lucene 排序 ...
Lucene优化是指对Lucene索引和搜索进行优化的过程。Lucene提供了多种优化方式,包括索引优化、搜索优化和缓存优化等。 在上面的代码中,我们使用了`optimize()`方法对索引进行优化。该方法将合并磁盘上的索引文件,...
四、Lucene优化技巧 - 使用合适的Analyzer:不同的Analyzer会影响分词效果,选择合适的Analyzer可以提高检索准确度。 - 增量索引:在大型数据集上,应采用增量索引策略,避免一次性加载所有数据。 - 使用自定义...
在2.0.0版本中,Lucene优化了索引构建过程,提升了索引速度。它采用了倒排索引(Inverted Index)结构,这是一种将文档中出现的词及其位置存储在索引中的数据结构,使得查找匹配文档变得高效。此外,此版本还支持多...
4. Lucene 优化:Lucene 优化是指对 Lucene 的配置和参数进行调整,以提高搜索效率。 Lucene 相关产品 1. Apache Lucene:Apache Lucene 是一个开源的信息搜索库。 2. Elasticsearch:Elasticsearch 是一个基于 ...
三、LUCENE优化技巧 1. **多线程索引**:为了加快索引速度,可以利用多线程并行处理文档。 2. **块级并发**:LUCENE支持在索引过程中对不同段进行并发操作,进一步提高效率。 3. **内存管理**:合理设置缓存大小...
3. **电子商务**:在线商店可以利用Lucene优化商品搜索,提高用户体验。 4. **内容管理**:新闻门户、博客平台等可以集成Lucene来提高内容的搜索效率。 5. **搜索引擎后端**:虽然Lucene本身不是一个完整的搜索...
在这个版本中,Lucene优化了搜索速度,增强了对多核心CPU的利用,同时提供了更精确的搜索结果排序。开发者可以利用Lucene进行文本分析、建立倒排索引、执行布尔查询等多种操作。 SSH整合是指将这三个框架集成在一起...
本篇文章将详细探讨Lucene的分组查询优化,以及如何使用Facet功能来提升用户体验。 一、Lucene分组查询原理 Lucene的分组查询(Faceting)是通过对索引中的文档进行多级分类来实现的。它首先会计算每个分面值的文档...
6. **了解存储结构**:通过“Segments”选项卡,可以了解索引的分段情况,这是Lucene优化索引存储的关键部分。 7. **导出数据**:如果需要,还可以将索引数据导出为CSV或其他格式,以便进一步分析。 总的来说,...
三、Lucene优化与扩展 1. 倒排索引优化:通过设置不同的PostingList格式和压缩方式,如BlockTree或PForDelta,可以优化存储效率。 2. 多字段搜索:通过在QueryParser中指定多个字段,可以实现多字段的联合搜索。 ...
6. **内存缓存与磁盘存储**:Lucene优化了内存和磁盘的使用,允许快速读取索引,同时保持索引的持久化。 Nutch则是一个基于Lucene的开源网络爬虫,它的主要任务是抓取网页并建立索引。Nutch的知识点包括: 1. **...
四、Lucene优化与扩展 1. 基于内存的缓存:为了提升搜索性能,Lucene提供了Term频率和文档频率的缓存,以减少磁盘I/O。 2. 近实时搜索(Near Real-Time Search):通过NRTManager,用户可以在索引过程中获取最新的...
**Lucene封装与性能优化详解** Lucene是一个高性能、全文本搜索库,它为开发者提供了在应用程序中实现全文检索的功能。然而,为了更好地适应实际项目需求,通常需要对其进行封装,以便于管理和提升性能。本文将深入...
在IT行业中,智能提示框是一种常见且实用的功能,它能够为用户提供实时的搜索建议或自动...通过实际操作,你可以学习到如何使用lucene优化搜索效率,以及如何将这种高级搜索功能集成到你的Web应用中,提高用户体验。
本文将深入探讨如何利用Lucene优化医疗搜索引擎的排序算法,以提升搜索质量和用户体验。 首先,理解Lucene的基本工作原理是关键。Lucene通过索引文档内容,实现了快速的全文检索。它将文本分词,创建倒排索引,从而...
在5.3.1这个版本中,Lucene优化了内存占用,提升了搜索性能,并增强了对多语言的支持。 另一方面,IKAnalyzer是一个基于Java的开源中文分词器,专为满足Java环境下中文处理的需求而设计。2012_u6是其一个较新的版本...