C# 查询不起作用

C# 查询不起作用,c#,lucene,lucene.net,C#,Lucene,Lucene.net,由于某种原因,我无法使span查询工作。在过去的3个小时里,我一直在尝试调试,但都没有成功。有人能告诉我我在做什么蠢事吗?以下是我迄今为止的尝试: public static void Test2() { Directory directory = FSDirectory.Open(new DirectoryInfo(Environment.CurrentDirectory + "\\LuceneIndex")); Analyzer analyzer = new Standard

由于某种原因,我无法使span查询工作。在过去的3个小时里,我一直在尝试调试,但都没有成功。有人能告诉我我在做什么蠢事吗?以下是我迄今为止的尝试:

public static void Test2()
{
    Directory directory = FSDirectory.Open(new DirectoryInfo(Environment.CurrentDirectory + "\\LuceneIndex"));
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
    var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);

    var article = new Document();
    article.Add(new Field("Id", "TEST-111111", Field.Store.YES, Field.Index.ANALYZED));
    article.Add(new Field("ArticleText", "How should I gather Active User statistics from the log file? There is somewhat more information available on Google.", Field.Store.YES, Field.Index.ANALYZED));

    writer.AddDocument(article);

    writer.Optimize();
    writer.Close();

    IndexReader indexReader = IndexReader.Open(directory, true);
    Searcher indexSearch = new IndexSearcher(indexReader);

    SpanNearQuery qq = new SpanNearQuery(new SpanQuery[] { new SpanTermQuery(new Term("ArticleText", "Active")), new SpanTermQuery(new Term("ArticleText", "User")) }, 3, true);

    Console.WriteLine(qq.ToString());

    TopDocs resultDocs = indexSearch.Search(qq, indexReader.MaxDoc());

    Console.WriteLine("Results Found: " + resultDocs.totalHits); // Gives me zero

    indexSearch.Close();
    directory.Close();

    Console.Read();

}

问题在于文本分析。StandardAnalyzer将索引中的单词小写,但您的查询包含大写字母(
Active
User

您需要将查询条件的大小写降低,或者在理想情况下对其应用StandardAnalyzer。我相信我能在那里帮助你

QueryParser不支持SpanarQuery。如果需要查询,那么我认为您最好自己分析每个术语

更新-QueryParser(短语查询)与SpanarQuery:QueryParser确实支持邻近查询,但没有SpanarQuery那么灵活。将以下字符串作为查询传递给QueryParser:
“活动用户”~3
。QueryParser将其转换为slop为3的短语查询(更不用说通过StandardAnalyzer运行查询)。短语查询有以下区别:

  • 短语查询按顺序匹配术语——您的查询将匹配“活动xx用户”,但不匹配“用户xx活动”
  • 短语查询不支持通配符或子短语。例如,以下查询对QueryParser无效,但您可以使用SpanarQuery实现其等效查询:
    “活动用户*”~3
    “活动用户”统计信息”~5
  • 有一些。我还记得,当坡度很低时,距离计算有一点不同,但我在网上找不到任何关于它的信息

如果您需要在
user
之前匹配
active
(您将扳手查询的顺序设置为true),则QueryParser/PhraseQuery可能适合您。(我个人从未使用过它,所以我无法说出它的优点或缺点。)

+1非常感谢。实际上我也在和QueryParser玩。您介意告诉我使用QueryParser(而不是说使用SpanarQuery)对性能的影响吗?QueryParser似乎很容易使用,所以一定有一些我不知道的地方。也许解析需要时间,但要构造一个扳手查询,我仍然需要对输入短语进行相同的分析,不是吗?很高兴能提供帮助。查看我的更新,了解更多关于QueryParser与SpanarQuery的信息。