Skip to content

Commit aaad9a1

Browse files
author
Christoph Büscher
committed
iter
1 parent 19a4254 commit aaad9a1

File tree

8 files changed

+36
-16
lines changed

8 files changed

+36
-16
lines changed

docs/reference/search/rank-eval.asciidoc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,10 @@ that shows potential errors of individual queries. The response has the followin
283283
}, [...]
284284
],
285285
"metric_details": { <6>
286-
"relevant_docs_retrieved": 6,
287-
"docs_retrieved": 10
286+
"precision" : {
287+
"relevant_docs_retrieved": 6,
288+
"docs_retrieved": 10
289+
}
288290
}
289291
},
290292
"my_query_id2" : { [...] }

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/DiscountedCumulativeGain.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ private static double computeDCG(List<Integer> ratings) {
164164
private static final ParseField K_FIELD = new ParseField("k");
165165
private static final ParseField NORMALIZE_FIELD = new ParseField("normalize");
166166
private static final ParseField UNKNOWN_DOC_RATING_FIELD = new ParseField("unknown_doc_rating");
167-
private static final ConstructingObjectParser<DiscountedCumulativeGain, Void> PARSER = new ConstructingObjectParser<>("dcg_at",
167+
private static final ConstructingObjectParser<DiscountedCumulativeGain, Void> PARSER = new ConstructingObjectParser<>("dcg_at", true,
168168
args -> {
169169
Boolean normalized = (Boolean) args[0];
170170
Integer optK = (Integer) args[2];

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/MeanReciprocalRank.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public XContentBuilder innerToXContent(XContentBuilder builder, Params params)
206206
return builder.field(FIRST_RELEVANT_RANK_FIELD.getPreferredName(), firstRelevantRank);
207207
}
208208

209-
private static final ConstructingObjectParser<Breakdown, Void> PARSER = new ConstructingObjectParser<>(NAME, args -> {
209+
private static final ConstructingObjectParser<Breakdown, Void> PARSER = new ConstructingObjectParser<>(NAME, true, args -> {
210210
return new Breakdown((Integer) args[0]);
211211
});
212212

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/PrecisionAtK.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ public XContentBuilder innerToXContent(XContentBuilder builder, Params params)
242242
return builder;
243243
}
244244

245-
private static final ConstructingObjectParser<Breakdown, Void> PARSER = new ConstructingObjectParser<>(NAME, args -> {
245+
private static final ConstructingObjectParser<Breakdown, Void> PARSER = new ConstructingObjectParser<>(NAME, true, args -> {
246246
return new Breakdown((Integer) args[0], (Integer) args[1]);
247247
});
248248

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/RatedSearchHit.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
2727
import org.elasticsearch.common.xcontent.ObjectParser.ValueType;
2828
import org.elasticsearch.common.xcontent.ToXContent;
29+
import org.elasticsearch.common.xcontent.ToXContentObject;
2930
import org.elasticsearch.common.xcontent.XContentBuilder;
3031
import org.elasticsearch.common.xcontent.XContentParser;
3132
import org.elasticsearch.search.SearchHit;
@@ -37,7 +38,7 @@
3738
/**
3839
* Combines a {@link SearchHit} with a document rating.
3940
*/
40-
public class RatedSearchHit implements Writeable, ToXContent {
41+
public class RatedSearchHit implements Writeable, ToXContentObject {
4142

4243
private final SearchHit searchHit;
4344
private final Optional<Integer> rating;
@@ -82,9 +83,8 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params par
8283
private static final ParseField HIT_FIELD = new ParseField("hit");
8384
private static final ParseField RATING_FIELD = new ParseField("rating");
8485
@SuppressWarnings("unchecked")
85-
private static final ConstructingObjectParser<RatedSearchHit, Void> PARSER = new ConstructingObjectParser<>("rated_hit",
86-
a -> new RatedSearchHit((SearchHit) a[0],
87-
(Optional<Integer>) a[1]));
86+
private static final ConstructingObjectParser<RatedSearchHit, Void> PARSER = new ConstructingObjectParser<>("rated_hit", true,
87+
a -> new RatedSearchHit((SearchHit) a[0], (Optional<Integer>) a[1]));
8888

8989
static {
9090
PARSER.declareObject(ConstructingObjectParser.constructorArg(), (p, c) -> SearchHit.fromXContent(p), HIT_FIELD);

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/EvalQueryQualityTests.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,12 @@
3333
import java.io.IOException;
3434
import java.util.ArrayList;
3535
import java.util.List;
36+
import java.util.function.Predicate;
3637

3738
import static org.elasticsearch.common.xcontent.XContentHelper.toXContent;
3839
import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken;
3940
import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashCode;
41+
import static org.elasticsearch.test.XContentTestUtils.insertRandomFields;
4042
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent;
4143

4244
public class EvalQueryQualityTests extends ESTestCase {
@@ -89,8 +91,14 @@ public void testXContentParsing() throws IOException {
8991
boolean humanReadable = randomBoolean();
9092
XContentType xContentType = randomFrom(XContentType.values());
9193
BytesReference originalBytes = toShuffledXContent(testItem, xContentType, ToXContent.EMPTY_PARAMS, humanReadable);
94+
// skip inserting random fields for:
95+
// - the root object, since we expect a particular queryId there in this test
96+
// - the `metric_details` section, which can potentially contain different namedXContent names
97+
// - everything under `hits` (we test lenient SearchHit parsing elsewhere)
98+
Predicate<String> pathsToExclude = path -> path.isEmpty() || path.endsWith("metric_details") || path.contains("hits");
99+
BytesReference withRandomFields = insertRandomFields(xContentType, originalBytes, pathsToExclude, random());
92100
EvalQueryQuality parsedItem;
93-
try (XContentParser parser = createParser(xContentType.xContent(), originalBytes)) {
101+
try (XContentParser parser = createParser(xContentType.xContent(), withRandomFields)) {
94102
ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation);
95103
ensureExpectedToken(XContentParser.Token.FIELD_NAME, parser.nextToken(), parser::getTokenLocation);
96104
String queryId = parser.currentName();

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RankEvalResponseTests.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,11 @@
5151
import java.util.List;
5252
import java.util.Map;
5353
import java.util.Optional;
54+
import java.util.function.Predicate;
5455

5556
import static java.util.Collections.singleton;
5657
import static org.elasticsearch.common.xcontent.XContentHelper.toXContent;
58+
import static org.elasticsearch.test.XContentTestUtils.insertRandomFields;
5759
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent;
5860
import static org.hamcrest.Matchers.instanceOf;
5961

@@ -114,8 +116,14 @@ public void testXContentParsing() throws IOException {
114116
boolean humanReadable = randomBoolean();
115117
XContentType xContentType = randomFrom(XContentType.values());
116118
BytesReference originalBytes = toShuffledXContent(testItem, xContentType, ToXContent.EMPTY_PARAMS, humanReadable);
119+
// skip inserting random fields for:
120+
// - the `details` section, which can contain arbitrary queryIds
121+
// - everything under `failures` (exceptions parsing is quiet lenient)
122+
// - everything under `hits` (we test lenient SearchHit parsing elsewhere)
123+
Predicate<String> pathsToExclude = path -> (path.endsWith("details") || path.contains("failures") || path.contains("hits"));
124+
BytesReference withRandomFields = insertRandomFields(xContentType, originalBytes, pathsToExclude, random());
117125
RankEvalResponse parsedItem;
118-
try (XContentParser parser = createParser(xContentType.xContent(), originalBytes)) {
126+
try (XContentParser parser = createParser(xContentType.xContent(), withRandomFields)) {
119127
parsedItem = RankEvalResponse.fromXContent(parser);
120128
assertNull(parser.nextToken());
121129
}

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RatedSearchHitTests.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@
1919

2020
package org.elasticsearch.index.rankeval;
2121

22+
import org.elasticsearch.common.bytes.BytesReference;
2223
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2324
import org.elasticsearch.common.text.Text;
2425
import org.elasticsearch.common.xcontent.ToXContent;
25-
import org.elasticsearch.common.xcontent.XContentBuilder;
26-
import org.elasticsearch.common.xcontent.XContentFactory;
2726
import org.elasticsearch.common.xcontent.XContentParser;
28-
import org.elasticsearch.common.xcontent.json.JsonXContent;
27+
import org.elasticsearch.common.xcontent.XContentType;
2928
import org.elasticsearch.search.SearchHit;
3029
import org.elasticsearch.test.ESTestCase;
3130

@@ -34,6 +33,7 @@
3433
import java.util.Optional;
3534

3635
import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashCode;
36+
import static org.elasticsearch.test.XContentTestUtils.insertRandomFields;
3737

3838
public class RatedSearchHitTests extends ESTestCase {
3939

@@ -73,8 +73,10 @@ public void testSerialization() throws IOException {
7373

7474
public void testXContentRoundtrip() throws IOException {
7575
RatedSearchHit testItem = randomRatedSearchHit();
76-
XContentBuilder shuffled = shuffleXContent(testItem.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS));
77-
try (XContentParser parser = createParser(JsonXContent.jsonXContent, shuffled.bytes())) {
76+
XContentType xContentType = randomFrom(XContentType.values());
77+
BytesReference originalBytes = toShuffledXContent(testItem, xContentType, ToXContent.EMPTY_PARAMS, randomBoolean());
78+
BytesReference withRandomFields = insertRandomFields(xContentType, originalBytes, null, random());
79+
try (XContentParser parser = createParser(xContentType.xContent(), withRandomFields)) {
7880
RatedSearchHit parsedItem = RatedSearchHit.parse(parser);
7981
assertNotSame(testItem, parsedItem);
8082
assertEquals(testItem, parsedItem);

0 commit comments

Comments
 (0)