我有一个由pdfbox api class LucenePDFDocument
生成的索引。由于索引仅包含文本内容,因此我希望有效地搜索此索引。
我将使用搜索字符串搜索“内容”字段,结果顺序必须从最相关到较不相关。下面给出的代码确实显示了包含搜索文本单词的文件,ex '你的国籍是什么',但结果中没有包含这个完整句子的文件。
我应该使用什么查询解析器和查询来搜索上述场景。
Query query = new MultiFieldQueryParser(Version.LUCENE_30, fields,
new StandardAnalyzer(Version.LUCENE_30))
.parse(searchString);
TopScoreDocCollector collector = TopScoreDocCollector.create(5,
false);
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
System.out.println("count " + hits.length);
for (ScoreDoc scoreDoc : hits) {
int docId = scoreDoc.doc;
Document d = searcher.doc(docId);
System.out.println(d.getField("path"));
}
答案 0 :(得分:1)
这不是关于程序化的部分,而是关于Lucene quesry syntax。要搜索整个短语,只需用双引号括起来,即不要搜索
What is your nationality
搜索
"What is your nationality"
没有引号Lucene会找到包含每个单独单词的所有文档,即“what”,“is”,“your”和“nationality”(“is”和“your”可能会省略为stop words)并排序它们按doc中的总发生次数计算,而不仅仅是在该短语中。由于您在TopScoreDocCollector
中将文档数量设置为仅查找为5,因此带有短语的文件可能不会出现在结果中。添加引号使Lucene忽略所有其他没有完全短语的文档。
此外,如果您只在“内容”字段中搜索,则无需MultiFieldQueryParser
,而是可以使用简单的QueryParser
。