lucene.net 3.5 多线程测试代码

Lucene多线程创建索引的问题
使用爬虫抓取数据的时候一边创建索引,但是爬虫使用多线程的时候,创建索引就被write.lock文件锁住了。Lucene不支持多线程写操作,在网上搜了一下人家的的解决方法,比如:&,但是还没有解决,不懂是他这里的问题还是我自己代码的问题。
本来是先写到数据库里面再批量创建的,但是感觉这样的设计不太好。
本身Lucene的IndexWriter就是多线程的, lz不用纠结, 直接使用一个IndexWriter引用写入就好. 内部Lucene会把写入分摊给个个PerThread
--- 共有 1 条评论 ---
好的。试一下、
不允许多线程写,可以多线程读
--- 共有 1 条评论 ---
这样的话只能先写到数据库,再建立索引了?比如这里的方法:lucene3.5删除索引实例 - javasky - ITeye技术网站
博客分类:
lucene提供了两种删除索引的方式,一种是通过documentId删除某document文档,第二种是根据Term删除文档document.
对于第一种方式,在实际开发中使用很少,因为对于已经创建好的索引来说,我们很难确定某文档document的文档编号documentId是什么。
对于第二种方式,具体实例列举如下。
//按term删除文档
public class MyDeleteIndexes {
public static final String STORE_PATH = "E:/lucene_index";
public static void deleteIndexes(String field , String keyword) throws IOException{
long startTime = System.currentTimeMillis();
Directory dir = FSDirectory.open(new File(STORE_PATH));
IndexReader reader = IndexReader.open(dir,false);
Term term = new Term(field,keyword);
reader.deleteDocuments(term);
//可以按documentId删除文档
//reader.deleteDocument(1);
reader.flush();
reader.close();
//System.out.println(reader.lastModified(dir));
long endTime = System.currentTimeMillis();
System.out.println("total time: " + (endTime - startTime) + " ms");
浏览: 620610 次
来自: 黑龙江
楼主好人!
我也赞一个 很有用
我也赞一个 很有用
牛逼,就是样式被搞没了
这代码风格就像一坨翔Lucene&3.5.0&下载、安装与测试
若想了解Lucene项目的概况(Apache
overview):http://lucene.apache.org/java/docs/index.html
【1.】下载
下载地址:
我下载的是lucene
3.5.0版本,具体文件是:lucene-3.5.0.zip
【2.】安装
安装之前,确保你的机器里安装了java
VM,我安装的是jdk1.7最新版本,jdk的安装包的具体地址和虚拟机环境变量的设置这里不再赘述,有需要可以百度一下。
首先,将压缩包解压缩在本地磁盘 E:;
然后将lucene-3.5.0\lucene-core-3.5.0.jar和lucene-3.5.0\contrib\demo\lucene-demo-3.5.0.jar两个包拷贝放在java虚拟机的lib目录下,
如C:\Program
Files\Java\jdk1.7.0_01\lib\(其中java目录是虚拟机的根目录)。
因为测试环境为DOS环境,故我们需要设置环境变量CLASSPATH,在“我的电脑-&属性-&高级系统设置”中,CLASSPATH字段添加
%JAVA_HOME%\lib\lucene-demo-3.5.0.%JAVA_HOME%\lib\lucene-core-3.5.0.(不要忘记两个变量之间的分号)。
【3.】测试
我们要利用lucene实现检索的功能,首先要为某个测试文件集建立索引文件,而后再利用索引文件去检索测试文件集。
创建测试目录,选择测试文件
我用的是D:/tmp下的文件为例:
(为了测试我在该目录下新建2个文件,随意填写数据,待会全文搜索,从中搜索相关信息)
................................
在DOS环境下,切换到工作目录,如E:/lucene-3.5.0下,命令格式如下:
org.apache.lucene.demo.IndexFiles [-index INDEX_PATH] [-docs
DOCS_PATH] [-update]
其中参数-index是生成索引文件存储的路径,-docs参数是测试文件集
命令示例:
org.apache.lucene.demo.IndexFiles -index E:/lucene-3.5.0/index
-docs E:/tmp
生成索引以后,如果测试文件集中的文件有变动,那么就要更新索引了,命令:
org.apache.lucene.demo.IndexFiles -index E:/lucene-3.5.0/index
-docs E:/tmp -update
在工作目录下运行命令:
org.apache.lucene.demo.SearchFiles
回车以后会显示
键入搜索关键字进行搜索
比如键入:
Description
回车,Lucene则会返回测试集的结果:
Searching for:
description
1 total matching documents
1. d:\tmp\ontosem.owl
无论我们输入任何中文字符,结果都是:
0 total matching documents
可见,这里不支持中文搜索。
因为原文存在些许错误/不准确地方,故在此改正
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。lucene3.5通过NRTManager和SearchManager实现近实时搜索
时间: 15:39:02
&&&& 阅读:637
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&实时搜索(近实时搜索)
& & &完全的实时搜索:只要数据库一变动,马上要更新索引,mit来操作
& & 近实时搜索:当用户修改了信息之后,先把索引保存到内存中,然后在一个统一的时间对内存中的所有的索引进行提交操作。
reopen,NRTManager(near-real-time)
lucene通过NRTManager这个类来实现近实时搜索,所谓近实时搜索即在索引发生改变时,通过线程跟踪,在相对很短的时间反映给给用户程序的调用。
NRTManager通过管理IndexWriter对象,并将IndexWriter的一些方法(增删改)例如:
addDocument,deleteDocument等方法暴露给客户调用,它的操作全部在内存里面,所以如果你不调用IndexWriter的commit方法,通过以上的操作,
用户硬盘里面的索引库是不会变化的,所以你每次更新完索引库请记得commit掉,这样才能将变化的索引一起写到硬盘中,实现索引更新后的同步用
户每次获取最新索引 (IndexSearcher),可以通过两种方式:
第一种是通过调用NRTManagerReopenThread对象,该线程负责实时跟踪索引内存的变化,每次变化就调用maybeReopen方法,保持最新代索引,
打开一个新的IndexSearcher对象,而用户所要的IndexSearcher对象是NRTManager通过调用getSearcherManager方法获得SearcherManager对象,
然后通过SearcherManager对象获取IndexSearcher对象返回个客户使用,用户使用完之后调用SearcherManager的release释放IndexSearcher对象,最
后记得关闭 NRTManagerReopenThread;
第二种方式是不通过NRTManagerReopenThread对象,而是直接调用 NRTManager的maybeReopen方法来获取最新的IndexSearcher对象来获取最
以下是相关代码:
private SearcherManager mgr =
private NRTManager nrtMgr =
private IndexWriter writer =
writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
nrtMgr = new NRTManager (writer,new SearcherWarmer() {
public void warm(IndexSearcher s) throws IOException {
System.out.println(&reopen&);
//启动NRTManager的Reopen线程
NRTManagerReopenThread reopen = new NRTManagerReopenThread(nrtMgr, 5.0,0.025);
reopen.setDaemon(true);
reopen.setName(&NrtManager Reopen Thread&);
reopen.start();
mgr = nrtMgr.getSearcherManager(true);
public void delete() {
nrtMgr.deleteDocuments (new Term(&id&,&2&));
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
public void update() {
* Lucene并没有提供更新,这里的更新操作其实是如下两个操作的合集
* 先删除之后再添加
Document doc = new Document();
doc.add(new Field(&id&,&11&,Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
doc.add(new Field(&email&,emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field(&content&,contents[0],Field.Store.NO,Field.Index.ANALYZED));
doc.add(new Field(&name&,names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
nrtMgr.updateDocument (new Term(&id&,&1&), doc);
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
public void search02() {
IndexSearcher searcher = mgr.acquire();
mgr.maybeReopen();//判断是否需要重新打开一个searcher
TermQuery query = new TermQuery(new Term(&content&,&like&));
TopDocs tds = searcher.search(query, 10);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println(doc.get(&id&)+&----&&+
doc.get(&name&)+&[&+doc.get(&email&)+&]--&&+doc.get(&id&)+&,&+
doc.get(&attach&)+&,&+doc.get(&date&));
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
mgr.release(searcher);
} catch (IOException e) {
e.printStackTrace();
标签:&&&&&&
&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!yjflinchong 的BLOG
用户名:yjflinchong
文章数:190
评论数:11
访问量:28504
注册日期:
阅读量:5863
阅读量:12276
阅读量:397397
阅读量:1087822
51CTO推荐博文
lucene3.5 全文检索案例――――0.1秒检索60万数据
源码发布网:
lucene3.5 开发了
批量索引入库。
单个索引入库。
分页查询。
高亮显示查询结果。
所有索引删除。
源码下载地址:http://download.csdn.net/detail/yjflinchong/4291818
所需jar包, 免费下载地址
http://download.csdn.net/detail/yjflinchong/4291717 &目前最快的中文分词库
http://download.csdn.net/detail/yjflinchong/4291723 &自带分词器
http://download.csdn.net/detail/yjflinchong/4291728 & 核心包
http://download.csdn.net/detail/yjflinchong/4291735 & 高亮提示包
http://download.csdn.net/detail/yjflinchong/4291738 & 辅助包
高效率有图为证:
650) this.width=650;" src="http://img.my.csdn.net/uploads//_3891.jpg" alt="">
我的博客:http://blog.csdn.net/yjflinchong
转载能注明来源。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:未分类┆阅读(0)┆评论(0)}

我要回帖

更多关于 lucene 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信