mirror of https://github.com/apache/lucene.git
`ToParentBlockJoinQuery` Explain Support Score Mode (#12245)
* `ToParentBlockJoinQuery` Explain Support Score Mode --------- Co-authored-by: Mikhail Khludnev <mkhl@apache.org>
This commit is contained in:
parent
dcbf7523a1
commit
963ed7ce88
|
@ -118,7 +118,8 @@ New Features
|
||||||
|
|
||||||
Improvements
|
Improvements
|
||||||
---------------------
|
---------------------
|
||||||
(No changes)
|
|
||||||
|
GITHUB#12245: Add support for Score Mode to `ToParentBlockJoinQuery` explain. (Marcus Eagan via Mikhail Khludnev)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
---------------------
|
---------------------
|
||||||
|
|
|
@ -172,7 +172,7 @@ public class ToParentBlockJoinQuery extends Query {
|
||||||
public Explanation explain(LeafReaderContext context, int doc) throws IOException {
|
public Explanation explain(LeafReaderContext context, int doc) throws IOException {
|
||||||
BlockJoinScorer scorer = (BlockJoinScorer) scorer(context);
|
BlockJoinScorer scorer = (BlockJoinScorer) scorer(context);
|
||||||
if (scorer != null && scorer.iterator().advance(doc) == doc) {
|
if (scorer != null && scorer.iterator().advance(doc) == doc) {
|
||||||
return scorer.explain(context, in);
|
return scorer.explain(context, in, scoreMode);
|
||||||
}
|
}
|
||||||
return Explanation.noMatch("Not a match");
|
return Explanation.noMatch("Not a match");
|
||||||
}
|
}
|
||||||
|
@ -391,35 +391,51 @@ public class ToParentBlockJoinQuery extends Query {
|
||||||
}
|
}
|
||||||
this.score = (float) score;
|
this.score = (float) score;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
public Explanation explain(LeafReaderContext context, Weight childWeight) throws IOException {
|
* This instance of Explanation requires three parameters, context, childWeight, and scoreMode.
|
||||||
|
* The scoreMode parameter considers Avg, Total, Min, Max, and None.
|
||||||
|
* */
|
||||||
|
public Explanation explain(LeafReaderContext context, Weight childWeight, ScoreMode scoreMode)
|
||||||
|
throws IOException {
|
||||||
int prevParentDoc = parentBits.prevSetBit(parentApproximation.docID() - 1);
|
int prevParentDoc = parentBits.prevSetBit(parentApproximation.docID() - 1);
|
||||||
int start =
|
int start =
|
||||||
context.docBase + prevParentDoc + 1; // +1 b/c prevParentDoc is previous parent doc
|
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
|
int end = context.docBase + parentApproximation.docID() - 1; // -1 b/c parentDoc is parent doc
|
||||||
|
|
||||||
Explanation bestChild = null;
|
Explanation bestChild = null;
|
||||||
|
Explanation worstChild = null;
|
||||||
|
|
||||||
int matches = 0;
|
int matches = 0;
|
||||||
for (int childDoc = start; childDoc <= end; childDoc++) {
|
for (int childDoc = start; childDoc <= end; childDoc++) {
|
||||||
Explanation child = childWeight.explain(context, childDoc - context.docBase);
|
Explanation child = childWeight.explain(context, childDoc - context.docBase);
|
||||||
if (child.isMatch()) {
|
if (child.isMatch()) {
|
||||||
matches++;
|
matches++;
|
||||||
if (bestChild == null
|
if (bestChild == null
|
||||||
|| child.getValue().floatValue() > bestChild.getValue().floatValue()) {
|
|| child.getValue().doubleValue() > bestChild.getValue().doubleValue()) {
|
||||||
bestChild = child;
|
bestChild = child;
|
||||||
}
|
}
|
||||||
|
if (worstChild == null
|
||||||
|
|| child.getValue().doubleValue() < worstChild.getValue().doubleValue()) {
|
||||||
|
worstChild = child;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
assert matches > 0 : "No matches should be handled before.";
|
||||||
|
Explanation subExplain = scoreMode == ScoreMode.Min ? worstChild : bestChild;
|
||||||
return Explanation.match(
|
return Explanation.match(
|
||||||
score(),
|
this.score(),
|
||||||
String.format(
|
formatScoreExplanation(matches, start, end, scoreMode),
|
||||||
Locale.ROOT,
|
subExplain == null ? Collections.emptyList() : Collections.singleton(subExplain));
|
||||||
"Score based on %d child docs in range from %d to %d, best match:",
|
}
|
||||||
matches,
|
|
||||||
start,
|
private String formatScoreExplanation(int matches, int start, int end, ScoreMode scoreMode) {
|
||||||
end),
|
return String.format(
|
||||||
bestChild);
|
Locale.ROOT,
|
||||||
|
"Score based on %d child docs in range from %d to %d, using score mode %s",
|
||||||
|
matches,
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
scoreMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -277,7 +277,6 @@ public class TestBlockJoin extends LuceneTestCase {
|
||||||
CheckHits.checkHitCollector(random(), fullQuery.build(), "country", s, new int[] {2});
|
CheckHits.checkHitCollector(random(), fullQuery.build(), "country", s, new int[] {2});
|
||||||
|
|
||||||
TopDocs topDocs = s.search(fullQuery.build(), 1);
|
TopDocs topDocs = s.search(fullQuery.build(), 1);
|
||||||
|
|
||||||
// assertEquals(1, results.totalHitCount);
|
// assertEquals(1, results.totalHitCount);
|
||||||
assertEquals(1, topDocs.totalHits.value);
|
assertEquals(1, topDocs.totalHits.value);
|
||||||
Document parentDoc = s.storedFields().document(topDocs.scoreDocs[0].doc);
|
Document parentDoc = s.storedFields().document(topDocs.scoreDocs[0].doc);
|
||||||
|
@ -890,13 +889,11 @@ public class TestBlockJoin extends LuceneTestCase {
|
||||||
Explanation explanation = joinS.explain(childJoinQuery, hit.doc);
|
Explanation explanation = joinS.explain(childJoinQuery, hit.doc);
|
||||||
Document document = joinS.storedFields().document(hit.doc - 1);
|
Document document = joinS.storedFields().document(hit.doc - 1);
|
||||||
int childId = Integer.parseInt(document.get("childID"));
|
int childId = Integer.parseInt(document.get("childID"));
|
||||||
// System.out.println(" hit docID=" + hit.doc + " childId=" + childId + " parentId=" +
|
|
||||||
// document.get("parentID"));
|
|
||||||
assertTrue(explanation.isMatch());
|
assertTrue(explanation.isMatch());
|
||||||
assertEquals(hit.score, explanation.getValue().doubleValue(), 0.0f);
|
assertEquals(hit.score, explanation.getValue().doubleValue(), 0.0f);
|
||||||
Matcher m =
|
Matcher m =
|
||||||
Pattern.compile(
|
Pattern.compile(
|
||||||
"Score based on ([0-9]+) child docs in range from ([0-9]+) to ([0-9]+), best match:")
|
"Score based on ([0-9]+) child docs in range from ([0-9]+) to ([0-9]+), using score mode (None|Avg|Min|Max|Total)")
|
||||||
.matcher(explanation.getDescription());
|
.matcher(explanation.getDescription());
|
||||||
assertTrue("Block Join description not matches", m.matches());
|
assertTrue("Block Join description not matches", m.matches());
|
||||||
assertTrue("Matched children not positive", Integer.parseInt(m.group(1)) > 0);
|
assertTrue("Matched children not positive", Integer.parseInt(m.group(1)) > 0);
|
||||||
|
|
Loading…
Reference in New Issue