我已经建立了Windows文件夹搜索以查找示例文件夹:
我已完成以下C#代码将文档添加到Lucene中:
var textExtractionResult = new TextExtractor().Extract(file.FullName, CreateCustomResult);
Document document = new Document();
document.Add(new TextField("TCfilename", file.FullName, Store.YES));
document.Add(new TextField("TCcontent", textExtractionResult.Text, Store.NO));
//Adding Metadata
foreach (var meta in textExtractionResult.Metadata)
{
document.Add(new TextField(meta.Key, meta.Value.ToString(), Store.YES));
}
writer.AddDocument(document);
如何将搜索范围限制在“ Province1”之类的子文件夹中?
结果应仅包含“ Province1”,“ City1”和“ City2”中的文件。
如何使用Lucene Query将其存档?
注意:FullName应该提供文件的完整路径。
答案 0 :(得分:1)
这取决于您通常如何进行搜索...
最简单的方法是将路径索引作为StringField并使用通配符:
new WildcardQuery(new Term("TCfilename", "C\\:\\\\Canada\\\\Province1\\\\*"))
//What else can we do?
new WildcardQuery(new Term("TCfilename", "C\\:\\\\*\\\\Province1\\\\*"))
new WildcardQuery(new Term("TCfilename", "*\\\\Canada\\\\Province1\\\\*"))
或者保留TextField,也可以使用邻近搜索:
parser.Parse(@"TCfilename: ""C Canada Province1""~0")
//What else can we do?
parser.Parse(@"TCfilename: ""Canada Province1""~0")
每一个都有优点和缺点。
第一个对路径非常严格,但是它允许我们在根中进行搜索,而第二个则不行(至少开箱即用,我们必须添加一个特殊的标记,标准分析器可以留在那里,或创建我们自己的分析器)-缺点是第一个很难使用QueryParser。
第二个选项允许进行更有趣的搜索,例如两个文件夹之间有一定距离的关系。后者还使我们能够快速找到名为“ Provice1”的任何文件夹中的任何文件,而无需使用前导通配符。
但是,无论如何,用第二种方法解锁的许多功能可能还是很难理解,因此我个人在大多数情况下会使用数字1(并添加明显的小写字母)。