在Lucene里面没有update方法,我查了文档,我们只能删除以前的索引,然后增加新的索引。
具体步骤是,根据关键词,比如url这个唯一的东西,找到已经存在的索引项,然后删除它,
下面是我的一个根据网页URL删除索引的方法,里面主要使用了Item里面保存的一个docId的int类型的参数
这个数字是lucene内部每个索引的顺序号,类似于rowid
@SuppressWarnings("unchecked")
public synchronized void deleteByUrl(String url) {
synchronized (indexPath) {
try {
IndexReader indexReader = IndexReader.open(indexPath);
Iterator it = searchUrl(url).iterator();
while (it.hasNext()) {
indexReader.deleteDocument(((LuceneItem) it.next()).getDocId());
}
indexReader.close();
} catch (IOException e) {
System.out.println(e);
}
}
}
/**
* Lucene 2.4 搜索一个关键字的方法(Lucene Hits deprecated的解决方法)
*
* @param url
* @return
*/
public List<Item> searchUrl(String url) {
try {
// 替换一些特殊字符,比如冒号等
url = StrTools.encodeURLForLucene(url);
IndexSearcher isearcher = new IndexSearcher(indexPath);
QueryParser parser = new QueryParser(FIELD_URL, getAnalyzer());
Query query = parser.parse(url);
// 下面的这个方法已经不推荐使用了。
// Hits hits = isearcher.search(query);
// 改为如下的方式
TopDocCollector collector = new TopDocCollector(10);
isearcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
List<Item> rtn = new LinkedList<Item>();
LuceneItem o;
for (int i = 0; i < hits.length; i++) {
Document doc = isearcher.doc(hits[i].doc);
o = new LuceneItem();
o.setDocId(hits[i].doc);
o.setUrl(doc.get(FIELD_URL));
o.setAuthor(doc.get(FIELD_AUTHOR));
o.setTitle(doc.get(FIELD_TITLE));
o.setDatetimeCreate(doc.get(FIELD_DATETIMECREATE));
o.setBody(doc.get(FIELD_BODY));
rtn.add(o);
}
isearcher.close();
return rtn;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
然后在增加索引的地方,先调用deleteByUrl方法删除可能已经存在的数据,然后再增加数据
public synchronized void IndexSingle(Item item) {
synchronized (indexPath) {
try {
// 先删除以前的数据
deleteByUrl(item.getUrl());
// 增加数据
IndexWriter writer = getIndexWriter();
writer.setMaxFieldLength(10000000);
Date start = new Date();
Document doc = new Document();// 一个文档相当与表的一条记录
doc.add(new Field(FIELD_URL, item.getUrl(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field(FIELD_AUTHOR, item.getAuthor(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field(FIELD_TITLE, item.getTitle(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field(FIELD_DATETIMECREATE, item.getDatetimeCreate(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field(FIELD_BODY, item.getBody(), Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
// writer.optimize();// 优化
writer.close();// 一定要关闭,否则不能把内存中的数据写到文件
Date end = new Date();
System.out.println("索引建立成功!!!!" + "用时" + (end.getTime() - start.getTime()) + "毫秒");
} catch (IOException e) {
System.out.println(e);
}
}
}
评论:
你这么每次删除都要整个索引遍历一边,数据量大时效率可想而知。
删除用DeleteDocuments(Term term)
而不是DeleteDocument(int docId)
文章出自:http://hi.baidu.com/axhack/blog/item/6a101b1822940eb34bedbc64.html/cmtid/51f461036bcc7986d43f7cc6
分享到:
相关推荐
1. **核心概念**:Lucene 的主要组件包括索引(Index)、文档(Document)、字段(Field)和查询(Query)。索引是预处理后的数据结构,用于快速查找文档;文档是信息的最小单位,包含多个字段;字段是文档中的具体...
**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版本中,我们需要先创建一个索引,这个过程涉及读取文本文档,解析内容,然后将内容分词(Tokenization),构建倒排索引(Inverted Index)。倒排索引将每个词对应到包含该词的所有文档的列表,从而实现...
**Lucene 2.4 完美样例与中文文档详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它为开发者提供了在 Java 应用程序中实现全文检索功能的强大工具。Lucene 2.4 版本是其历史上的一个重要...
lucene 2.4 jar lucene2.4版本的JAR包
ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0
《庖丁解牛 源码 for Lucene 2.4》是一份针对开源全文搜索引擎Lucene 2.4版本的深度解析资料。这个压缩包包含的文件名为"paoding-for-lucene-2.4",很可能是针对中文处理的Paoding Lucene库的源代码分析或扩展。...
Lucene首先需要理解的是它的核心概念,包括文档(Document)、字段(Field)、术语(Term)和倒排索引(Inverted Index)。每个文档由多个字段组成,字段内包含文本内容。Lucene通过分析这些文本,将其拆分为术语,...
首先,删除索引是Lucene中一个关键的操作,因为随着时间的推移,数据可能会更新或过时,此时就需要删除旧的索引信息。Lucene的索引删除过程并不像传统的文件系统删除那么简单,它涉及到对倒排索引结构的修改。 1. *...
struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................
1. **资料的准确性**:由于网络上的信息繁多且质量参差不齐,使用Lucene时要确保所参考的教程或文档是最新的,因为版本更新可能导致某些方法或功能的改变。例如,旧版本中可能使用的`Hits`类在新版本中已被废弃,应...
### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...
4. 索引器(IndexWriter):负责创建和更新索引。它接收文档,处理分词,并将结果写入磁盘。 5. 查询解析器(QueryParser):将用户的查询字符串转化为内部表示,以便于执行搜索。 6. 搜索器(Searcher):执行...
- 索引更新时,应避免在搜索操作进行时修改索引,以防止数据不一致。 - 为了提高搜索效率,可以在创建索引时设置适当的参数,如`IndexWriterConfig`的`OpenMode`(决定是否覆盖现有索引)和`IndexingOptions`(决定...
lucene2.4手册,是开发搜索引擎的好帮手.
本文将详细介绍如何利用Lucene对XML文档进行索引建立的过程,并通过示例代码具体阐述其实现方法。 #### 二、基础知识 1. **Lucene简介** - Lucene是一个开源的全文搜索引擎库,能够帮助开发者构建应用程序内的搜索...
在本文中,我们将深入探讨如何基于Lucene 2.4版本创建简单的全文索引并进行搜索操作。 一、Lucene基本概念 1. 文档(Document):在Lucene中,一个文档代表了要索引的信息源,它可以是网页、电子邮件、PDF文档等。...
Lucene 删除 合并索引,可以指定几个索引文件合并成一个索引文件。自己写的,有很多不足之处请多指教