3

我有一个由 pdfbox api 类生成的索引LucenePDFDocument。由于索引仅包含文本内容,我希望有效地搜索此索引。

我将使用搜索字符串搜索“内容”字段,结果顺序必须从最相关到​​最不相关。下面给出的代码确实显示了包含搜索文本单词的文件,例如“您的国籍是什么”,但结果不包含包含完整句子的文件。

在上述场景中,我应该使用什么查询解析器和查询进行搜索。

      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"));
        }
4

1 回答 1

1

这不是关于编程部分,而是关于Lucene 查询语法。要搜索整个短语只需用双引号括起来,即代替搜索

What is your nationality

搜索

"What is your nationality"

不带引号 Lucene 查找每个单独单词的所有文档,即“what”、“is”、“your”和“nationality”(“is”和“your”可能被省略为停用词)并按出现的总次数对它们进行排序在 doc 中,不仅在那个短语中。由于您将要查找的文档数设置为 5 in TopScoreDocCollector,因此带有该短语的文件可能不会出现在结果中。添加引号会使 Lucene 忽略所有其他没有确切短语的文档。

此外,如果您仅在“内容”字段中搜索,则不需要MultiFieldQueryParser并且可以使用 simpleQueryParser代替。

于 2011-01-18T14:15:02.847 回答