SpanNearQuery不起作用

时间:2013-08-03 01:20:00

标签: c# lucene lucene.net

出于某种原因,我无法使SpanNearQuery工作。我已经尝试过最后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();

}

1 个答案:

答案 0 :(得分:2)

问题在于文本分析。 StandardAnalyzer会降低索引中单词的大小写,但您的查询包含大写字母(ActiveUser)。

您需要将查询字词小写,或者理想情况下,将StandardAnalyzer应用于它们。我相信QueryParser可以帮助你(example)。

QueryParser不支持SpanNearQuery。如果需要SpanNearQuery,那么我认为你能做的最好就是自己分析每个术语。

更新 - QueryParser(PhraseQuery)与SpanNearQuery: QueryParser支持邻近查询,但灵活性不如SpanNearQuery。您可以将以下字符串作为查询传递给QueryParser:"active user"~3。 QueryParser将它转换为一个slop为3的PhraseQuery(更不用说通过StandardAnalyzer运行查询)。 PhraseQuery有这些不同之处:

  • PhraseQuery 按顺序匹配条款 - 您的查询将与“有效xx用户”匹配,但不会与“用户xx有效”匹配。
  • PhraseQuery 不支持通配符或子短语。例如,以下查询对QueryParser无效,但您可以使用SpanNearQuery实现它们的等价物:"active use*"~3""active user" statistics"~5
  • 有一些 scoring differences 。我还记得当斜率非常低时,距离计算略有不同,但我在网上找不到任何关于它的信息。

如果您需要在active之前匹配user作为示例推断(您将SpanNearQuery的inOrder设置为true),那么QueryParser / PhraseQuery可能适合您。 (我个人从未使用它,所以我不能说它的优点或缺点。)