2014-01-08 60 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术语创建一个短语查询。
相关问题