0

出于某种原因,我无法让 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();

}
4

1 回答 1

2

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

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

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

更新 - QueryParser (PhraseQuery) 与 SpanNearQuery: QueryParser 确实支持邻近查询,但没有 SpanNearQuery 那么多的灵活性。您可以将以下字符串作为查询传递给 QueryParser: "active user"~3。QueryParser 会将其转换为斜率为 3 的 PhraseQuery(更不用说通过 StandardAnalyzer 运行查询)。PhraseQuery 有以下区别:

  • PhraseQuery按顺序匹配术语——您的查询将匹配“活跃的 xx 用户”但不匹配“活跃的用户 xx”。
  • PhraseQuery不支持通配符或子短语。例如,以下查询对 QueryParser 无效,但您可以使用 SpanNearQuery 实现它们的等价物:"active use*"~3""active user" statistics"~5
  • 有一些得分差异。我还记得当坡度非常低但我在网上找不到任何关于它的信息时,距离计算的细微差别。

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

于 2013-08-03T11:36:03.000 回答