Skip to content

Commit 33bc36d

Browse files
authored
Add inner_hits support to the collapse field in NativeSearchQuery.
Original Pull Request #1815 Closes #1498
1 parent a830e76 commit 33bc36d

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java

+8
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,14 @@ public NativeSearchQueryBuilder withCollapseField(String collapseField) {
102102
return this;
103103
}
104104

105+
/**
106+
* @since 4.3
107+
*/
108+
public NativeSearchQueryBuilder withCollapseBuilder(@Nullable CollapseBuilder collapseBuilder) {
109+
this.collapseBuilder = collapseBuilder;
110+
return this;
111+
}
112+
105113
public NativeSearchQueryBuilder addAggregation(AbstractAggregationBuilder<?> aggregationBuilder) {
106114
this.aggregationBuilders.add(aggregationBuilder);
107115
return this;

src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

+37-2
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,15 @@
4949
import org.elasticsearch.common.lucene.search.function.CombineFunction;
5050
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
5151
import org.elasticsearch.index.VersionType;
52+
import org.elasticsearch.index.query.InnerHitBuilder;
5253
import org.elasticsearch.index.query.QueryBuilders;
5354
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
5455
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder;
5556
import org.elasticsearch.index.query.functionscore.GaussDecayFunctionBuilder;
5657
import org.elasticsearch.join.query.ParentIdQueryBuilder;
5758
import org.elasticsearch.script.Script;
5859
import org.elasticsearch.script.ScriptType;
60+
import org.elasticsearch.search.collapse.CollapseBuilder;
5961
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
6062
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
6163
import org.elasticsearch.search.sort.FieldSortBuilder;
@@ -2811,6 +2813,39 @@ public void shouldReturnDocumentWithCollapsedField() {
28112813
assertThat(searchHits.getSearchHit(1).getContent().getMessage()).isEqualTo("message 2");
28122814
}
28132815

2816+
@Test // #1493
2817+
@DisplayName("should return document with collapse field and inner hits")
2818+
public void shouldReturnDocumentWithCollapsedFieldAndInnerHits() {
2819+
2820+
// given
2821+
SampleEntity sampleEntity = SampleEntity.builder().id(nextIdAsString()).message("message 1").rate(1)
2822+
.version(System.currentTimeMillis()).build();
2823+
SampleEntity sampleEntity2 = SampleEntity.builder().id(nextIdAsString()).message("message 2").rate(2)
2824+
.version(System.currentTimeMillis()).build();
2825+
SampleEntity sampleEntity3 = SampleEntity.builder().id(nextIdAsString()).message("message 1").rate(1)
2826+
.version(System.currentTimeMillis()).build();
2827+
2828+
List<IndexQuery> indexQueries = getIndexQueries(Arrays.asList(sampleEntity, sampleEntity2, sampleEntity3));
2829+
2830+
operations.bulkIndex(indexQueries, index);
2831+
indexOperations.refresh();
2832+
2833+
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
2834+
.withCollapseBuilder(new CollapseBuilder("rate").setInnerHits(new InnerHitBuilder("innerHits"))).build();
2835+
2836+
// when
2837+
SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
2838+
2839+
// then
2840+
assertThat(searchHits).isNotNull();
2841+
assertThat(searchHits.getTotalHits()).isEqualTo(3);
2842+
assertThat(searchHits.getSearchHits()).hasSize(2);
2843+
assertThat(searchHits.getSearchHit(0).getContent().getMessage()).isEqualTo("message 1");
2844+
assertThat(searchHits.getSearchHit(0).getInnerHits("innerHits").getTotalHits()).isEqualTo(2);
2845+
assertThat(searchHits.getSearchHit(1).getContent().getMessage()).isEqualTo("message 2");
2846+
assertThat(searchHits.getSearchHit(1).getInnerHits("innerHits").getTotalHits()).isEqualTo(1);
2847+
}
2848+
28142849
private IndexQuery getIndexQuery(SampleEntity sampleEntity) {
28152850
return new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity)
28162851
.withVersion(sampleEntity.getVersion()).build();
@@ -3597,8 +3632,8 @@ void shouldSetScriptedFieldsOnImmutableObjects() {
35973632
params.put("factor", 2);
35983633
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
35993634
.withSourceFilter(new FetchSourceFilter(new String[] { "*" }, new String[] {}))
3600-
.withScriptField(
3601-
new ScriptField("scriptedRate", new Script(ScriptType.INLINE, "expression", "doc['rate'] * factor", params)))
3635+
.withScriptField(new ScriptField("scriptedRate",
3636+
new Script(ScriptType.INLINE, "expression", "doc['rate'] * factor", params)))
36023637
.build();
36033638

36043639
SearchHits<ImmutableWithScriptedEntity> searchHits = operations.search(searchQuery,

0 commit comments

Comments
 (0)