我正在开发一个使用 Apache Lucene 进行文本文件搜索操作的项目。 下面的代码适用于单个单词。当搜索短语时,它会给出下面列出的结果:
短语:ABC DEF
结果
文件名 - 分数
搜索
public static void search(String keyword, String path) throws IOException, ParseException {
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(path)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("contents", analyzer);
queryParser.setDefaultOperator(QueryParser.Operator.AND);
Query query = queryParser.parse(keyword);
TopDocs hits = searcher.search(query, 1000);
ScoreDoc[] document = hits.scoreDocs;
System.out.println("Total no of hits for content: " + hits.totalHits);
for (int i = 0; i < document.length; i++) {
Document doc = searcher.doc(document[i].doc);
String filePath = doc.get("title");
System.out.println(filePath + " " + document[i].score);
}
}
从结果中可以看出,File4 不包含短语,但其得分高于包含短语的 File2。如何解决这个问题?
提前致谢。
file4 匹配的事实表明您不是在搜索短语“ABC DEF”,而是作为术语查询 ABC DEF(不带引号)。默认情况下,BM25 不考虑术语的邻近性。评分差异可能是由于文档的长度(例如:file4 可能比其他文档短)、术语频率或其他因素造成的。
使用带引号的短语查询“ABC DEF”,这样 file4 就不会被匹配。添加邻近运算符“~”以允许 ABC 和 DEF 之间有几个单词。
如果您认真对待基于邻近度的排名,您可能想探索与默认 BM25 不同的相似性模型。我不确定Lucene中是否有内置模型。