最近,这使我感到困惑,而且我似乎在任何地方都找不到合适的解释。
如果我运行使用Query API构建的查询,则效果很好。
TermQuery sourceQuery = new TermQuery(new Term("source", "CNN"));
运行
results = searcher.search(sourceQuery, 30)
并检查results.totalHits
会显示值159。但是,在同一程序中,我设置了
QueryParser
(我的默认字段称为text
):Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
QueryParser parser = new QueryParser(Version.LUCENE_35,
"text", analyzer);
并输入命令行查询
source:CNN
我没有结果。在Luke上运行此命令确实可以得到结果。有人知道发生了什么吗?
最佳答案
您可能为QueryParser对象使用了错误的分析器。注意:
当您构建自己的Term对象时,该术语的文本为大写。
您将StandardAnalyzer提供给QueryParser,因此该术语的文本将转换为小写字母(通过StandardAnalyzer)。
Luke的默认分析器是KeywordAnalyzer,它保留您在其中指定术语的大小写(即大写)。
我猜您为文本编入索引时,您的术语是大写的(或变成大写的)。这就解释了为什么方法1和3有效,而方法2无效的原因是案例不匹配。通常,use the same Analyzer when indexing and when searching是个好主意,或者至少要注意大小写。
关于java - Lucene 3.5.0 QueryParser在以编程方式生成的查询中找不到任何结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10032824/