public override Explanation Explain(IndexSearcher searcher, Explanation firstPassExplanation, int docID) { TopDocs oneHit = new TopDocs(1, new ScoreDoc[] { new ScoreDoc(docID, firstPassExplanation.Value) }); TopDocs hits = Rescore(searcher, oneHit, 1); Debug.Assert(hits.TotalHits == 1); // TODO: if we could ask the Sort to explain itself then // we wouldn't need the separate ExpressionRescorer... Explanation result = new Explanation(0.0f, "sort field values for sort=" + sort.ToString()); // Add first pass: Explanation first = new Explanation(firstPassExplanation.Value, "first pass score"); first.AddDetail(firstPassExplanation); result.AddDetail(first); FieldDoc fieldDoc = (FieldDoc)hits.ScoreDocs[0]; // Add sort values: SortField[] sortFields = sort.GetSort(); for (int i = 0; i < sortFields.Length; i++) { result.AddDetail(new Explanation(0.0f, "sort field " + sortFields[i].ToString() + " value=" + fieldDoc.Fields[i])); } return(result); }
/// <summary> /// Returns <c>true</c> if the given <paramref name="reader"/> is sorted by the specified <paramref name="sort"/>. /// </summary> public static bool IsSorted(AtomicReader reader, Sort sort) { if (reader is SegmentReader) { SegmentReader segReader = (SegmentReader)reader; IDictionary<string, string> diagnostics = segReader.SegmentInfo.Info.Diagnostics; var diagnosticsSort = diagnostics.ContainsKey(SORTER_ID_PROP) ? diagnostics[SORTER_ID_PROP] : null; if (diagnostics != null && sort.ToString().Equals(diagnosticsSort)) { return true; } } return false; }