代码之家  ›  专栏  ›  技术社区  ›  Alex Torrisi

文档中短语查询匹配数

  •  0
  • Alex Torrisi  · 技术社区  · 7 年前

    这是我使用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);
            }
    

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   vahid    7 年前

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

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

    方法B。 一种更系统的方法是 解释() 函数执行。要计算短语频率, 解释() 构建 scorer 用于短语查询和调用的 freq() 在上面。用于执行此操作的大多数方法/类都是私有/受保护的,因此我不确定您是否真的可以使用它们。但是,查看 解释() 在里面 PhraseWeight 内部类别 PhraseQuery ExactPhraseScorer 班(其中一些类不是公共的,您应该下载源代码才能看到它们)。