出于某种原因,我无法使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();
}
答案 0 :(得分:2)
问题在于文本分析。 StandardAnalyzer会降低索引中单词的大小写,但您的查询包含大写字母(Active
,User
)。
您需要将查询字词小写,或者理想情况下,将StandardAnalyzer应用于它们。我相信QueryParser可以帮助你(example)。
QueryParser不支持SpanNearQuery。如果需要SpanNearQuery,那么我认为你能做的最好就是自己分析每个术语。
更新 - QueryParser(PhraseQuery)与SpanNearQuery: QueryParser支持邻近查询,但灵活性不如SpanNearQuery。您可以将以下字符串作为查询传递给QueryParser:"active user"~3
。 QueryParser将它转换为一个slop为3的PhraseQuery(更不用说通过StandardAnalyzer运行查询)。 PhraseQuery有这些不同之处:
"active use*"~3
,""active user" statistics"~5
如果您需要在active
之前匹配user
作为示例推断(您将SpanNearQuery的inOrder设置为true),那么QueryParser / PhraseQuery可能适合您。 (我个人从未使用它,所以我不能说它的优点或缺点。)