0 0

java中用Lucene做搜索,在建索引时遇到的2个异常0

版本信息:

jdk: 1.6

lucene: 3.2.0

情况是这样的,现在项目用lucene做搜索,我在服务器上跑了个后台线程用于建索引(每次最多从数据库中取出2w条),隔10分钟会跑一次,但是 隔一段时间就会抛出一些莫名其妙的异常,而且修复不了,导致我必须得把索引目录下所有文件全部删除,再重新建索引。这在数据大的情况下,是致命的啊(目前 有将近110w数据,如果重建,每10分钟2w条数据,要9个小时)

有碰到过这个异常的大神们,可否为小弟指引一下,滴水之恩,必当涌泉相报!

我建索引的代码部分:
private synchronized void createIndexMutil(List contentList) {
	FSDirectory fsDir = null;
	RAMDirectory ramDir = null;
	IndexWriter indexWriter = null;
	IndexWriter fsInedxWriter = null;
	int commit_size = Config.INDEX_COMMIT_SIZE;
	String indexPath = Config.INDEXPATH;
	int count = 0;
	int sum = 0;
	try{
		File indexDir  = new File(indexPath);
		if((!indexDir.exists()) || (!indexDir.isDirectory())){
			indexDir.mkdirs();
		}
		
		fsDir = FSDirectory.open(indexDir);
		LockFactory lfactory = new SimpleFSLockFactory();
		fsDir.setLockFactory(lfactory);
		Analyzer luceneAnalyzer = new PaodingAnalyzer();
		fsInedxWriter = new IndexWriter(fsDir, luceneAnalyzer, IndexWriter.MaxFieldLength.LIMITED);
		for(int i = 0; i < contentList.size(); i++){
			ContentVo contentVo = (ContentVo)contentList.get(i);
			if(!contentVo.getContentContent().equals("")){
				if(count == 0){
					ramDir = new RAMDirectory();
					ramDir.setLockFactory(lfactory);
					indexWriter = new IndexWriter(ramDir, luceneAnalyzer, IndexWriter.MaxFieldLength.LIMITED);
				}
				Document document = new Document();
				Field f;
				String s = contentVo.getContentContent().replaceAll("<[^>]+>","").replaceAll("&nbsp;+"," ").replaceAll("\\s+"," ").replaceAll("&(\\w)+;", "");
				document.add(new Field("taskid", contentVo.getTaskID(), Field.Store.YES, Field.Index.NOT_ANALYZED));
				document.add(new Field("contentid", contentVo.getContentID(), Field.Store.YES, Field.Index.NOT_ANALYZED));
				document.add(new Field("content",s,Field.Store.YES,Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
				
				indexWriter.addDocument(document);
				log.info("[LUCENE THREAD]index created!taskid:"+ contentVo.getTaskID() +",contentid:" + contentVo.getContentID());
				updateIsIndex(contentVo.getTaskID(), contentVo.getContentID(), 1, contentVo.getIndexType());
				
				count ++;
				sum ++;
				if(count >= commit_size || i == contentList.size() - 1){
					indexWriter.close();
					fsInedxWriter.addIndexes(ramDir);
					count = 0;
				}
			}else{
				log.info("[LUCENE THREAD]content is empty!taskid:"+ contentVo.getTaskID() +",contentid:" + contentVo.getContentID());
				updateIsIndex(contentVo.getTaskID(), contentVo.getContentID(), 2, contentVo.getIndexType());
			}
		}
		fsInedxWriter.optimize();
		log.info("[LUCENE THREAD]append " + sum + ":" + " document!");
	}catch(Exception ex){
		log.error("操作异常", ex);
	}finally{
		if(fsInedxWriter != null){
			try {
				fsInedxWriter.close();
			} catch (Exception e) {
				log.error("操作异常", e);
			}
			fsInedxWriter = null;
		}
		if(indexWriter != null){
			try {
				indexWriter.close();
			} catch (Exception e) {
				log.error("操作异常", e);
			}
			indexWriter = null;
		}
	}
}


异常堆栈信息:
异常1:
java.io.IOException: background merge hit exception: _4(3.2):C19999 _5(3.2):Cv5000 _6(3.2):Cv5000 _7(3.2):Cv5000 _8(3.2):Cv5000 into _9 [optimize]
        at org.apache.lucene.index.IndexWriter.optimize(IndexWriter.java:2536)
        at org.apache.lucene.index.IndexWriter.optimize(IndexWriter.java:2474)
        at org.apache.lucene.index.IndexWriter.optimize(IndexWriter.java:2444)
        at com.paic.rsms_case.biz.LuceneService.createIndexMutil(LuceneService.java:138)
        at com.paic.rsms_case.biz.LuceneService.createNoIndexed(LuceneService.java:84)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy0.createNoIndexed(Unknown Source)
        at com.paic.rsms_case.biz.ThreadService.run(ThreadService.java:59)
Caused by: java.io.IOException: Stale NFS file handle
        at java.io.RandomAccessFile.close0(Native Method)
        at java.io.RandomAccessFile.close(RandomAccessFile.java:543)
        at org.apache.lucene.store.FSDirectory$FSIndexOutput.close(FSDirectory.java:493)
        at org.apache.lucene.util.IOUtils.closeSafely(IOUtils.java:80)
        at org.apache.lucene.index.FieldsWriter.close(FieldsWriter.java:127)
        at org.apache.lucene.index.SegmentMerger.mergeFields(SegmentMerger.java:250)
        at org.apache.lucene.index.SegmentMerger.merge(SegmentMerger.java:106)
        at org.apache.lucene.index.IndexWriter.mergeMiddle(IndexWriter.java:4194)
        at org.apache.lucene.index.IndexWriter.merge(IndexWriter.java:3837)
        at org.apache.lucene.index.ConcurrentMergeScheduler.doMerge(ConcurrentMergeScheduler.java:388)
        at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:456)


异常2:
java.io.FileNotFoundException: /nfsc/ifbsm_rsms_220017_vol1/casefile/indexfile/_8e.cfs (No such file or directory)
        at java.io.RandomAccessFile.open(Native Method)
        at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)
        at org.apache.lucene.store.SimpleFSDirectory$SimpleFSIndexInput$Descriptor.<init>(SimpleFSDirectory.java:69)
        at org.apache.lucene.store.SimpleFSDirectory$SimpleFSIndexInput.<init>(SimpleFSDirectory.java:90)
        at org.apache.lucene.store.NIOFSDirectory$NIOFSIndexInput.<init>(NIOFSDirectory.java:91)
        at org.apache.lucene.store.NIOFSDirectory.openInput(NIOFSDirectory.java:78)
        at org.apache.lucene.index.CompoundFileReader.<init>(CompoundFileReader.java:66)
        at org.apache.lucene.index.CompoundFileReader.<init>(CompoundFileReader.java:55)
        at org.apache.lucene.index.IndexWriter.getFieldInfos(IndexWriter.java:1210)
        at org.apache.lucene.index.IndexWriter.getCurrentFieldInfos(IndexWriter.java:1230)
        at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1166)
        at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:958)
        at com.paic.rsms_case.biz.LuceneService.createIndexMutil(LuceneService.java:106)
        at com.paic.rsms_case.biz.LuceneService.createNoIndexed(LuceneService.java:84)
        at sun.reflect.GeneratedMethodAccessor398.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy0.createNoIndexed(Unknown Source)
        at com.paic.rsms_case.biz.ThreadService.run(ThreadService.java:59)



抛出异常1的方法行代码是:fsInedxWriter.optimize();

抛出异常2的方法行代码是:fsInedxWriter = new IndexWriter(fsDir, luceneAnalyzer, IndexWriter.MaxFieldLength.LIMITED);
2013年9月09日 17:30
目前还没有答案

相关推荐

    基于lucene技术的增量索引

    本文将深入探讨如何利用Lucene实现增量索引,这是一种在数据库或文件系统更新时仅对新数据或变化数据进行索引的技术,以降低资源消耗并保持搜索性能。 **1. Lucene基础知识** Lucene首先需要理解的是它的核心概念,...

    java结合lucene做的的搜索引擎

    是使用java+lucene+jsp开发的搜索引擎。其中包括排序,高亮显示,以及分页等功能。效果类似百度,很炫。

    Lucene 索引的简单使用

    Lucene,作为Apache软件基金会的一个开源项目,是Java平台上的全文检索库,它提供了文本检索的核心工具,使得开发者能够快速地在应用程序中实现高级的搜索功能。本篇文章将详细阐述如何使用Lucene来创建和查询索引,...

    Java搜索引擎 Lucene

    Java搜索引擎Lucene是一款开源的全文检索库,由Apache软件基金会开发并维护,它为Java开发者提供了强大的文本搜索功能。Lucene的核心目标是让开发者能够快速地在应用中集成高级的搜索功能,使得用户可以轻松地查找和...

    lucene 对 xml建立索引

    ### Lucene对XML文档建立索引的技术解析与实践 #### 一、引言 随着互联网技术的迅猛发展,非结构化数据(如XML文档)在企业和组织中的应用日益广泛。如何高效地处理这些非结构化的数据,特别是进行快速检索成为了一...

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

    三、Lucene搜索步骤 1. 打开索引:使用Directory对象和IndexReader打开已创建的索引。 2. 创建搜索器:基于IndexReader创建一个IndexSearcher对象,它是实际执行搜索操作的工具。 3. 构建查询:使用QueryParser...

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

    2. 搜索索引:当用户提交查询时,查询解析器会生成查询对象,然后使用IndexSearcher进行搜索,找到匹配的文档。 3. 结果处理:最后,返回搜索结果,通常包括文档ID、分数及相关信息,可以进一步按需展示给用户。 ...

    Lucene全文搜索_LuceneJava全文搜索_

    在"Lucene全文搜索_LuceneJava全文搜索_"这个主题中,我们将深入探讨Lucene如何在Java环境中实现高效的全文搜索引擎。首先,Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和搜索(Search)。...

    基于java的Lucene全文搜索引擎资源简单实例下载

    Lucene是一个由Apache软件基金会开发的开源全文检索库,它为Java开发者提供了强大的文本搜索功能。Lucene是高性能、可扩展的信息检索库,可以集成到各种Java应用中,实现全文索引和搜索功能。本资源包提供了一个简单...

    Lucene3.0创建索引

    - 索引创建过程中可能会遇到各种异常,应添加适当的错误处理机制。 - 对于大量文档,可能需要考虑分批处理以避免内存溢出等问题。 通过以上步骤,我们可以有效地使用Lucene3.0来创建索引,从而提高文本数据的检索...

    Lucene建索引及查询关键字

    在Eclipse环境中运用java,Lucene建索引及查询关键字

    lucene全文搜素实例 java lucene 实例

    这个实例将深入讲解如何在 Java 中使用 Lucene 来创建索引并执行各种搜索操作。 ### 一、Lucene 基本概念 1. **索引(Index)**:Lucene 的核心功能是建立索引,它将非结构化的文本数据转换成可供快速搜索的数据...

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

    Lucene是Apache软件基金会的一个开放源代码项目,它是一个高性能、全文本检索库,提供了Java API,可以被嵌入到各种应用程序中,实现高效的全文搜索功能。Lucene具有高度可配置性和可扩展性,适用于处理大量文本数据...

    Lucene索引器实例

    以上就是Lucene索引器实例的基本介绍,通过这个实例,我们可以理解到如何使用Lucene来创建、管理和搜索文本索引。在实际项目中,可以根据需求选择合适的存储(如硬盘目录或分布式存储)、优化分析器配置、处理大量...

    用LUCENE连击MYSQL建立索引并搜索的JAVA代码。

    在这个场景中,我们讨论的是如何结合Lucene和MySQL来实现一个Java应用程序,该程序能够从MySQL数据库中提取数据,创建索引,并进行高效的搜索。 首先,我们需要理解Lucene的工作原理。Lucene通过分析文本,将文档...

    Lucene5学习之增量索引(Zoie)

    在信息检索领域,Lucene是一个广泛使用的全文搜索引擎库,其强大的索引能力和高效的搜索性能为开发者提供了强大的支持。然而,随着数据量的不断增长,如何高效地进行增量索引,即只对新增或更新的数据进行索引,而...

    java全文搜索引擎 Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便

    Java全文搜索引擎Lucene是Apache软件基金会的一个开源项目,它为开发者提供了一个强大的、高性能的、可扩展的全文检索工具包。Lucene的核心功能包括文本分析、索引创建、查询解析和搜索结果的排序。它不是预包装的...

    java lucene3.0 jar包

    Java Lucene 3.0的使用涉及到多个步骤,包括设置分析器(Analyzer)来处理不同语言的文本,创建索引(IndexWriter),查询索引(Searcher),以及对搜索结果进行评分和排序。同时,开发者还需要关注性能优化,例如...

    Lucene之删除索引

    Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的搜索和索引功能,广泛应用于各种应用程序中,如内容管理系统、网站搜索引擎等。现在,让我们详细讨论如何在Lucene中删除索引。...

    用Lucene实现Java里面的搜索引擎

    Lucene是一个纯Java库,其核心功能包括文本分析、索引和搜索。文本分析是将原始文本转化为可搜索的表示形式,通常涉及分词、去除停用词和词干提取等步骤。索引则是将这些经过处理的文本构建为高效的数据结构,以便...

Global site tag (gtag.js) - Google Analytics