下面列出了org.apache.lucene.search.Weight#explain ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public Explanation explain(LeafReaderContext context, Weight childWeight) throws IOException {
int prevParentDoc = parentBits.prevSetBit(parentApproximation.docID() - 1);
int start = context.docBase + prevParentDoc + 1; // +1 b/c prevParentDoc is previous parent doc
int end = context.docBase + parentApproximation.docID() - 1; // -1 b/c parentDoc is parent doc
Explanation bestChild = null;
int matches = 0;
for (int childDoc = start; childDoc <= end; childDoc++) {
Explanation child = childWeight.explain(context, childDoc - context.docBase);
if (child.isMatch()) {
matches++;
if (bestChild == null || child.getValue().floatValue() > bestChild.getValue().floatValue()) {
bestChild = child;
}
}
}
return Explanation.match(score(), String.format(Locale.ROOT,
"Score based on %d child docs in range from %d to %d, best match:", matches, start, end), bestChild
);
}
@Override
public Explanation explain(IndexSearcher searcher,
Explanation firstPassExplanation, int docID) throws IOException {
final List<LeafReaderContext> leafContexts = searcher.getTopReaderContext()
.leaves();
final int n = ReaderUtil.subIndex(docID, leafContexts);
final LeafReaderContext context = leafContexts.get(n);
final int deBasedDoc = docID - context.docBase;
final Weight modelWeight = searcher.createWeight(searcher.rewrite(scoringQuery),
ScoreMode.COMPLETE, 1);
return modelWeight.explain(context, deBasedDoc);
}
@Test
public void testThatQueryUsesTermButNoFieldBoost() throws Exception {
Analyzer analyzer = new StandardAnalyzer();
Directory directory = new ByteBuffersDirectory();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setSimilarity(new ClassicSimilarity());
IndexWriter indexWriter = new IndexWriter(directory, config);
TestUtil.addNumDocsWithTextField("f1", "v1 v1", indexWriter, 4);
TestUtil.addNumDocsWithTextField("f1", "v2", indexWriter, 1);
indexWriter.close();
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
indexSearcher.setSimilarity(new ClassicSimilarity());
final TermQuery termQuery = new LuceneTermQueryBuilder()
.createTermQuery(new Term("f1", "v1"), new ConstantFieldBoost(3f));
final Term term = termQuery.getTerm();
assertEquals("f1", term.field());
assertEquals("v1", term.text());
TopDocs topDocs = indexSearcher.search(termQuery, 10);
final Weight weight = termQuery.createWeight(indexSearcher, ScoreMode.COMPLETE, 4.5f);
final Explanation explain = weight.explain(indexReader.getContext().leaves().get(0), topDocs.scoreDocs[0].doc);
String explainText = explain.toString();
assertTrue(explainText.contains("4.5 = boost")); // 4.5 (query) but ignore field boost
assertTrue(explainText.contains("4 = docFreq")); // 4 * v1
assertTrue(explainText.contains("2.0 = freq")); // 2 * v1 in field
}
@Test
public void testCreateWeight() throws Exception {
Analyzer analyzer = new StandardAnalyzer();
Directory directory = new ByteBuffersDirectory();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setSimilarity(new ClassicSimilarity());
IndexWriter indexWriter = new IndexWriter(directory, config);
TestUtil.addNumDocsWithTextField("f1", "v1", indexWriter, 4);
TestUtil.addNumDocsWithTextField("f2", "v1 v1", indexWriter, 1);
indexWriter.close();
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
indexSearcher.setSimilarity(new ClassicSimilarity());
DocumentFrequencyCorrection dfc = new DocumentFrequencyCorrection();
Term qTerm1 = new Term("f1", "v1");
Term qTerm2 = new Term("f2", "v1");
dfc.newClause();
dfc.prepareTerm(qTerm1);
dfc.prepareTerm(qTerm2);
dfc.finishedUserQuery();
DependentTermQueryBuilder.DependentTermQuery query1 = new DependentTermQueryBuilder(dfc)
.createTermQuery(qTerm1, fieldBoost1);
DependentTermQueryBuilder.DependentTermQuery query2 = new DependentTermQueryBuilder(dfc)
.createTermQuery(qTerm2, fieldBoost2);
TopDocs topDocs = indexSearcher.search(query2, 10);
final Weight weight2 = query2.createWeight(indexSearcher, ScoreMode.COMPLETE, 4.5f);
final Explanation explain = weight2.explain(indexReader.leaves().get(0), topDocs.scoreDocs[0].doc);
String explainText = explain.toString();
assertTrue(explainText.contains("9.0 = boost")); // 4.5 (query) * 2.0 (field)
assertTrue(explainText.contains("4 = docFreq")); // 4 * df of f1:v1
assertTrue(explainText.contains("2.0 = freq")); // don't use tf
indexReader.close();
directory.close();
analyzer.close();
}
@Test
public void testCreateWeight() throws Exception {
Analyzer analyzer = new KeywordAnalyzer();
Directory directory = newDirectory();
RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory, analyzer);
TestUtil.addNumDocsWithStringField("f1", "v1", indexWriter, 4);
TestUtil.addNumDocsWithStringField("f1", "v2", indexWriter, 1);
indexWriter.close();
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = newSearcher(indexReader);
indexSearcher.setSimilarity(new ClassicSimilarity());
Term term = new Term("f1", "v1");
FieldBoostTermQueryBuilder.FieldBoostTermQuery query = new FieldBoostTermQueryBuilder().createTermQuery(term, fieldBoost2);
TopDocs topDocs = indexSearcher.search(query, 10);
final Weight weight = query.createWeight(indexSearcher, ScoreMode.COMPLETE, 4.5f);
final Explanation explain = weight.explain(indexReader.getContext().leaves().get(0), topDocs.scoreDocs[0].doc);
String explainText = explain.toString();
assertTrue(explainText.contains("4.5 = queryBoost")); // 4.5 (query)
assertTrue(explainText.contains("2.0 = fieldBoost")); // 2.0 (field)
assertTrue(explainText.contains("ConstantFieldBoost(f1^2.0)")); // 2.0 (field)
assertFalse(explainText.toLowerCase().contains("freq")); // no doc freq
indexReader.close();
directory.close();
analyzer.close();
}
@Test
public void testCreateWeight() throws Exception {
Analyzer analyzer = new StandardAnalyzer();
Directory directory = new ByteBuffersDirectory();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setSimilarity(new ClassicSimilarity());
IndexWriter indexWriter = new IndexWriter(directory, config);
TestUtil.addNumDocsWithTextField("f1", "v1 v1", indexWriter, 4);
TestUtil.addNumDocsWithTextField("f1", "v2", indexWriter, 1);
indexWriter.close();
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
indexSearcher.setSimilarity(new ClassicSimilarity());
Term term = new Term("f1", "v1");
SimilarityTermQuery query = new SimilarityTermQueryBuilder().createTermQuery(term, fieldBoost2);
TopDocs topDocs = indexSearcher.search(query, 10);
final Weight weight = query.createWeight(indexSearcher, ScoreMode.COMPLETE, 4.5f);
final Explanation explain = weight.explain(indexReader.getContext().leaves().get(0), topDocs.scoreDocs[0].doc);
String explainText = explain.toString();
assertTrue(explainText.contains("9.0 = boost")); // 4.5 (query) * 2.0 (field)
assertTrue(explainText.contains("4 = docFreq")); // 4 * v1
assertTrue(explainText.contains("2.0 = freq")); // 2 * v1 in field
indexReader.close();
directory.close();
analyzer.close();
}