`
wangwanbao
  • 浏览: 20582 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Lucene中关于操作索引即时生效的探讨

阅读更多

 一、引出问题,抛砖引玉
    在Lucene中IndexWriter操作索引后,IndexReader必须重新打开索引才能使刚刚操作的数据生效。而在这个重新打开过程的一瞬间会影响整个查询的。我不知道大家在项目中是怎么去操作的,以下我将我的方法与大家分享,希望能够起到抛砖引玉的效果。


二、范例Demo

public void testLuceSynchronze() throws IOException{
	    String NAME_FIELD = "_name";
		File f = new File("log/index/testLucene");
		if(!f.isDirectory())
			f.mkdirs();
		Directory directory = FSDirectory.getDirectory(f);
		IndexWriter write = new IndexWriter(directory, false, new StandardAnalyzer());
		//写索引文件,标记为"位置一"
		Field nameField1 = new Field(NAME_FIELD,"张三",Store.YES,Index.UN_TOKENIZED);
		Field nameField2 = new Field(NAME_FIELD,"张四",Store.YES,Index.UN_TOKENIZED);
		List<Field> listFields = new ArrayList<Field>();
		listFields.add(nameField1);
		listFields.add(nameField2);
		
		for(Field field : listFields){
			Document doc = new Document();
			doc.add(field);
			write.addDocument(doc);
		}
		write.optimize();
		write.close();
		
		log.info("写索引完毕!");
	
		//以下方法构建查询Query,标记为"位置二"
		IndexSearcher searcher = new IndexSearcher(directory);
		Query tq = new PrefixQuery(new Term(NAME_FIELD,"张"));
		Hits hits = searcher.search(tq);
		if(hits.length() == 0){
			log.info("查无此人!");
		}else{
			for(int i=0;i<hits.length();i++){
				Document ret = hits.doc(i);
				String name = ret.getField(NAME_FIELD).stringValue();
				log.info(name);
			}
		}
		searcher.close();
	}

 
运行程序,控制台输入:

0    [main] INFO  test.lucene.TestSynchronize  - 写索引完毕!
78   [main] INFO  test.lucene.TestSynchronize  - 张三
78   [main] INFO  test.lucene.TestSynchronize  - 张四

以上是在位置二处构建IndexSearcher的,如果移至位置一处,就不会有查询到的记录。找到Lucene的文档,发现有这么一段说明。

 

Regardless of autoCommit, an IndexReader or IndexSearcher will only see the index as of the "point in time" that it was opened. Any changes committed to the index after the reader was opened are not visible until the reader is re-opened.

三、我的解决方案:

1)IndexWriter和IndexSearcher共用同一个Directory

2)IndexWriter或IndexReader对索引有操作的话,更改boolean的值,重新构建IndexSeacher,注意同步一下getSearcher()

	protected synchronized IndexSearcher getSearcher() {
		if(needFreshSearcher){
			this.needFreshSearcher = false;
			try {
				this.searcher.close();
				this.searcher = new IndexSearcher(getDirectory());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return searcher;
	}

 

 

分享到:
评论

相关推荐

    基于lucene技术的增量索引

    在Lucene中,我们可以使用`IndexWriter.deleteDocuments(Term)`方法来标记特定的文档为删除状态。 - **提交与刷新**:在处理完所有变更后,必须调用`IndexWriter.commit()`来保存这些变更,并使它们对搜索可见。...

    lucene 对 xml建立索引

    ### Lucene对XML文档建立索引的技术解析与实践 #### 一、引言 随着互联网技术的迅猛发展,非结构化数据(如...在未来的发展中,随着数据量的不断增加和技术的进步,Lucene对XML文档的索引建立将会更加高效和智能化。

    Lucene之删除索引

    1. **删除文档**:在Lucene中,删除操作并不是真正地从磁盘上移除文档,而是通过添加一个删除标记到索引中。当你调用`IndexWriter.deleteDocuments(Term term)`或`IndexWriter.deleteDocuments(Query query)`方法时...

    Lucene索引的基本操作

    本文将深入探讨Lucene索引的基本操作,包括如何添加文档到索引、更新已有的索引以及相关的测试代码。 ### 1. 初始化Lucene环境 首先,我们需要导入Lucene的相关库。在Java项目中,可以通过Maven或Gradle等构建工具...

    lucene.net 2.9.2 实现索引生成,修改,查询,删除实例

    在这个实例中,我们将深入探讨如何使用Lucene.NET 2.9.2来实现索引的生成、修改、查询和删除。 **一、索引生成** 首先,我们需要创建一个索引,这是全文检索的基础。在Lucene.NET中,我们通常会定义一个文档类,...

    Lucene索引器实例

    在Lucene中,我们首先需要创建一个`IndexWriter`实例来管理索引的写入操作。这通常包括以下几个步骤: - 初始化配置:设置目录(Directory)、分析器(Analyzer)、索引写入参数等。 - 创建`IndexWriterConfig`对象...

    lucene全文检索简单索引和搜索实例

    1. 文档(Document):在Lucene中,一个文档代表了要索引的信息源,它可以是网页、电子邮件、PDF文档等。文档由多个字段(Field)组成,每个字段具有不同的含义和处理方式。 2. 字段(Field):字段是文档的组成...

    Lucene3.0创建索引

    在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、Lucene3.0简介 Lucene是一...

    Lucene 索引的简单使用

    - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段(Field)。 - **字段(Field)**:字段是文档的组成部分,每个字段都有特定的类型(如文本、日期等),并可以被索引或...

    最简单的Lucene建立、搜索索引的方法

    - 索引更新时,应避免在搜索操作进行时修改索引,以防止数据不一致。 - 为了提高搜索效率,可以在创建索引时设置适当的参数,如`IndexWriterConfig`的`OpenMode`(决定是否覆盖现有索引)和`IndexingOptions`(决定...

    关于lucene建立数据库索引的更新说明

    在本文中,我们将探讨如何使用Lucene建立数据库索引,并分享一些在实践过程中的经验和教训。Lucene是一个高性能、全文本搜索库,广泛用于构建搜索引擎。在创建索引时,需要注意以下关键点: 1. **资料的准确性**:...

    Lucene结合Sql建立索引Demo源码.rar

    本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 【该源码由51aspx提供】   源码 " onerror="this.src='/images/ifnoimg.gif'" src="/uploads/allimg/090904/1039152O5-0.jpg...

    lucene 4.7.2 Demo

    本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...

    深入 Lucene 索引机制深入 Lucene 索引机制

    本文将深入探讨Lucene的索引机制,帮助读者理解其工作原理和使用方法。 1. Lucene 简介 Lucene最初由Doug Cutting创建,他是一个在全文检索领域的专家。自2001年加入Apache基金会以来,它成为了Jakarta项目的子项目...

    lucene索引查看程序及代码

    本文将围绕“lucene索引查看程序及代码”这一主题,详细探讨其工作原理、主要功能以及使用方法。 首先,我们要了解什么是Lucene索引。Lucene的索引是一种倒排索引,它通过分析文档内容,将每个单词映射到包含该单词...

    Lucene索引和查询

    本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行索引创建和查询操作。 首先,我们需要了解Lucene的基本概念。Lucene的核心思想是将文本数据转换为结构化的索引,以便于快速查找相关文档。这个过程...

    Lucene结合Sql建立索引

    Lucene(这里用到的是Lucene.net版本也成为DotLucene)是一个...本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 支持简单的中文分词,同时提供了Lucene.Net-2.0-004版本的源码给大家

    Lucene5学习之增量索引(Zoie)

    Zoie通过跟踪数据源的变更日志,只对发生变化的数据进行索引操作,这样既避免了全量索引的高开销,又保证了索引的实时性。在处理大量数据时,这种策略可以显著提高效率,减少资源消耗。 在实现上,Zoie利用了Lucene...

    lucene索引查看工具

    这款已经老了,2.4以后的lucene索引用不了。我上传了最新版本的,有需要的话!请到http://download.csdn.net/source/1423241 下。一款可以查看Lucene分词后在索引的排名以及是否有无该词,很多时候用于查看有无需要...

    lucene3.0庖丁+索引搜索程序

    本文将深入探讨Lucene3.0版本,结合“庖丁解牛”的精神,对其实现机制进行细致的剖析,并结合索引搜索程序的实例,帮助读者理解和应用这一强大的工具。 一、Lucene3.0概述 Lucene3.0是Apache软件基金会的一个项目...

Global site tag (gtag.js) - Google Analytics