`

Lucene03---索引位置的优化(内存和磁盘配合使用)

    博客分类:
  • SEO
阅读更多

 

在前面的http://xdwangiflytek.iteye.com/blog/1391510 文章里我们使用Lucene3.5做了一个Demo,在Demo中我们实现了一个创建索引和搜索的功能。那么我们现在在回过头来看看在上面的Demo中,我们是将索引的位置放在本地磁盘中的,在上面最开始我也说了索引的位置可以是本地磁盘也可以是内存中,那么我们可以想想,如果索引放在内存中会怎么样?简单点来想,肯定是速度快没有IO操作,但是呢?程序一退出后就消失了,对吧,但是我们是不是可以考虑两种存放方式配合起来用呢?达到更好点的效果呢?

首先我们来说说创建的这两种位置的方式:

 

磁盘中:

File indexFile = new File(indexPath);
Directory directory = FSDirectory.open(indexFile);

 

 内存中:

Directory directory = new RAMDirectory();
 

 

我们可以这样考虑,在程序运行的时候索引从内存进行读取,在程序退出的时候,再将索引保存到磁盘,但程序再运行的时候,再将磁盘中的索引放到内存中。这样的话是不是效率上好一点啊!

 

下面我们对昨天的Demo进行一个上面所说的简单优化:

 

FirstLucene02.java:

package com.iflytek.lucene;

import java.io.File;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

/**
 * @author xudongwang 2012-2-3
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class FirstLucene02 {

	/**
	 * 源文件路径
	 */
	private String filePath01 = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneDatasource\\HelloLucene01.txt";

	/**
	 * 索引路径
	 */
	private String indexPath = "F:\\Workspaces\\workspaceSE\\BlogDemo\\luceneIndex";

	/**
	 * 分词器,这里我们使用默认的分词器,标准分析器(好几个,但对中文的支持都不好)
	 */
	private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
	
	private Directory ramDir = null;
	/**
	 * 搜索
	 * 
	 * @param queryStr
	 *            搜索的关键词
	 * @throws Exception
	 */
	public void search(String queryStr) throws Exception {

		// 1、把要搜索的文本解析为Query对象
		// 指定在哪些字段查询
		String[] fields = { "name", "content" };
		// QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_35,
				fields, analyzer);
		// Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。
		Query query = queryParser.parse(queryStr);
		// 2、进行查询
		IndexReader indexReader = IndexReader.open(ramDir);
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);
		// Filter 过滤器,我们可以将查出来的结果进行过滤,可以屏蔽掉一些不想给用户看到的内容
		Filter filter = null;
		// 10000表示一次性在数据库中查询多少个文档
		// topDocs 类似集合
		TopDocs topDocs = indexSearcher.search(query, filter, 10000);
		System.out.println("总共有【" + topDocs.totalHits + "】条匹配的结果");// 注意这里的匹配结果是指文档的个数,而不是文档中包含搜索结果的个数
		// 3、打印结果
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			int docSn = scoreDoc.doc;// 文档内部编号
			Document document = indexSearcher.doc(docSn);// 根据文档编号取出相应的文档
			File2Document.printDocumentInfo(document);// 打印出文档信息
		}
	}

	/**
	 * 优化创建索引,将索引存在在内存和磁盘配合使用
	 * 
	 * @throws Exception
	 */
	public void createIndexByYouHua() throws Exception {
		File indexFile = new File(indexPath);
		Directory fsDir = FSDirectory.open(indexFile);

		// 1、启动时,将磁盘中的索引读取到内存中
		ramDir = new RAMDirectory(fsDir);
		IndexWriterConfig ramConf = new IndexWriterConfig(Version.LUCENE_35,
				analyzer);

		// 运行程序时操作内存中的索引
		IndexWriter ramIndexWriter = new IndexWriter(ramDir, ramConf);
		Document document = File2Document.file2Document(filePath01);
		ramIndexWriter.addDocument(document);
		ramIndexWriter.close();

		// 2、退出时将内存中的索引保存到磁盘中
		IndexWriterConfig fsConf = new IndexWriterConfig(Version.LUCENE_35,
				analyzer);
		IndexWriter fsIndexWriter = new IndexWriter(fsDir, fsConf);
		fsIndexWriter.addIndexes(ramDir);// 把另外几个索引库中的所有索引数据合并到当前的索引库中
		fsIndexWriter.close();
	}

	public static void main(String[] args) throws Exception {
		FirstLucene02 lucene = new FirstLucene02();
		lucene.createIndexByYouHua();
		lucene.search("iteye");
	}

}

 

 

运行结果:

总共有【1】条匹配的结果

name -->HelloLucene01.txt

content -->Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com.

 

path -->F:\Workspaces\workspaceSE\BlogDemo\luceneDatasource\HelloLucene01.txt

size -->84

 

 

注意上面,添加的时候,索引文件可能会很多,所以这样就会产生更多的IO操作,影响效率,所以需要对索引文件进行优化,减少文件数量,从而减少IO操作。

在上面的优化创建索引的方法里的倒数第二行添加:

fsIndexWriter.commit();
fsIndexWriter.optimize();//对索引文件进行优化,从而减少IO操作

 

 但是在Lucene3.5中这个方法提示过时了

 看源码提示:

  /** This method has been deprecated, as it is horribly
   *  inefficient and very rarely justified.  Lucene's
   *  multi-segment search performance has improved over
   *  time, and the default TieredMergePolicy now targets
   *  segments with deletions.
   *
   * @deprecated */

 

 

 这里还不知道Lucene3.5中对索引文件进行优化的方法,这里暂时留个问题。(?????)

有哪位知道的可以指点一下。

 

 

谢谢“gao2008ss”ok了,这种方式fsIndexWriter.forceMerge(1);,把上面的fsIndexWriter.optimize();替换为fsIndexWriter.forceMerge(1);

 

 

 

 

 

 

 

3
0
分享到:
评论
2 楼 w156445045 2013-04-29  
请问内存索引,是从硬盘读取索引文件放在内存中嘛?
这个好像本来就是这样的吧,
计算机的数据都是放在内存中的吧?
1 楼 hong114126 2012-06-14  
请教一个问题,如果索引文件达到好几个G,还是放入内存中吗????

相关推荐

    lucene-core-2.9.4,lucene-core-3.0.2,lucene-core-3.0.3,lucene-core-3.4.0

    - **段合并优化**:这两个版本主要关注于索引段的合并策略,旨在减少磁盘I/O,提高检索速度。 - **文档处理增强**:引入了对PDF、HTML等更多文件格式的支持,使得Lucene可以处理更广泛的数据源。 - **多线程支持*...

    lucene-memory-3.0.1.jar

    而在3.0.1版本中,Lucene引入了内存索引(Memory Index)这一概念,即“lucene-memory-3.0.1.jar”,它允许用户在内存中创建和操作索引,而非传统的磁盘存储。 内存索引的主要优势在于速度。由于数据存取无需经过...

    lucene-4.0.0-src.zip 【Lucene 4.0.0源码包src , source】

    5. **内存与磁盘存储(Memory & Disk Storage)**:Lucene利用`RAMDirectory`和`FSDirectory`等类管理索引在内存和磁盘上的存储,以平衡性能和资源消耗。 为了在Eclipse中查看和理解这些源码,我们需要进行以下步骤...

    lucene学习-02

    - **性能优化**:包括内存管理、磁盘I/O优化、多线程索引和搜索等,这些都是提升Lucene效率的重要手段。 - **近实时搜索**:Lucene引入NRT(Near Real Time)机制,使得索引更新后几乎立即生效。 - **Lucene扩展**...

    lucene-5.0.0 完整资源(包含Jar包)

    5. **内存和磁盘管理**:Lucene 使用段(Segment)的概念来组织索引,每个段都是一个独立的可搜索单位。定期的合并操作可以优化磁盘空间并保持索引效率。 6. **扩展性和定制化**:Lucene 是一个高度模块化的框架,...

    Lucene.Net-2.3.2

    1. **高性能**:Lucene.Net优化了内存和磁盘操作,确保了高速的索引和搜索性能。 2. **多语言支持**:内置了多种语言的分析器,支持对不同语言的文本进行正确处理。 3. **分布式搜索**:通过组合多个索引,Lucene...

    Lucene 索引的简单使用

    以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...

    lucene-6.4.0-src.zip

    1. **索引优化**:在6.4.0版本中,Lucene对索引结构进行了优化,提升了存储效率和检索速度。例如,通过改进的位向量技术和更高效的段合并策略,降低了磁盘I/O,提高了性能。 2. **查询解析与执行**:Lucene提供了...

    Lucene4.7-Web 例子

    在本例中,MyBatis3用于从数据库中检索数据,这些数据可能需要被索引到Lucene中,或者根据用户的搜索条件从Lucene索引中查找匹配的数据。 三、Lucene4.7在Web应用中的集成步骤 1. 配置依赖:首先,需要在项目中引入...

    Incubating-Apache-Lucene.Net-2.0-004-11Mar07.bin.zip

    9. **内存和磁盘管理**:Lucene.Net可以有效地管理索引的存储,支持磁盘上的索引和内存中的部分缓存,平衡性能和资源消耗。 10. **分布式搜索**:虽然2.0版本可能不包含完整的分布式搜索功能,但Lucene.Net后续版本...

    Lucene 5 主要jar包

    它定义了如何在磁盘上存储和读取索引,包括不同的压缩和位存储策略。此包中的类直接影响到索引的大小和搜索性能。 4. **lucene-benchmark-5.0.0.jar**:这是一个基准测试工具,用于评估和比较不同Lucene配置的性能...

    Incubating-Apache-Lucene.Net-2.0-004-11Mar07.src.zip

    9. 存储和缓存:Lucene.Net使用内存和磁盘混合存储,以平衡性能和内存使用。同时,它还支持缓存机制,加速查询速度。 10. 多线程支持:Lucene.Net是线程安全的,可以在多线程环境中高效运行,适合大型并发系统。 ...

    lucene-5.5.3.zip

    - **性能提升**:相对于之前的版本,5.5.3在搜索速度和内存效率上有所优化。 - **查询解析器(QueryParser)**:支持更复杂的查询语法,如布尔运算符、短语查询、通配符查询等。 - **多字段搜索**:可以在多个...

    Lucene.net-4.8.0 -new Bate.rar

    2. **内存与磁盘管理**:合理配置Directory类型,如内存目录用于小规模索引,而文件系统目录适用于大规模数据。 3. **并发控制**:在多线程环境下,正确管理和同步IndexWriter和IndexReader。 4. **缓存策略**:利用...

    Lucene---全文检索(文档pdf/txt/office/html)

    此外,可以使用诸如 Luke(Lucene Index Toolbox)这样的工具,可视化地查看和分析 Lucene 索引,帮助开发者更好地调试和优化索引。 总之,Lucene 是一个强大且灵活的全文检索工具,通过熟练掌握其原理和实践,可以...

    lucene-6.5.0工具包

    6. **内存和磁盘管理**:通过缓存机制和位图索引,优化内存使用,同时支持磁盘上的大索引。 在“lucene-6.5.0”这个版本中,可能包含了以下更新和改进: 1. **性能提升**:可能通过算法优化或数据结构改进,提升了...

    jakarta-lucene-1.9-final.zip_lucene_lucene 1.9 final j

    5. **内存和磁盘优化**:Lucene设计时考虑了内存和磁盘的使用,能在有限的资源下提供高效服务。 在1.9版本之后,Lucene不断进化,增加了更多特性,如更强大的分词器、支持更多数据源、支持复杂查询表达式、性能优化...

    Apache-Lucene.Net-3.0.3-RC2.bin

    5. **存储与内存管理**:Lucene.Net提供了磁盘和内存的存储机制,如RAMDirectory和FSDirectory,分别用于内存和磁盘上的索引存储。 6. **更新和删除**:Lucene.Net支持对索引的更新和删除操作,包括添加新文档、...

    lucene-3.3.0-src.zip

    - **内存使用优化(Memory Usage)**: 减少了内存占用,提升了系统在大规模索引时的稳定性。 4. **示例应用** `demo`目录下的代码展示了如何使用Lucene进行基本的索引创建、搜索和分析操作。开发者可以通过这些...

    lucene-3.0.2-dev-src

    段合并是Lucene索引维护的重要部分,涉及`MergePolicy`和`MergeScheduler`两个关键组件。 9. **文档字段与存储** `Document`类是Lucene的基本数据结构,包含多个`Field`。`Field`有三种类型:存储(Stored)、索引...

Global site tag (gtag.js) - Google Analytics