lucene是多线程写文件的,但是也要写出来的文件号是从小到大的。也就是最后写的时候还需要一个同步的过程。
当文档号低的还没有生成完,但是另外一个线程的已经生成好一个文档号高的文档了,这个时候怎么办,这个时候文档号高的是不能写的,要等到文档号低的写完再写。
lucene的做法是把这些高的文档加入到一个队列,即WaitQueue。
这样当低文档写完的时候,还会去写准备好的高的文档。注意有个while循环,而writeDocument方法有个nextWriteLoc++会不断往前
synchronized public boolean add(DocWriter doc) throws IOException {
assert doc.docID >= nextWriteDocID;
if (doc.docID == nextWriteDocID) {
writeDocument(doc);
while(true) {
doc = waiting[nextWriteLoc];
if (doc != null) {
numWaiting--;
waiting[nextWriteLoc] = null;
waitingBytes -= doc.sizeInBytes();
[color=red] writeDocument(doc);[/color]
} else
break;
}
private void writeDocument(DocWriter doc) throws IOException {
assert doc == skipDocWriter || nextWriteDocID == doc.docID;
boolean success = false;
try {
doc.finish();
nextWriteDocID++;
numDocsInStore++;
nextWriteLoc++;
assert nextWriteLoc <= waiting.length;
if (nextWriteLoc == waiting.length)
nextWriteLoc = 0;
success = true;
} finally {
if (!success)
setAborting();
}
}
但是这样会有个问题,这个队列越来越大怎么办,会吃掉很多内存。所以设置了一个上限,
synchronized boolean doPause() {
return waitingBytes > waitQueuePauseBytes;
}
private long ramBufferSize = (long) (IndexWriter.DEFAULT_RAM_BUFFER_SIZE_MB*1024*1024);
private long waitQueuePauseBytes = (long) (ramBufferSize*0.1);
waitQueuePauseBytes算下来就是1.6*1024*1024,其实还是很大了,呵呵。
超过这个值得时候,这个线程就会暂停,
if (doPause)
waitForWaitQueue();
synchronized void waitForWaitQueue() {
do {
try {
wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
} while (!waitQueue.doResume());
}
这个时候就是等待notify。
还有个苏醒的条件是doResume,
synchronized boolean doResume() {
return waitingBytes <= waitQueueResumeBytes;
}
这个值得大小其实就是之前说的暂停值得一半。
看起来整个过程是比较麻烦的了,多线程搞同步就是比较麻烦啊,呵呵。
不过lucene为什么要文档号按顺序写呢?
分享到:
相关推荐
《庖丁解牛 源码 for Lucene 2.4》是一份针对开源全文搜索引擎Lucene 2.4版本的深度解析资料。这个压缩包包含的文件名为"paoding-for-lucene-2.4",很可能是针对中文处理的Paoding Lucene库的源代码分析或扩展。...
**Lucene 2.4 入门指南** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了高级文本检索功能,广泛用于构建搜索引擎和其他需要高效全文检索能力的应用。本文将重点介绍 Lucene 2.4 版本的...
【标题】"java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)" 涉及的核心技术是Java Web开发中的几个关键组件,包括ExtJS 2.0前端框架,Spring、Struts2和Hibernate(SSH)后端框架,Oracle 10g数据库以及Lucene ...
《Lucene 2.4与Nutch学习笔记:在多文本文档中搜索关键词》 Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取...
**Lucene 2.4 入门例子** Lucene 是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供了强大的搜索功能,被广泛应用于各种应用中的信息检索。在这个入门例子中,我们将探讨Lucene 2.4版本的一些关键特性和...
lucene 2.4 jar lucene2.4版本的JAR包
ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0
- 提供的 "lucene总结.chm" 文件是 Lucene 2.4 的中文文档,包含了详细的 API 参考、教程和最佳实践。文档涵盖了 Lucene 的各个组件,如分析器、查询解析、索引和搜索,以及高级话题,如多字段搜索、评分策略等。 ...
本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...
### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...
struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................
lucene2.4手册,是开发搜索引擎的好帮手.
总结来说,Lucene 2.4.1是搜索引擎开发的重要工具,其源码的分析与学习对于提升对全文检索技术的理解至关重要。无论是熟悉核心包的类与接口,还是实践demos包中的示例,都将有助于开发者更好地利用Lucene构建高效、...
本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...
总结,Lucene 5为开发者提供了强大且灵活的全文检索功能,通过深入学习其源码,尤其是拼音检索和分词器的运用,可以有效地提升搜索质量和用户体验。不断探索和实践,才能充分挖掘Lucene的潜力,为各种信息检索应用...
《深入剖析Lucene 5.0源码》 Lucene是一个高性能、全文检索库,它为Java开发者提供了在应用程序中实现全文检索功能的工具。在本文中,我们将深入探讨Lucene 5.0的源码,揭示其核心设计思想与工作原理,帮助读者更好...
支持net4.0环境下运行,Lucene.net版本为3.0,PanGu版本为2.4
《深入剖析Lucene.NET 2.9.1:源码解析与应用...总结,Lucene.NET 2.9.1的源码不仅是一份学习资料,也是实践中的宝贵工具。深入理解其工作机制,将有助于提升.NET平台上的搜索技术能力,实现高效、精准的全文检索功能。
lucene3.0.3源码和教程