文档中的 PhraseQuery 匹配数
Number of PhraseQuery matches in a document
这是我使用 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);
}
有没有一种方法可以提取每个文档的匹配总数而不是分数?
方法 A。 这可能不是最好的方法,但它会让您快速了解。您可以使用 IndexSearcher
class 的 explain()
函数,它将 return 一个包含文档中大量信息和短语频率的字符串。在您的 for 循环中添加此代码:
System.out.println(searcher.explain(pq, searcher.doc(docId)));
方法 B. 一种更系统的方法是执行与 explain()
函数相同的操作。为了计算短语频率,explain()
为短语查询构建了一个 scorer
对象并对其调用了 freq()
。大多数用来做这个的 methods/classes 都是 private/protected 所以我不确定你是否真的可以使用它们。然而,查看 explain()
in PhraseWeight
class inside PhraseQuery
and ExactPhraseScorer
class 的代码可能会有所帮助。 (其中一些 class 不是 public,您应该下载源代码才能看到它们)。
这是我使用 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);
}
有没有一种方法可以提取每个文档的匹配总数而不是分数?
方法 A。 这可能不是最好的方法,但它会让您快速了解。您可以使用 IndexSearcher
class 的 explain()
函数,它将 return 一个包含文档中大量信息和短语频率的字符串。在您的 for 循环中添加此代码:
System.out.println(searcher.explain(pq, searcher.doc(docId)));
方法 B. 一种更系统的方法是执行与 explain()
函数相同的操作。为了计算短语频率,explain()
为短语查询构建了一个 scorer
对象并对其调用了 freq()
。大多数用来做这个的 methods/classes 都是 private/protected 所以我不确定你是否真的可以使用它们。然而,查看 explain()
in PhraseWeight
class inside PhraseQuery
and ExactPhraseScorer
class 的代码可能会有所帮助。 (其中一些 class 不是 public,您应该下载源代码才能看到它们)。