2017-06-14 59 views
0

我在lucene删除中遇到了一个奇怪的问题。我通过ids和代码运行成功地从lucene中删除文档。但他们重新出现在搜索中。这里有趣的是,删除的文档不会出现在同一个会话中,但是当我重新启动应用程序(所有Singletons重新初始化)时,这些已删除的文档将出现在搜索中。不知道这里发生了什么问题。我使用Lucene 4.0Lucene删除文件再次出现在搜索中

这里是我删除代码

indexWriter = new IndexWriter(storageDirectory, indexWriterConfig); 
try { 
     indexWriter.deleteDocuments(new Term(FIELD_ID, Id)); 
     indexWriter.commit(); 
     indexWriter.close(); 
     return true; 
    } catch (Exception e) { 
     // exception caught. 
    } finally { 
     //closing index writer. 
     closeIndexWriter(); 
    } 

下面是搜索代码

try { 
    ArrayList searchResults = new ArrayList(); 
    IndexReader indexReader = DirectoryReader.open(new MMapDirectory(LuceneIndexer.getIndexingDirectory(mContext))); 
    IndexSearcher indexSearcher = new IndexSearcher(indexReader); 
    int noOfResults = LuceneSearcher.MAX_SEARCH_RESULT_LIMIT; 
    TopDocs topDocs = indexSearcher.search(query, noOfResults); 
    ScoreDoc[] scoreDocs = topDocs.scoreDocs; 
    for (ScoreDoc scoreDoc : scoreDocs) { 
      IndexedSearchResult searchResult = new IndexedSearchResult(scoreDoc.doc, mContext); 
      if (loadDocuments) { 
       searchResult.loadData(indexReader); // load data loads document and data from it. 
      } 
      searchResults.add(searchResult); 
     } 

    } catch (IOException e) { 
     // exception things 
    } finally { 
     // close reader 
    } 

回答

0

你在你的搜索initalize新IndexSearcher的或实例共享? 你能添加您的检索代码吗?

+0

新的初始化发生。我添加了搜索代码。 – Apr444

+0

这看起来像lucene不能更新目录的I/O部分中的记录(在这种情况下删除)。因此,在同一个会话中,您可以获得更新后的结果,因为它保存在内存中,但并未真正写入光盘。 删除后是否有任何I/O异常? – dom

+0

附加问题,为什么使用MMapDirectory? – dom