使用Lucene搜索子文件夹

时间:2019-07-15 19:47:09

标签: c# .net lucene lucene.net

我已经建立了Windows文件夹搜索以查找示例文件夹:

  • 加拿大
    • 省1
      • 城市1
      • 城市2
    • 省2
      • City3
      • 城市4

我已完成以下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应该提供文件的完整路径。

1 个答案:

答案 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(并添加明显的小写字母)。