explain score: fix explanation streaming
Complex explanations were always read as Explanations. Depending on if the response was streamed or not the explanation was therefore generated by a ComplexExplanation or by a regular Explanation. closes #7257
This commit is contained in:
parent
92ae3c84fe
commit
a92300c5b5
|
@ -440,9 +440,17 @@ public class Lucene {
|
|||
}
|
||||
|
||||
public static Explanation readExplanation(StreamInput in) throws IOException {
|
||||
float value = in.readFloat();
|
||||
String description = in.readString();
|
||||
Explanation explanation = new Explanation(value, description);
|
||||
Explanation explanation;
|
||||
if (in.getVersion().onOrAfter(org.elasticsearch.Version.V_1_4_0) && in.readBoolean()) {
|
||||
Boolean match = in.readOptionalBoolean();
|
||||
explanation = new ComplexExplanation();
|
||||
((ComplexExplanation) explanation).setMatch(match);
|
||||
|
||||
} else {
|
||||
explanation = new Explanation();
|
||||
}
|
||||
explanation.setValue(in.readFloat());
|
||||
explanation.setDescription(in.readString());
|
||||
if (in.readBoolean()) {
|
||||
int size = in.readVInt();
|
||||
for (int i = 0; i < size; i++) {
|
||||
|
@ -453,6 +461,15 @@ public class Lucene {
|
|||
}
|
||||
|
||||
public static void writeExplanation(StreamOutput out, Explanation explanation) throws IOException {
|
||||
|
||||
if (out.getVersion().onOrAfter(org.elasticsearch.Version.V_1_4_0)) {
|
||||
if (explanation instanceof ComplexExplanation) {
|
||||
out.writeBoolean(true);
|
||||
out.writeOptionalBoolean(((ComplexExplanation) explanation).getMatch());
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
}
|
||||
out.writeFloat(explanation.getValue());
|
||||
out.writeString(explanation.getDescription());
|
||||
Explanation[] subExplanations = explanation.getDetails();
|
||||
|
|
|
@ -19,8 +19,13 @@
|
|||
|
||||
package org.elasticsearch.explain;
|
||||
|
||||
import org.apache.lucene.search.ComplexExplanation;
|
||||
import org.apache.lucene.search.Explanation;
|
||||
import org.elasticsearch.action.admin.indices.alias.Alias;
|
||||
import org.elasticsearch.action.explain.ExplainResponse;
|
||||
import org.elasticsearch.common.io.stream.InputStreamStreamInput;
|
||||
import org.elasticsearch.common.io.stream.OutputStreamStreamOutput;
|
||||
import org.elasticsearch.common.lucene.Lucene;
|
||||
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||
import org.elasticsearch.index.query.FilterBuilders;
|
||||
import org.elasticsearch.index.query.QueryBuilders;
|
||||
|
@ -30,6 +35,8 @@ import org.joda.time.DateTimeZone;
|
|||
import org.joda.time.format.ISODateTimeFormat;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
||||
|
@ -256,8 +263,43 @@ public class ExplainActionTests extends ElasticsearchIntegrationTest {
|
|||
assertThat(explainResponse.isExists(), equalTo(true));
|
||||
assertThat(explainResponse.isMatch(), equalTo(true));
|
||||
}
|
||||
|
||||
|
||||
private static String indexOrAlias() {
|
||||
return randomBoolean() ? "test" : "alias";
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void streamExplainTest() throws Exception {
|
||||
|
||||
Explanation exp = new Explanation((float) 2.0, "some explanation");
|
||||
|
||||
// write
|
||||
ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();
|
||||
OutputStreamStreamOutput out = new OutputStreamStreamOutput(outBuffer);
|
||||
Lucene.writeExplanation(out, exp);
|
||||
|
||||
// read
|
||||
ByteArrayInputStream esInBuffer = new ByteArrayInputStream(outBuffer.toByteArray());
|
||||
InputStreamStreamInput esBuffer = new InputStreamStreamInput(esInBuffer);
|
||||
|
||||
Explanation result = Lucene.readExplanation(esBuffer);
|
||||
assertThat(exp.toString(),equalTo(result.toString()));
|
||||
|
||||
exp = new ComplexExplanation(true, 2.0f, "some explanation");
|
||||
exp.addDetail(new Explanation(2.0f,"another explanation"));
|
||||
|
||||
// write complex
|
||||
outBuffer = new ByteArrayOutputStream();
|
||||
out = new OutputStreamStreamOutput(outBuffer);
|
||||
Lucene.writeExplanation(out, exp);
|
||||
|
||||
// read complex
|
||||
esInBuffer = new ByteArrayInputStream(outBuffer.toByteArray());
|
||||
esBuffer = new InputStreamStreamInput(esInBuffer);
|
||||
|
||||
result = Lucene.readExplanation(esBuffer);
|
||||
assertThat(exp.toString(),equalTo(result.toString()));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue