文档中PhraseQuery匹配的数量

时间:2018-03-26 16:12:00

标签: lucene full-text-indexing

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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