Skip to content
This repository was archived by the owner on Jun 20, 2023. It is now read-only.

Commit 97b8e27

Browse files
committed
Changes & Additions in PR #400. Allow search result hits to be extracted even if _source is disabled (now it matches ES behavior). extractHit modified in SearchResult. New tests added to check new features.
1 parent 7f052ed commit 97b8e27

File tree

3 files changed

+143
-90
lines changed

3 files changed

+143
-90
lines changed

jest-common/src/main/java/io/searchbox/core/SearchResult.java

Lines changed: 59 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -106,72 +106,76 @@ protected <T, K> Hit<T, K> extractHit(Class<T> sourceType, Class<K> explanationT
106106
JsonObject hitObject = hitElement.getAsJsonObject();
107107
JsonObject source = hitObject.getAsJsonObject(sourceKey);
108108

109-
if (source != null) {
110-
String index = hitObject.get("_index").getAsString();
111-
String type = hitObject.get("_type").getAsString();
112109

113-
String id = hitObject.get("_id").getAsString();
110+
String index = hitObject.get("_index").getAsString();
111+
String type = hitObject.get("_type").getAsString();
114112

115-
Double score = null;
116-
if (hitObject.has("_score") && !hitObject.get("_score").isJsonNull()) {
117-
score = hitObject.get("_score").getAsDouble();
118-
}
119-
120-
String parent = null;
121-
String routing = null;
122-
123-
if (hitObject.has("_parent") && !hitObject.get("_parent").isJsonNull()) {
124-
parent = hitObject.get("_parent").getAsString();
125-
}
126-
127-
if (hitObject.has("_routing") && !hitObject.get("_routing").isJsonNull()) {
128-
routing = hitObject.get("_routing").getAsString();
129-
}
113+
String id = hitObject.get("_id").getAsString();
130114

131-
JsonElement explanation = hitObject.get(EXPLANATION_KEY);
132-
Map<String, List<String>> highlight = extractHighlight(hitObject.getAsJsonObject(HIGHLIGHT_KEY));
133-
List<String> sort = extractSort(hitObject.getAsJsonArray(SORT_KEY));
115+
Double score = null;
116+
if (hitObject.has("_score") && !hitObject.get("_score").isJsonNull()) {
117+
score = hitObject.get("_score").getAsDouble();
118+
}
134119

135-
List<String> matchedQueries = new ArrayList<>();
136-
if (hitObject.has("matched_queries") && !hitObject.get("matched_queries").isJsonNull()) {
137-
JsonArray rawMatchedQueries = hitObject.get("matched_queries").getAsJsonArray();
138-
rawMatchedQueries.forEach(matchedQuery -> {
139-
matchedQueries.add(matchedQuery.getAsString());
140-
});
141-
}
120+
String parent = null;
121+
String routing = null;
122+
123+
if (hitObject.has("_parent") && !hitObject.get("_parent").isJsonNull()) {
124+
parent = hitObject.get("_parent").getAsString();
125+
}
126+
127+
if (hitObject.has("_routing") && !hitObject.get("_routing").isJsonNull()) {
128+
routing = hitObject.get("_routing").getAsString();
129+
}
130+
131+
JsonElement explanation = hitObject.get(EXPLANATION_KEY);
132+
Map<String, List<String>> highlight = extractHighlight(hitObject.getAsJsonObject(HIGHLIGHT_KEY));
133+
List<String> sort = extractSort(hitObject.getAsJsonArray(SORT_KEY));
134+
135+
List<String> matchedQueries = new ArrayList<>();
136+
if (hitObject.has("matched_queries") && !hitObject.get("matched_queries").isJsonNull()) {
137+
JsonArray rawMatchedQueries = hitObject.get("matched_queries").getAsJsonArray();
138+
rawMatchedQueries.forEach(matchedQuery -> {
139+
matchedQueries.add(matchedQuery.getAsString());
140+
});
141+
}
142142

143-
if (addEsMetadataFields) {
144-
JsonObject clonedSource = null;
145-
for (MetaField metaField : META_FIELDS) {
146-
JsonElement metaElement = hitObject.get(metaField.esFieldName);
147-
if (metaElement != null) {
148-
if (clonedSource == null) {
143+
if (addEsMetadataFields) {
144+
JsonObject clonedSource = null;
145+
for (MetaField metaField : META_FIELDS) {
146+
JsonElement metaElement = hitObject.get(metaField.esFieldName);
147+
if (metaElement != null) {
148+
if (clonedSource == null) {
149+
if (source == null) {
150+
clonedSource = new JsonObject();
151+
} else {
149152
clonedSource = (JsonObject) CloneUtils.deepClone(source);
150153
}
151-
clonedSource.add(metaField.internalFieldName, metaElement);
152154
}
153-
}
154-
if (clonedSource != null) {
155-
source = clonedSource;
155+
clonedSource.add(metaField.internalFieldName, metaElement);
156156
}
157157
}
158-
159-
hit = new Hit<T, K>(
160-
sourceType,
161-
source,
162-
explanationType,
163-
explanation,
164-
highlight,
165-
sort,
166-
index,
167-
type,
168-
id,
169-
score,
170-
parent,
171-
routing,
172-
matchedQueries
173-
);
158+
if (clonedSource != null) {
159+
source = clonedSource;
160+
}
174161
}
162+
163+
hit = new Hit<T, K>(
164+
sourceType,
165+
source,
166+
explanationType,
167+
explanation,
168+
highlight,
169+
sort,
170+
index,
171+
type,
172+
id,
173+
score,
174+
parent,
175+
routing,
176+
matchedQueries
177+
);
178+
175179
}
176180

177181
return hit;

jest-common/src/test/java/io/searchbox/core/SearchResultTest.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,7 @@
1010
import java.util.List;
1111
import java.util.Map;
1212

13-
import static org.junit.Assert.assertEquals;
14-
import static org.junit.Assert.assertFalse;
15-
import static org.junit.Assert.assertNotNull;
16-
import static org.junit.Assert.assertNull;
17-
import static org.junit.Assert.assertTrue;
13+
import static org.junit.Assert.*;
1814

1915
/**
2016
* @author cihat keser
@@ -475,6 +471,42 @@ public void testGetMatchedQueries() {
475471
assertEquals("Incorrect Matched Query", Collections.singletonList("some-query"), hit.matchedQueries);
476472
}
477473

474+
@Test
475+
public void testGetHitsWithoutSource() {
476+
Long version = 2L;
477+
String jsonWithoutSource = "{\n" +
478+
" \"_shards\":{\n" +
479+
" \"total\" : 5,\n" +
480+
" \"successful\" : 5,\n" +
481+
" \"failed\" : 0\n" +
482+
" },\n" +
483+
" \"hits\":{\n" +
484+
" \"total\" : 1,\n" +
485+
" \"hits\" : [\n" +
486+
" {\n" +
487+
" \"_index\" : \"twitter\",\n" +
488+
" \"_type\" : \"tweet\",\n" +
489+
" \"_score\" : \"1.02332\",\n" +
490+
" \"_id\" : \"1\",\n" +
491+
" \"_version\" : \"" + version + "\"\n" +
492+
" }\n" +
493+
" ]\n" +
494+
" }\n" +
495+
"}";
496+
SearchResult searchResult = new SearchResult(new Gson());
497+
searchResult.setSucceeded(true);
498+
searchResult.setJsonString(jsonWithoutSource);
499+
searchResult.setJsonObject(new JsonParser().parse(jsonWithoutSource).getAsJsonObject());
500+
searchResult.setPathToResult("hits/hits/_source");
501+
SearchResult.Hit<TestObject, Void> hit = searchResult.getFirstHit(TestObject.class);
502+
assertNotNull(hit.source);
503+
assertNull(hit.explanation);
504+
assertNull(hit.sort);
505+
assertNotNull(hit.score);
506+
assertEquals("1", hit.source.getId());
507+
assertEquals(version, hit.source.getVersion());
508+
}
509+
478510
class TestObject {
479511
@JestId
480512
private String id;

jest/src/test/java/io/searchbox/core/SearchIntegrationTest.java

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -228,36 +228,6 @@ public void searchWithValidTermQuery() throws IOException {
228228
assertEquals(1, resultList.size());
229229
}
230230

231-
@Test
232-
public void searchAndGetFirstHit() throws IOException {
233-
assertTrue(index("articles", "article", "3", new Gson().toJson(new TestArticleModel("pickles"))).getResult().equals(DocWriteResponse.Result.CREATED));
234-
refresh();
235-
ensureSearchable("articles");
236-
237-
SearchResult searchResult = client.execute(new Search.Builder("{\n" +
238-
" \"explain\": true,\n" +
239-
" \"query\":{\n" +
240-
" \"query_string\":{\n" +
241-
" \"query\":\"name:pickles\"\n" +
242-
" }\n" +
243-
" },\n" +
244-
" \"highlight\" : {\n" +
245-
" \"fields\" : {\n" +
246-
" \"name\" : {}\n" +
247-
" }\n" +
248-
" }" +
249-
"}").build());
250-
assertNotNull(searchResult);
251-
252-
SearchResult.Hit<TestArticleModel, Explanation> hit = searchResult.getFirstHit(TestArticleModel.class, Explanation.class);
253-
assertNotNull(hit.source);
254-
assertNotNull(hit.explanation);
255-
assertNotNull(hit.highlight);
256-
assertEquals(1, hit.highlight.size());
257-
assertTrue(hit.highlight.containsKey("name"));
258-
assertEquals(1, hit.highlight.get("name").size());
259-
}
260-
261231
@Test
262232
public void searchIndexWithTypeWithNullJestId() throws Exception {
263233
TestArticleModel article = new TestArticleModel();
@@ -452,4 +422,51 @@ public void searchInnerHits() throws Exception {
452422
JsonObject innerHitsResult = innerHits.get(field).getAsJsonObject().get("hits").getAsJsonObject().get("hits").getAsJsonArray().get(0).getAsJsonObject();
453423
assertEquals("musabg", innerHitsResult.get("_source").getAsJsonObject().get("author").getAsString());
454424
}
425+
426+
@Test
427+
public void searchAndGetFirstHitWithSource() throws IOException {
428+
searchAndGetFirstHit(true);
429+
}
430+
431+
@Test
432+
public void searchAndGetFirstHitWithoutSource() throws IOException {
433+
searchAndGetFirstHit(false);
434+
}
435+
436+
private void searchAndGetFirstHit(boolean hasSource) throws IOException {
437+
assertTrue(index("articles", "article", "3", new Gson().toJson(new TestArticleModel("pickles"))).getResult().equals(DocWriteResponse.Result.CREATED));
438+
refresh();
439+
ensureSearchable("articles");
440+
441+
SearchResult searchResult = client.execute(new Search.Builder("{\n" +
442+
" \"explain\": true,\n" +
443+
" \"_source\": " + Boolean.toString(hasSource) + ",\n" +
444+
" \"query\":{\n" +
445+
" \"query_string\":{\n" +
446+
" \"query\":\"name:pickles\"\n" +
447+
" }\n" +
448+
" },\n" +
449+
" \"highlight\" : {\n" +
450+
" \"fields\" : {\n" +
451+
" \"name\" : {}\n" +
452+
" }\n" +
453+
" }" +
454+
"}").build());
455+
assertNotNull(searchResult);
456+
457+
SearchResult.Hit<TestArticleModel, Explanation> hit = searchResult.getFirstHit(TestArticleModel.class, Explanation.class);
458+
assertNotNull(hit.source);
459+
assertNotNull(hit.explanation);
460+
assertNotNull(hit.highlight);
461+
assertEquals(1, hit.highlight.size());
462+
assertTrue(hit.highlight.containsKey("name"));
463+
assertEquals(1, hit.highlight.get("name").size());
464+
assertNotNull(hit.source.getId());
465+
466+
if (hasSource) {
467+
assertNotNull(hit.source.getName());
468+
} else {
469+
assertNull(hit.source.getName());
470+
}
471+
}
455472
}

0 commit comments

Comments
 (0)