Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lucene 文档中短语查询匹配项的数目_Lucene_Full Text Indexing - Fatal编程技术网

Lucene 文档中短语查询匹配项的数目

Lucene 文档中短语查询匹配项的数目,lucene,full-text-indexing,Lucene,Full Text Indexing,这是我使用Lucene执行短语查询的代码。虽然很清楚如何为索引中的每个文档获取分数匹配,但我不理解如何提取单个文档的匹配总数。 以下是我执行查询的代码: PhraseQuery.Builder builder = new PhraseQuery.Builder(); builder.add(new Term("contents", "word1"), 0); builder.add(new Term("contents", "word2"), 1

这是我使用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。这可能不是最好的方法,但可以让您快速了解。您可以使用IndexSearcher类的explain函数,该函数将返回包含文档中大量信息和短语频率的字符串。在for循环中添加以下代码:

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

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

我首先尝试了方法A,并从explain函数中提取了phraseFreq=0.33333334。我希望匹配总数为int。它由slop的值规范化。例如,假设您的文档是X Y Z,并且您将slop设置为2。那么查询xy的短语freq将是1,但查询xz的短语freq将是1/2=0.5。