`
fys124974704
  • 浏览: 138474 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

一段关于lucene的代码,不知道那里有问题

阅读更多
//这段代码很奇怪,线程开10没有问题,但是超过10个就会有很多奇怪的问题,不知道是不是我的硬件不支持还是本身这段代码就有问题

public class IndexCreateThread {
	public static void main(String[] args) throws CorruptIndexException,
			LockObtainFailedException, IOException, InterruptedException {
		IndexWriter writer = new IndexWriter(FSDirectory.getDirectory("E:/Lucene/Index6"), new StandardAnalyzer(), true);
		LinkedList<RAMDirectory> list = new LinkedList<RAMDirectory>();
		Runnable indexListThread = new IndexListThread(list,writer);
		new Thread(indexListThread).start();
		Runnable ramIndexCreateThread = null;
		for (int i = 0; i < 15; i++) {
			ramIndexCreateThread = new RamIndexCreateThread(list);
			new Thread(ramIndexCreateThread).start();
			Thread.sleep(i*3);
		}
		Thread.sleep(5000*10);

		while (true) {
			if (list != null && list.size() == 0) {
				System.out.println(writer.docCount());
				writer.optimize();
				writer.flush();
				writer.close();
				System.out.println("over....");
				System.exit(0);
			} else {
				Thread.sleep(1000);
			}
		}
	}

}

class IndexListThread implements Runnable{
	private LinkedList<RAMDirectory> list = null;
	private IndexWriter writer = null;
	
	public IndexListThread(LinkedList<RAMDirectory> list, IndexWriter writer) {
		super();
		this.list = list;
		this.writer = writer;
	}

	@Override
	public void run() {
		while(true){
			RAMDirectory r = null;
			try {
				Thread.sleep(5);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			if(list != null && list.size() > 0){
				r = list.get(0);
				try {
					this.writer.addIndexes(new Directory[]{r});
				} catch (CorruptIndexException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				list.remove(r);
				System.out.println("list 出来一个");
			}
		}
	}
}

class RamIndexCreateThread implements Runnable {
	private LinkedList<RAMDirectory> list = null;
	public RamIndexCreateThread(LinkedList<RAMDirectory> list) {
		this.list = list;
	}

	@Override
	public void run() {
		IndexWriter ramWriter = null;
		try {
			RAMDirectory ram = new RAMDirectory();
			ramWriter = new IndexWriter(ram,new StandardAnalyzer(), true);
			List<Authors> list = new DBOperation().getAuthorses();
			for(Authors s : list){
				Field f1 = new Field("id",s.getAu_id(),Field.Store.YES,Field.Index.UN_TOKENIZED);
				Field f2 = new Field("lname",s.getAu_lname(),Field.Store.YES,Field.Index.TOKENIZED);
				Field f3 = new Field("fname",s.getAu_fname(),Field.Store.YES,Field.Index.UN_TOKENIZED);
				Field f4 = new Field("phone",s.getPhone(),Field.Store.YES,Field.Index.TOKENIZED);
				Field f5 = new Field("address",s.getAddress(),Field.Store.YES,Field.Index.TOKENIZED);
				Field f6 = new Field("city",s.getCity(),Field.Store.YES,Field.Index.TOKENIZED);
				Field f7 = new Field("zip",s.getZip(),Field.Store.YES,Field.Index.TOKENIZED);
				Field f8 = new Field("state",s.getState(),Field.Store.YES,Field.Index.TOKENIZED);
				Field f9 = new Field("contract",s.getContract()+"",Field.Store.YES,Field.Index.TOKENIZED);
				Document doc = new Document();
				doc.add(f1);
				doc.add(f2);
				doc.add(f3);
				doc.add(f4);
				doc.add(f5);
				doc.add(f6);
				doc.add(f7);
				doc.add(f8);
				doc.add(f9);
				ramWriter.addDocument(doc);
			}
			ramWriter.flush();
			this.list.add(ram);
			System.out.println("list的进去一个");
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally{
			try {
				ramWriter.close();
			} catch (CorruptIndexException e) {
			} catch (IOException e) {
			}
		}
	}

}

 

分享到:
评论
3 楼 fys124974704 2008-09-26  
我今天再测试了一下 发现原来我那数据连的数据库数据太多了 一次拿了7千多条,然后修改了为每次拿几十条后,用99条线程同时并发,没有问题了!这个和线程的容器应该没有关系 我还是用LinkedList
2 楼 fys124974704 2008-09-26  
能不能详细一点呢?线程不安全的容器??
1 楼 javaeyes 2008-09-26  
高手啊,佩服。。。。。。。。。
一个不是线程安全的容器,让多线程访问,不出错才怪

相关推荐

    lucene包,lucene实现核心代码

    Lucene是Apache软件基金会的一个开放源代码项目,它是一个全文搜索引擎库,主要用Java编写,但也有其他语言的版本。Lucene提供了高级的文本分析、索引和搜索功能,是构建高效、可扩展的信息检索应用的基础。在Java的...

    Lucene-2.3.1 源代码阅读学习

    《Lucene-2.3.1 源代码阅读学习》 Lucene是Apache软件基金会的一个开放源码项目,它是一个高性能、全文本搜索库,为开发者提供了在Java应用程序中实现全文检索功能的基础架构。本篇文章将深入探讨Lucene 2.3.1版本...

    Lucene使用代码实例之搜索文档

    总的来说,通过这段代码实例,我们可以了解到使用Lucene进行搜索的基本步骤,包括创建查询对象、初始化`IndexSearcher`、执行查询以及处理搜索结果。掌握这些基本操作,对于理解和应用Lucene进行全文检索至关重要。

    Lucene 原理与代码分析完整版

    全文检索技术是一项用于在大量非结构化文档中快速定位信息的技术,而Apache Lucene是一个高性能的全文检索引擎工具包,其提供了完整的搜索引擎实现,包括索引创建、搜索管理等功能。本文将对Lucene的基本原理及其...

    lucene 原理与代码分析

    《Lucene原理与代码分析》深入探讨了几乎最新版本的Lucene的工作机制和代码实现细节,为理解全文搜索引擎的核心技术提供了宝贵的资源。以下是对该文件关键知识点的详细解析: ### 全文检索的基本原理 #### 总论 ...

    lucene原理与代码分析完整版

    ### Lucene原理与代码分析概览 #### 一、全文检索基本原理 全文检索是一种能够检索文档中任意词语的信息检索技术。与简单的关键词查询不同,全文检索不仅关注文档标题、元数据,还深入到文档的实际内容中去。这种...

    lucene 3.5 官网 源代码

    《深入理解Lucene 3.5:官网源代码解析》 Lucene,作为一个开源全文搜索引擎库,被广泛应用于各类信息检索系统中。它的3.5版本是其发展历程中的一个重要里程碑,提供了强大的搜索功能和高效的索引机制。在这个版本...

    Lucene 原理与代码分析.pdf

    总体而言,该文档为读者提供了一个关于Lucene深入学习的通道。从基本原理到具体的代码实现,对全文检索的整个流程进行了详尽的解读,使得读者能够充分理解Lucene的机制,并能利用它开发出高效的全文检索系统。

    Lucene_3.0_原理与代码分析

    为了提高搜索效率,Lucene 会定期执行段合并操作,将多个小段合并成一个较大的段。这一过程涉及到以下关键步骤: 1. **选择待合并段**:根据一定的策略选择需要合并的段。 2. **合并索引**:将选中的段合并成一个...

    lucene拼写纠错代码didyoumean

    Apache Lucene 是一个开源全文检索库,它提供了丰富的功能,包括拼写纠错。在这个“lucene拼写纠错代码didyoumean”主题中,我们将深入探讨如何利用Lucene实现拼写纠错功能。 首先,Lucene的`SpellChecker`类是其...

    Lucene源代码剖析

    《Lucene源代码剖析》是一本深度探讨Java版本Lucene搜索引擎库的专业书籍。Lucene是Apache软件基金会的一个开源项目,广泛应用于全文检索和信息检索领域。本书旨在通过深入解析其源代码,帮助开发者理解Lucene的工作...

    lucene简单代码列子

    doc.add(new Field("content", "这是一个关于Lucene的简单代码实例", Field.Store.YES, Field.Type.TEXT)); indexWriter.addDocument(doc); indexWriter.close(); } } ``` 这段代码创建了一个索引,包含一个...

    lucene2.0.0搜索引擎源代码

    总结,Lucene 2.0.0是一个强大的全文检索库,它的源代码提供了深入学习信息检索原理和实践的宝贵资源。通过理解并运用这些知识,开发者可以构建出高效、灵活的搜索引擎,提升应用程序的功能性和用户体验。

    Lucene 原理与代码分析完整版.pdf

    《Lucene原理与代码分析》深入探讨了Lucene——一款高性能、全功能的文本搜索引擎库——的核心机制与实现细节。本书不仅提供了理论上的全面解析,还辅以丰富的代码实例,帮助读者从源码层面理解Lucene的工作流程。...

    Lucene时间区间搜索

    在上面的代码中,`DateTools.DateToString`方法将DateTime对象转换为Lucene可理解的字符串格式,然后创建了一个包含这两个时间点的闭合范围查询。这里的“true”参数表示边界是包含的。 接下来,我们需要将这个...

    基于lucene的词频分析源代码

    **基于Lucene的词频分析源代码** 在信息检索和自然语言处理领域,词频分析是一种重要的技术...总的来说,Lucene提供的词频分析功能为开发者提供了一个强大且灵活的工具,用于处理大量文本数据并从中提取有价值的信息。

Global site tag (gtag.js) - Google Analytics