我有以下代码,使用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
时,它的Doc
和Freq
属性声明它们“抛出了'System.NullReferenceException'类型的异常。
答案 0 :(得分:0)
首先,如果您不打算考虑删除的文档,那么使用IndexReader
的相同实例是一个很好的做法 - 它会表现得更好并且它是线程安全的,因此您可以创建静态其中只读字段(尽管如此,我可以看到您为false
参数指定了readOnly
,因此如果是这样,请忽略此段落。)
至于您的情况,您是否标记了filepath
字段值?因为如果你是(例如在索引/搜索时使用StandardAnalyzer
),你可能会在找到诸如\myFile.PDF
之类的值时遇到问题(使用默认的标记生成器,该值将被拆分为{{1} }和myFile
,不确定前导反斜杠。)
希望这有帮助。
答案 1 :(得分:0)
您可能在使用分析器标记化/更改内容的索引编制过程中分析了字段“filepath”。例如StandardAnalyzer将标记化,小写,删除停用词(如果指定等)。
如果您只需要在示例中查询确切的文件路径,请在索引此字段时使用KeywordAnalyzer。
如果您现在无法重新索引,则需要找出索引期间使用的分析器并使用它来创建查询。您有两种选择:
filepath:\\myFile.PDF
。如果resultung查询是TermQuery,您可以像在示例中一样使用其术语。否则使用查询执行搜索。