2017-06-14 57 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