|
15 | 15 | import org.elasticsearch.action.index.IndexRequestBuilder; |
16 | 16 | import org.elasticsearch.action.search.SearchPhaseExecutionException; |
17 | 17 | import org.elasticsearch.action.search.SearchType; |
18 | | -import org.elasticsearch.cluster.metadata.IndexMetadata; |
19 | 18 | import org.elasticsearch.common.document.DocumentField; |
20 | 19 | import org.elasticsearch.common.settings.Settings; |
21 | 20 | import org.elasticsearch.index.IndexSettings; |
|
49 | 48 | import org.elasticsearch.search.lookup.FieldLookup; |
50 | 49 | import org.elasticsearch.search.lookup.LeafSearchLookup; |
51 | 50 | import org.elasticsearch.search.rescore.QueryRescorerBuilder; |
| 51 | +import org.elasticsearch.search.sort.NestedSortBuilder; |
52 | 52 | import org.elasticsearch.search.sort.ScriptSortBuilder.ScriptSortType; |
53 | 53 | import org.elasticsearch.search.sort.SortBuilders; |
54 | 54 | import org.elasticsearch.search.sort.SortOrder; |
@@ -988,18 +988,63 @@ public void testTopHitsInNested() throws Exception { |
988 | 988 | } |
989 | 989 |
|
990 | 990 | public void testTopHitsOnInnerHits() { |
991 | | - QueryBuilder qb = nestedQuery("comments", matchQuery("comments.message", "text"), ScoreMode.Avg).innerHit(new InnerHitBuilder()); |
992 | | - AggregationBuilder ab = topHits("top-comments").size(3); |
| 991 | + QueryBuilder nestedQuery = nestedQuery("comments", matchQuery("comments.message", "text"), ScoreMode.Avg).innerHit( |
| 992 | + new InnerHitBuilder().setSize(2) |
| 993 | + ); |
| 994 | + AggregationBuilder topHitsAgg = topHits("top-comments").size(3) |
| 995 | + .sort(SortBuilders.fieldSort("comments.date").order(SortOrder.ASC).setNestedSort(new NestedSortBuilder("comments"))); |
993 | 996 |
|
994 | | - assertNoFailuresAndResponse(prepareSearch("articles").setQuery(qb).addAggregation(ab), response -> { |
| 997 | + assertNoFailuresAndResponse(prepareSearch("articles").setQuery(nestedQuery).addAggregation(topHitsAgg), response -> { |
995 | 998 | TopHits topHits = response.getAggregations().get("top-comments"); |
996 | 999 | SearchHits hits = topHits.getHits(); |
997 | 1000 | assertThat(hits.getHits().length, equalTo(3)); |
998 | 1001 |
|
999 | | - SearchHit searchHit = hits.getAt(0); |
1000 | | - SearchHits innerHits = searchHit.getInnerHits().get("comments"); |
1001 | | - assertThat(innerHits.getHits().length, equalTo(3)); |
1002 | | - assertThat(innerHits.getAt(0).getNestedIdentity().getField().toString(), equalTo("comments")); |
| 1002 | + for (SearchHit hit : hits) { |
| 1003 | + SearchHits innerHits = hit.getInnerHits().get("comments"); |
| 1004 | + assertThat(innerHits.getHits().length, lessThanOrEqualTo(2)); |
| 1005 | + for (SearchHit innerHit : innerHits) { |
| 1006 | + assertThat(innerHit.getNestedIdentity().getField().string(), equalTo("comments")); |
| 1007 | + Map<String, Object> source = innerHit.getSourceAsMap(); |
| 1008 | + assertTrue(source.containsKey("message")); |
| 1009 | + assertFalse(source.containsKey("reviewers")); |
| 1010 | + } |
| 1011 | + } |
| 1012 | + }); |
| 1013 | + } |
| 1014 | + |
| 1015 | + public void testTopHitsOnMultipleNestedInnerHits() { |
| 1016 | + QueryBuilder doubleNestedQuery = nestedQuery( |
| 1017 | + "comments", |
| 1018 | + nestedQuery("comments.reviewers", matchQuery("comments.reviewers.name", "user c"), ScoreMode.Avg).innerHit( |
| 1019 | + new InnerHitBuilder() |
| 1020 | + ), |
| 1021 | + ScoreMode.Avg |
| 1022 | + ).innerHit(new InnerHitBuilder("review")); |
| 1023 | + AggregationBuilder topHitsAgg = topHits("top-reviewers").size(2) |
| 1024 | + .sort(SortBuilders.fieldSort("comments.date").order(SortOrder.ASC).setNestedSort(new NestedSortBuilder("comments"))); |
| 1025 | + |
| 1026 | + assertNoFailuresAndResponse(prepareSearch("articles").setQuery(doubleNestedQuery).addAggregation(topHitsAgg), response -> { |
| 1027 | + TopHits topHits = response.getAggregations().get("top-reviewers"); |
| 1028 | + SearchHits hits = topHits.getHits(); |
| 1029 | + assertThat(hits.getHits().length, equalTo(1)); |
| 1030 | + |
| 1031 | + SearchHit hit = hits.getAt(0); |
| 1032 | + SearchHits innerHits = hit.getInnerHits().get("review"); |
| 1033 | + assertThat(innerHits.getHits().length, equalTo(2)); |
| 1034 | + |
| 1035 | + assertThat(innerHits.getAt(0).getId(), equalTo("1")); |
| 1036 | + assertThat(innerHits.getAt(0).getNestedIdentity().getField().string(), equalTo("comments")); |
| 1037 | + assertThat(innerHits.getAt(0).getNestedIdentity().getOffset(), equalTo(0)); |
| 1038 | + Map<String, Object> source0 = innerHits.getAt(0).getSourceAsMap(); |
| 1039 | + assertTrue(source0.containsKey("message")); |
| 1040 | + assertTrue(source0.containsKey("reviewers")); |
| 1041 | + |
| 1042 | + assertThat(innerHits.getAt(1).getId(), equalTo("1")); |
| 1043 | + assertThat(innerHits.getAt(1).getNestedIdentity().getField().string(), equalTo("comments")); |
| 1044 | + assertThat(innerHits.getAt(1).getNestedIdentity().getOffset(), equalTo(1)); |
| 1045 | + Map<String, Object> source1 = innerHits.getAt(1).getSourceAsMap(); |
| 1046 | + assertTrue(source1.containsKey("message")); |
| 1047 | + assertTrue(source1.containsKey("reviewers")); |
1003 | 1048 | }); |
1004 | 1049 | } |
1005 | 1050 |
|
|
0 commit comments