简体   繁体   English

Lucene“结尾为”查询

[英]Lucene “Ends with” query

I am using lucene.net version 2.9.2.2 with .net4. 我正在将lucene.net版本2.9.2.2与.net4一起使用。 I am looking for "ends with" query along with path. 我正在寻找路径的“结尾”查询。 where it should not tokenize and return TRUE if it occurs in between. 如果它介于两者之间,则不应该标记化并返回TRUE。

Indexed paths: 索引路径:

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

Index Code: 索引代码:

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);

Search Code: 搜索代码:

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

search query: folder1\\lucene\\ 搜索查询: folder1\\lucene\\

expected result: 预期结果:

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

How to get above result. 如何获得以上结果。 I have seen many questions on SO regarding same. 我已经看到很多关于SO的问题。 but none contains piece of working code. 但没有一个包含工作代码。

Here is a sample program that gives the output you are looking for. 这是一个示例程序,提供您要查找的输出。

Things to note: 注意事项:

  • The QueryParser by default does not allow a leading wildcard (for performance-reasons). 默认情况下,QueryParser不允许使用通配符(出于性能原因)。
  • The field 'Path' is not analyzed, so the analyzer passed to the IndexWriter is not used. 不分析“路径”字段,因此不使用传递给IndexWriter的分析器。
  • The StandardAnalyzer strips backslashes, so the program uses a WhitespaceAnalyzer which leaves them intact. StandardAnalyzer会去除反斜杠,因此程序使用WhitespaceAnalyzer使其保持完整。
  • Backslashes needs to be escaped when passing them to QueryParser. 将反斜杠传递给QueryParser时需要转义。

Hope this helps you. 希望这对您有所帮助。

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();
    }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM