Lucene.NET - 检查文档是否存在于索引中

时间:2014-01-08 11:00:55

标签: c# .net lucene lucene.net

我有以下代码,使用Lucene.NET V4来检查我的索引中是否存在文件。

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'类型的异常。

2 个答案:

答案 0 :(得分:0)

首先,如果您不打算考虑删除的文档,那么使用IndexReader的相同实例是一个很好的做法 - 它会表现得更好并且它是线程安全的,因此您可以创建静态其中只读字段(尽管如此,我可以看到您为false参数指定了readOnly,因此如果是这样,请忽略此段落。)

至于您的情况,您是否标记了filepath字段值?因为如果你是(例如在索引/搜索时使用StandardAnalyzer),你可能会在找到诸如\myFile.PDF之类的值时遇到问题(使用默认的标记生成器,该值将被拆分为{{1} }和myFile,不确定前导反斜杠。)

希望这有帮助。

答案 1 :(得分:0)

您可能在使用分析器标记化/更改内容的索引编制过程中分析了字段“filepath”。例如StandardAnalyzer将标记化,小写,删除停用词(如果指定等)。

如果您只需要在示例中查询确切的文件路径,请在索引此字段时使用KeywordAnalyzer。

如果您现在无法重新索引,则需要找出索引期间使用的分析器并使用它来创建查询。您有两种选择:

  1. 使用具有正确分析器的查询解析器并解析查询filepath:\\myFile.PDF。如果resultung查询是TermQuery,您可以像在示例中一样使用其术语。否则使用查询执行搜索。
  2. 直接使用Analyzer从TokenStream对象创建术语。同样,如果只有一个术语,就像你一样,如果是多重术语,则创建一个短语查询。