/// <summary> /// Expert: low-level implementation method /// Returns an <see cref="Explanation"/> that describes how <paramref name="doc"/> scored against /// <paramref name="weight"/>. /// /// <para/>This is intended to be used in developing <see cref="Similarities.Similarity"/> implementations, /// and, for good performance, should not be displayed with every hit. /// Computing an explanation is as expensive as executing the query over the /// entire index. /// <para/>Applications should call <see cref="IndexSearcher.Explain(Query, int)"/>. </summary> /// <exception cref="BooleanQuery.TooManyClausesException"> If a query would exceed /// <see cref="BooleanQuery.MaxClauseCount"/> clauses. </exception> protected virtual Explanation Explain(Weight weight, int doc) { int n = ReaderUtil.SubIndex(doc, m_leafContexts); AtomicReaderContext ctx = m_leafContexts[n]; int deBasedDoc = doc - ctx.DocBase; return(weight.Explain(ctx, deBasedDoc)); }
public override Explanation Explain(AtomicReaderContext ir, int i) { Explanation inner = weight.Explain(ir, i); Filter f = outerInstance.filter; DocIdSet docIdSet = f.GetDocIdSet(ir, ir.AtomicReader.LiveDocs); DocIdSetIterator docIdSetIterator = docIdSet == null?DocIdSetIterator.GetEmpty() : docIdSet.GetIterator(); if (docIdSetIterator == null) { docIdSetIterator = DocIdSetIterator.GetEmpty(); } if (docIdSetIterator.Advance(i) == i) { return(inner); } else { Explanation result = new Explanation(0.0f, "failure to match filter: " + f.ToString()); result.AddDetail(inner); return(result); } }