`

Lucene 2.4更新索引的方法(Update Index)

阅读更多

在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

 

 

 

 

分享到:
评论

相关推荐

    Lucene2.4入门总结

    1. **核心概念**:Lucene 的主要组件包括索引(Index)、文档(Document)、字段(Field)和查询(Query)。索引是预处理后的数据结构,用于快速查找文档;文档是信息的最小单位,包含多个字段;字段是文档中的具体...

    Lucene 2.4 入门例子

    **Lucene 2.4 入门例子** Lucene 是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供了强大的搜索功能,被广泛应用于各种应用中的信息检索。在这个入门例子中,我们将探讨Lucene 2.4版本的一些关键特性和...

    java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)

    【标题】"java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)" 涉及的核心技术是Java Web开发中的几个关键组件,包括ExtJS 2.0前端框架,Spring、Struts2和Hibernate(SSH)后端框架,Oracle 10g数据库以及Lucene ...

    lucene2.4+nutch学习笔记三:lucene 在多个文本文档里找出包含一些关键字的文档

    在Lucene 2.4版本中,我们需要先创建一个索引,这个过程涉及读取文本文档,解析内容,然后将内容分词(Tokenization),构建倒排索引(Inverted Index)。倒排索引将每个词对应到包含该词的所有文档的列表,从而实现...

    Lucene2.4完美样例+中文文档

    **Lucene 2.4 完美样例与中文文档详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它为开发者提供了在 Java 应用程序中实现全文检索功能的强大工具。Lucene 2.4 版本是其历史上的一个重要...

    lucene 2.4 jar

    lucene 2.4 jar lucene2.4版本的JAR包

    ictclas4j for lucene 2.4

    ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0

    庖丁解牛 源码 for Lucene 2.4

    《庖丁解牛 源码 for Lucene 2.4》是一份针对开源全文搜索引擎Lucene 2.4版本的深度解析资料。这个压缩包包含的文件名为"paoding-for-lucene-2.4",很可能是针对中文处理的Paoding Lucene库的源代码分析或扩展。...

    基于lucene技术的增量索引

    Lucene首先需要理解的是它的核心概念,包括文档(Document)、字段(Field)、术语(Term)和倒排索引(Inverted Index)。每个文档由多个字段组成,字段内包含文本内容。Lucene通过分析这些文本,将其拆分为术语,...

    Lucene之删除索引

    首先,删除索引是Lucene中一个关键的操作,因为随着时间的推移,数据可能会更新或过时,此时就需要删除旧的索引信息。Lucene的索引删除过程并不像传统的文件系统删除那么简单,它涉及到对倒排索引结构的修改。 1. *...

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0产品搜索

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................

    关于lucene建立数据库索引的更新说明

    1. **资料的准确性**:由于网络上的信息繁多且质量参差不齐,使用Lucene时要确保所参考的教程或文档是最新的,因为版本更新可能导致某些方法或功能的改变。例如,旧版本中可能使用的`Hits`类在新版本中已被废弃,应...

    Lucene3.0创建索引

    ### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...

    Lucene2.4.1

    4. 索引器(IndexWriter):负责创建和更新索引。它接收文档,处理分词,并将结果写入磁盘。 5. 查询解析器(QueryParser):将用户的查询字符串转化为内部表示,以便于执行搜索。 6. 搜索器(Searcher):执行...

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

    - 索引更新时,应避免在搜索操作进行时修改索引,以防止数据不一致。 - 为了提高搜索效率,可以在创建索引时设置适当的参数,如`IndexWriterConfig`的`OpenMode`(决定是否覆盖现有索引)和`IndexingOptions`(决定...

    Lucene_2.4.CHM

    lucene2.4手册,是开发搜索引擎的好帮手.

    lucene 对 xml建立索引

    本文将详细介绍如何利用Lucene对XML文档进行索引建立的过程,并通过示例代码具体阐述其实现方法。 #### 二、基础知识 1. **Lucene简介** - Lucene是一个开源的全文搜索引擎库,能够帮助开发者构建应用程序内的搜索...

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

    在本文中,我们将深入探讨如何基于Lucene 2.4版本创建简单的全文索引并进行搜索操作。 一、Lucene基本概念 1. 文档(Document):在Lucene中,一个文档代表了要索引的信息源,它可以是网页、电子邮件、PDF文档等。...

    Lucene 删除 合并索引

    Lucene 删除 合并索引,可以指定几个索引文件合并成一个索引文件。自己写的,有很多不足之处请多指教

Global site tag (gtag.js) - Google Analytics