wqkasdf1224 2011-08-22 11:52
浏览 496
已采纳

lucene更新索引,被更新索引的还在,还能被搜索到

使用lucene进行索引更新时,被更新的那条索引还存在;如果单独调用删除索引的方法的话,那条索引可以被删除

代码如下:
[color=red]// 生成索引[/color]
public boolean saveIndex(String id, String userId, String url, String title, String contents, String author, String date) {
File indexFile = new File(indexDirPath);
indexFile.mkdirs();
if(!indexFile.exists()) {
try {
indexFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
File[] files = new File(indexDirPath).listFiles();
boolean isCreate = true; //判断索引文件的建立是新建还是追加模式
if(files.length>0) {
isCreate = false;
}
/*超链接,主要应用于附件的使用,比如附件下载 每个元素的都是附件路径和附件名以逗号隔开的字符串*/
String accessStr = this.getUrlStr(id.trim());

    IndexWriter indexWriter = null;
    Directory directory = null;
    try {
        directory = new SimpleFSDirectory(indexFile);           
        //索引配置
        IndexWriterConfig indexWriterConfig=new IndexWriterConfig(Version.LUCENE_30, analyzer);
        //创建索引模式:CREATE,覆盖模式; APPEND,追加模式
        if(isCreate) {
            indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
        } else {
            indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.APPEND);
        }

// indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
//初始化索引创建器
indexWriter = new IndexWriter(directory,indexWriterConfig);
Document doc = new Document();
// 创建Field对象,并放入doc对象中
doc.add(new Field("id", id.trim(), Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new Field("userId", userId, Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new Field("url", url, Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("title", title, Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("contents", contents, Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("accesses", accessStr, Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("author", author, Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("date", date, Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new Field("indexDate", DateTools.dateToString(new Date(),
DateTools.Resolution.DAY), Field.Store.YES,
Field.Index.NOT_ANALYZED));
// 写入IndexWriter
indexWriter.addDocument(doc);
// 查看IndexWriter里面有多少个索引
// System.out.println("numDocs" + indexWriter.numDocs());
indexWriter.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}

     [color=red]// 删除索引[/color]
     public boolean deleteIndex(String id) { 
    /*File classDir = new File(this.getClass().getClassLoader().getResource("").getPath());
    String proDir = classDir.getParentFile().getParentFile().getPath();*/
    File indexFile = new File(indexDirPath);

// File indexDir = new File("D:\temp\indexDir");
Directory directory;
try {
directory = new SimpleFSDirectory(indexFile);
/*IndexReader ir = IndexReader.open(directory,false); //true:索引打开模式为只读(readOnly);
// false:索引打开模式不为可读,即为可更改
Term term = new Term("id",id);
ir.deleteDocuments(term);
ir.close();*/
IndexWriterConfig indexWriterConfig=new IndexWriterConfig(Version.LUCENE_30, analyzer);
IndexWriter iw = new IndexWriter(directory,indexWriterConfig);
Term term = new Term("id",id);
iw.deleteDocuments(term);
iw.optimize();
iw.commit();
iw.close();

    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

    [color=red]// 更新索引的方法[/color]
public boolean updateIndex(String id, String userId, String url, String title, String contents, String author,
                 String date) {
    /*this.deleteIndex(id.trim());
    if(this.deleteIndex(id.trim())) {
        this.saveIndex(id.trim(), userId, url, title, contents, author, date);
    }*/
    File indexFile = new File(indexDirPath);
         // 超链接,主要应用于附件的使用,比如附件下载   每个元素的都是附件路径和附件名以逗号隔开的字符串
    String accessStr = this.getUrlStr(id);
    Term term = new Term("id",id);
    IndexWriter indexWriter = null;
    Directory directory = null;
    try {
        directory = new SimpleFSDirectory(indexFile);
        //索引配置
            // IndexWriterConfig indexWriterConfig=new IndexWriterConfig(Version.LUCENE_30, analyzer);
        //创建索引模式:CREATE,覆盖模式; APPEND,追加模式

                   //   indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
        //初始化索引创建器
        indexWriter = new IndexWriter(directory, analyzer, false, 
                                  IndexWriter.MaxFieldLength.UNLIMITED);
        indexWriter.setUseCompoundFile(true);
        Document doc = new Document();
        // 创建Field对象,并放入doc对象中
        doc.add(new Field("id", id, Field.Store.YES,
                Field.Index.NOT_ANALYZED));
        doc.add(new Field("userId", userId, Field.Store.YES,
                Field.Index.NOT_ANALYZED));
        doc.add(new Field("url", url, Field.Store.YES,
                Field.Index.ANALYZED));
        doc.add(new Field("title", title, Field.Store.YES,
                Field.Index.ANALYZED));
        doc.add(new Field("contents", contents, Field.Store.YES,
                Field.Index.ANALYZED));
        doc.add(new Field("accesses", accessStr, Field.Store.YES, 
                Field.Index.ANALYZED));
        doc.add(new Field("author", author, Field.Store.YES,
                Field.Index.ANALYZED));
        doc.add(new Field("date", date, Field.Store.YES,
                Field.Index.NOT_ANALYZED));
        doc.add(new Field("indexDate", DateTools.dateToString(new Date(),
                DateTools.Resolution.DAY), Field.Store.YES,
                Field.Index.NOT_ANALYZED));
        // 更新IndexWriter
        indexWriter.updateDocument(term, doc);
        // 查看IndexWriter里面有多少个索引

// System.out.println("numDocs" + indexWriter.numDocs());
indexWriter.commit();
indexWriter.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}

  • 写回答

5条回答 默认 最新

  • 南天一梦N 2011-08-25 14:44
    关注

    删除的还在,那是你根本没删除掉。删除数据时候一定要保持数据库,缓存和索引都删除干净。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 如何提取csv文件中需要的列,将其整合为一篇完整文档,并进行jieba分词(语言-python)
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置