2014-01-08 99 views
0

我有以下代碼,使用Lucene.NET V4檢查文件是否存在於我的索引中。Lucene.NET - 檢查索引中是否存在文檔

bool exists = false; 
IndexReader reader = IndexReader.Open(Lucene.Net.Store.FSDirectory.Open(lucenePath), false); 
Term term = new Term("filepath", "\\myFile.PDF"); 
TermDocs docs = reader.TermDocs(term); 
if (docs.Next()) 
{ 
    exists = true; 
} 

文件myFile.PDF肯定存在,但它總是回來爲false。當我看到在調試docs,其DocFreq性聲明,他們「扔類型的異常‘System.NullReferenceException’。

回答

0

首先,它使用IndexReader的同一實例一個很好的做法,如果你'不會考慮刪除的文檔 - 它會更好地執行並且它是線程安全的,因此您可以創建一個靜態只讀字段(儘管,我可以看到您指定falsereadOnly參數,以防萬一這是有意的,只是忽略這一段)

至於你的情況,你是否標記filepath字段值?因爲如果你是(例如通過使用StandardAnalyzer索引/搜索)時,您可能會遇到問題,例如\myFile.PDF(使用默認標記器,該值將分解爲myFilePDF,不確定引導的反斜槓)。

希望這會有所幫助。

0

您可能在使用標記/更改內容的分析器建立索引期間分析了字段「filepath」。例如StandardAnalyzer標記,小寫,刪除停用詞如果指定等。

如果您只需要像在您的示例中那樣使用確切的文件路徑進行查詢,請在此字段的索引過程中使用KeywordAnalyzer。

如果您目前無法重新編制索引,則需要在編制索引期間找出使用哪個分析器並使用它來創建查詢。您有兩種選擇:

  1. 使用具有正確分析器的查詢解析器並解析查詢filepath:\\myFile.PDF。如果resultung查詢是TermQuery,則可以像在示例中那樣使用它的術語。否則,使用查詢執行搜索。
  2. 直接使用分析器從TokenStream對象創建條件。同樣,如果只有一個術語,就像你所做的那樣,如果multipe術語創建一個短語查詢。
相關問題