【问题标题】:Lucene "Ends with" queryLucene“结束于”查询
【发布时间】:2014-09-13 11:18:13
【问题描述】:

我正在使用带有 .net4 的 lucene.net 版本 2.9.2.2。我在寻找 “结束于”查询以及路径。如果它不应该标记并返回 TRUE 发生在两者之间。

索引路径:

C:\Users\vj\folder1\lucene\
C:\Users\vj\folder1\lucene\folder1\folder2
C:\Users\vj\folder2\lucene2\folder1\lucene\

索引代码:

new Field("PATH", strPath, Field.Store.YES, Field.Index.NOT_ANALYZED));
//Standard Analyzer
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);

搜索代码:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
var queryParser = new QueryParser(Version.LUCENE_29, "PATH", analyzer);
var query = queryParser.Parse(strPath);

搜索查询:folder1\lucene\

预期结果:

C:\Users\vj\folder1\lucene\
C:\Users\vj\folder2\lucene2\folder1\lucene\

如何获得上述结果。我在 SO 上看到了很多关于 相同的。但没有一个包含工作代码。

【问题讨论】:

    标签: c# .net lucene lucene.net


    【解决方案1】:

    这是一个示例程序,可提供您正在寻找的输出。

    注意事项:

    • 默认情况下,QueryParser 不允许使用前导通配符(出于性能原因)。
    • 未分析“路径”字段,因此未使用传递给 IndexWriter 的分析器。
    • StandardAnalyzer 去除了反斜杠,因此程序使用 WhitespaceAnalyzer 保留它们的完整性。
    • 将反斜杠传递给 QueryParser 时需要对其进行转义。

    希望对你有所帮助。

    using System;
    using Lucene.Net.Analysis;
    using Lucene.Net.Analysis.Standard;
    using Lucene.Net.Documents;
    using Lucene.Net.Index;
    using Lucene.Net.QueryParsers;
    using Lucene.Net.Search;
    using Lucene.Net.Store;
    
    namespace TestProgram
    {
      class Program
      {
        static void Main(string[] args)
        {
          FSDirectory directory = FSDirectory.Open(@"c:\temp\myindex");
    
          BuildIndex(directory);
          QueryIndex(directory);
        }
    
        static void BuildIndex(Directory directory)
        {
          string[] paths = new[]
          {
            @"C:\Users\vj\folder1\lucene\",
            @"C:\Users\vj\folder1\lucene\folder1\folder2",
            @"C:\Users\vj\folder2\lucene2\folder1\lucene\"
          };
    
          Analyzer analyzer = new WhitespaceAnalyzer();
    
          using (var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED))
          {
            foreach (string path in paths)
            {
              Document doc = new Document();
              var field = new Field("Path", path, Field.Store.YES, Field.Index.NOT_ANALYZED);
              doc.Add(field);
    
              writer.AddDocument(doc);
            }
          }
        }
    
        private static void QueryIndex(Directory directory)
        {
          string userQueryString = @"folder1\lucene\";
    
          Analyzer analyzer = new WhitespaceAnalyzer();
          var queryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "Path", analyzer);
          queryParser.AllowLeadingWildcard = true;
    
          string queryString = "*" + userQueryString.Replace(@"\", @"\\");
    
          var query = queryParser.Parse(queryString);
    
          IndexSearcher searcher = new IndexSearcher(directory);
          IndexReader reader = searcher.IndexReader;
          TopDocs topDocs = searcher.Search(query, 100);
    
          foreach (ScoreDoc doc in topDocs.ScoreDocs)
          {
            string path = reader.Document(doc.Doc).Get("Path");
            Console.WriteLine(path);
          }
          Console.ReadKey();
        }
      }
    }
    

    【讨论】:

    • 更好的是,分析和查询路径的反向字符串(您仍然可以在单独的字段中存储和分析原始字符串,从而可以进行前缀查询),因此您不需要 AllowLeadingWildcard = true,即应该会大大加快搜索速度。
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2011-10-11
    • 2015-09-30
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多