Skip to content

Commit b8324f9

Browse files
jnizetxhaggi
authored andcommitted
DATAES-479 - Allow specifying a HighlightBuilder when creating a query.
Original pull request: spring-projects#217.
1 parent 94d18e8 commit b8324f9

File tree

5 files changed

+122
-9
lines changed

5 files changed

+122
-9
lines changed

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
* @author Alen Turkovic
135135
* @author Sascha Woo
136136
* @author Ted Liang
137+
* @author Jean-Baptiste Nizet
137138
*/
138139
public class ElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware {
139140

@@ -905,8 +906,11 @@ private SearchResponse doSearch(SearchRequestBuilder searchRequest, SearchQuery
905906
}
906907
}
907908

908-
if (searchQuery.getHighlightFields() != null) {
909-
HighlightBuilder highlightBuilder = new HighlightBuilder();
909+
if (searchQuery.getHighlightFields() != null || searchQuery.getHighlightBuilder() != null) {
910+
HighlightBuilder highlightBuilder = searchQuery.getHighlightBuilder();
911+
if (highlightBuilder == null) {
912+
highlightBuilder = new HighlightBuilder();
913+
}
910914
for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) {
911915
highlightBuilder.field(highlightField);
912916
}
@@ -934,11 +938,11 @@ private SearchResponse doSearch(SearchRequestBuilder searchRequest, SearchQuery
934938
}
935939

936940
private SearchResponse getSearchResponse(SearchRequestBuilder requestBuilder) {
937-
941+
938942
if (QUERY_LOGGER.isDebugEnabled()) {
939943
QUERY_LOGGER.debug(requestBuilder.toString());
940944
}
941-
945+
942946
return getSearchResponse(requestBuilder.execute());
943947
}
944948

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2017 the original author or authors.
2+
* Copyright 2013-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@
3232
* @author Rizwan Idrees
3333
* @author Mohsin Husen
3434
* @author Artur Konczak
35+
* @author Jean-Baptiste Nizet
3536
*/
3637
public class NativeSearchQuery extends AbstractQuery implements SearchQuery {
3738

@@ -41,6 +42,7 @@ public class NativeSearchQuery extends AbstractQuery implements SearchQuery {
4142
private final List<ScriptField> scriptFields = new ArrayList<>();
4243
private List<FacetRequest> facets;
4344
private List<AbstractAggregationBuilder> aggregations;
45+
private HighlightBuilder highlightBuilder;
4446
private HighlightBuilder.Field[] highlightFields;
4547
private List<IndexBoost> indicesBoost;
4648

@@ -67,6 +69,15 @@ public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuild
6769
this.highlightFields = highlightFields;
6870
}
6971

72+
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sorts,
73+
HighlightBuilder highlighBuilder, HighlightBuilder.Field[] highlightFields) {
74+
this.query = query;
75+
this.filter = filter;
76+
this.sorts = sorts;
77+
this.highlightBuilder = highlighBuilder;
78+
this.highlightFields = highlightFields;
79+
}
80+
7081
public QueryBuilder getQuery() {
7182
return query;
7283
}
@@ -79,6 +90,11 @@ public List<SortBuilder> getElasticsearchSorts() {
7990
return sorts;
8091
}
8192

93+
@Override
94+
public HighlightBuilder getHighlightBuilder() {
95+
return highlightBuilder;
96+
}
97+
8298
@Override
8399
public HighlightBuilder.Field[] getHighlightFields() {
84100
return highlightFields;

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
* @author Mark Paluch
3838
* @author Alen Turkovic
3939
* @author Sascha Woo
40+
* @author Jean-Baptiste Nizet
4041
*/
4142
public class NativeSearchQueryBuilder {
4243

@@ -46,6 +47,7 @@ public class NativeSearchQueryBuilder {
4647
private List<SortBuilder> sortBuilders = new ArrayList<>();
4748
private List<FacetRequest> facetRequests = new ArrayList<>();
4849
private List<AbstractAggregationBuilder> aggregationBuilders = new ArrayList<>();
50+
private HighlightBuilder highlightBuilder;
4951
private HighlightBuilder.Field[] highlightFields;
5052
private Pageable pageable = Pageable.unpaged();
5153
private String[] indices;
@@ -90,6 +92,11 @@ public NativeSearchQueryBuilder withFacet(FacetRequest facetRequest) {
9092
return this;
9193
}
9294

95+
public NativeSearchQueryBuilder withHighlightBuilder(HighlightBuilder highlightBuilder) {
96+
this.highlightBuilder = highlightBuilder;
97+
return this;
98+
}
99+
93100
public NativeSearchQueryBuilder withHighlightFields(HighlightBuilder.Field... highlightFields) {
94101
this.highlightFields = highlightFields;
95102
return this;
@@ -162,7 +169,7 @@ public NativeSearchQueryBuilder withIndicesOptions(IndicesOptions indicesOptions
162169

163170
public NativeSearchQuery build() {
164171
NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilders,
165-
highlightFields);
172+
highlightBuilder, highlightFields);
166173

167174
nativeSearchQuery.setPageable(pageable);
168175
nativeSearchQuery.setTrackScores(trackScores);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2016 the original author or authors.
2+
* Copyright 2013-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@
2929
* @author Rizwan Idrees
3030
* @author Mohsin Husen
3131
* @author Artur Konczak
32+
* @author Jean-Baptiste Nizet
3233
*/
3334
public interface SearchQuery extends Query {
3435

@@ -43,6 +44,8 @@ public interface SearchQuery extends Query {
4344

4445
List<AbstractAggregationBuilder> getAggregations();
4546

47+
HighlightBuilder getHighlightBuilder();
48+
4649
HighlightBuilder.Field[] getHighlightFields();
4750

4851
List<IndexBoost> getIndicesBoost();

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

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
* @author Ilkang Na
7878
* @author Alen Turkovic
7979
* @author Sascha Woo
80+
* @author Jean-Baptiste Nizet
8081
*/
8182
@RunWith(SpringJUnit4ClassRunner.class)
8283
@ContextConfiguration("classpath:elasticsearch-template-test.xml")
@@ -1415,6 +1416,88 @@ public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz,
14151416
});
14161417
}
14171418

1419+
@Test // DATAES-479
1420+
public void shouldHonorTheHighlightBuilderOptions() {
1421+
1422+
// given
1423+
String documentId = randomNumeric(5);
1424+
String actualMessage = "some test message with <html> unsafe <script> text";
1425+
String highlightedMessage = "some <em>test</em> message with &lt;html&gt; unsafe &lt;script&gt; text";
1426+
1427+
SampleEntity sampleEntity = SampleEntity.builder()
1428+
.id(documentId)
1429+
.message(actualMessage)
1430+
.version(System.currentTimeMillis())
1431+
.build();
1432+
1433+
IndexQuery indexQuery = getIndexQuery(sampleEntity);
1434+
1435+
elasticsearchTemplate.index(indexQuery);
1436+
elasticsearchTemplate.refresh(SampleEntity.class);
1437+
1438+
SearchQuery searchQuery = new NativeSearchQueryBuilder()
1439+
.withQuery(termQuery("message", "test"))
1440+
.withHighlightBuilder(new HighlightBuilder().encoder("html"))
1441+
.withHighlightFields(new HighlightBuilder.Field("message"))
1442+
.build();
1443+
// when
1444+
elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() {
1445+
@Override
1446+
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
1447+
for (SearchHit searchHit : response.getHits()) {
1448+
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
1449+
HighlightField highlightFieldMessage = highlightFields.get("message");
1450+
1451+
// then
1452+
assertNotNull(highlightFieldMessage);
1453+
assertThat(highlightFieldMessage.fragments()[0].toString(), is(highlightedMessage));
1454+
}
1455+
return null;
1456+
}
1457+
});
1458+
}
1459+
1460+
@Test // DATAES-479
1461+
public void shouldHighlightIfBuilderSetEvenIfFieldsNotSet() {
1462+
1463+
// given
1464+
String documentId = randomNumeric(5);
1465+
String actualMessage = "some test message text";
1466+
String highlightedMessage = "some <em>test</em> message text";
1467+
1468+
SampleEntity sampleEntity = SampleEntity.builder()
1469+
.id(documentId)
1470+
.message(actualMessage)
1471+
.version(System.currentTimeMillis())
1472+
.build();
1473+
1474+
IndexQuery indexQuery = getIndexQuery(sampleEntity);
1475+
1476+
elasticsearchTemplate.index(indexQuery);
1477+
elasticsearchTemplate.refresh(SampleEntity.class);
1478+
1479+
SearchQuery searchQuery = new NativeSearchQueryBuilder()
1480+
.withQuery(termQuery("message", "test"))
1481+
.withHighlightBuilder(new HighlightBuilder().field("message"))
1482+
.withHighlightFields(new HighlightBuilder.Field("message"))
1483+
.build();
1484+
// when
1485+
elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() {
1486+
@Override
1487+
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
1488+
for (SearchHit searchHit : response.getHits()) {
1489+
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
1490+
HighlightField highlightFieldMessage = highlightFields.get("message");
1491+
1492+
// then
1493+
assertNotNull(highlightFieldMessage);
1494+
assertThat(highlightFieldMessage.fragments()[0].toString(), is(highlightedMessage));
1495+
}
1496+
return null;
1497+
}
1498+
});
1499+
}
1500+
14181501
@Test
14191502
public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery() {
14201503
// given
@@ -1538,7 +1621,7 @@ public void shouldReturnDocumentAboveMinimalScoreGivenQuery() {
15381621

15391622
@Test // DATAES-462
15401623
public void shouldReturnScores() {
1541-
1624+
15421625
// given
15431626
List<IndexQuery> indexQueries = new ArrayList<>();
15441627

@@ -2250,4 +2333,4 @@ class ResultAggregator {
22502333
this.lastName = lastName;
22512334
}
22522335
}
2253-
}
2336+
}

0 commit comments

Comments
 (0)