文档中的短语数量匹配



这是我使用lucene执行短语的代码。虽然很清楚如何在索引中获得每个文档的分数匹配,但我并不了解如何提取单个文档的匹配总数。以下是我执行查询的代码:

        PhraseQuery.Builder builder = new PhraseQuery.Builder();
        builder.add(new Term("contents", "word1"), 0);
        builder.add(new Term("contents", "word2"), 1);
        builder.add(new Term("contents", "word3"), 2);
        builder.setSlop(3);
        PhraseQuery pq = builder.build();
        int hitsPerPage = 10;
        IndexReader reader = DirectoryReader.open(index);
        IndexSearcher searcher = new IndexSearcher(reader);
        TopDocs docs = searcher.search(pq, hitsPerPage);
        ScoreDoc[] hits = docs.scoreDocs;
        System.out.println("Found " + hits.length + " hits.");
        for(int i=0;i<hits.length;++i)
        {
            int docId = hits[i].doc;
            Document d = searcher.doc(docId);
            System.out.println(docId + " " + hits[i].score);
        }

是否有一种方法可以提取每个文档而不是分数的匹配总数?

方法A。这可能不是最好的方法,但它将为您提供快速的见解。您可以使用explain()类的CC_1函数,该函数将返回文档中包含大量信息和短语频率的字符串。在您的循环中添加此代码:

System.out.println(searcher.explain(pq, searcher.doc(docId)));

方法b。更系统的方法是做与explain()函数相同的事情。为了计算短语频率,explain()为短语查询构建scorer对象,并在其上调用freq()。用于执行此操作的大多数方法/类都是私人/受保护的,因此我不确定您是否可以真正使用它们。但是,在PhraseQueryExactPhraseScorer类中查看explain()类中的CC_7代码可能会有所帮助。(其中一些类并非公开,您应该下载源代码以查看它们(。

最新更新