Lucene - 有效的文本搜索

时间:2011-01-17 11:54:36

标签: pdfbox lucene

我有一个由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"));
        }

1 个答案:

答案 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