Apache Lucene 在文件中搜索短语

问题描述 投票:0回答:1

我正在开发一个使用 Apache Lucene 进行文本文件搜索操作的项目。 下面的代码适用于单个单词。当搜索短语时,它会给出下面列出的结果:

短语:ABC DEF

  • 文件1:包含“ABC DEF”作为短语
  • 文件2:包含“ABC DEF”作为短语
  • File3:包含 ABC 和 DEF 作为不同位置的单独单词
  • File4:包含 ABC 和 DEF 作为不同位置的单独单词
  • 文件5:包含ABC
  • 文件6:包含DEF

结果

文件名 - 分数

  • 文件1 1.3502092
  • 文件4 1.0447767
  • 文件2 1.0047288
  • 文件3 0.97969353

搜索

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。如何解决这个问题?

提前致谢。

java lucene full-text-search
1个回答
0
投票

file4 匹配的事实表明您不是在搜索短语“ABC DEF”,而是作为术语查询 ABC DEF(不带引号)。默认情况下,BM25 不考虑术语的邻近性。评分差异可能是由于文档的长度(例如:file4 可能比其他文档短)、术语频率或其他因素造成的。

使用带引号的短语查询“ABC DEF”,这样 file4 就不会被匹配。添加邻近运算符“~”以允许 ABC 和 DEF 之间有几个单词。

如果您认真对待基于邻近度的排名,您可能想探索与默认 BM25 不同的相似性模型。我不确定Lucene中是否有内置模型。

© www.soinside.com 2019 - 2024. All rights reserved.