diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java index 74702a998..17b186ef9 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -106,6 +106,7 @@ import static org.springframework.util.CollectionUtils.isEmpty; * @author Oliver Gierke * @author Mark Janssen * @author Mark Paluch + * @author Sascha Woo */ public class ElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware { @@ -875,9 +876,11 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati } if (searchQuery.getHighlightFields() != null) { + HighlightBuilder highlightBuilder = new HighlightBuilder(); for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) { - searchRequest.highlighter(new HighlightBuilder().field(highlightField)); + highlightBuilder.field(highlightField); } + searchRequest.highlighter(highlightBuilder); } if (!isEmpty(searchQuery.getIndicesBoost())) { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index 30918ba3e..387ad02bb 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -33,6 +33,7 @@ import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.elasticsearch.search.sort.FieldSortBuilder; import org.elasticsearch.search.sort.SortOrder; import org.hamcrest.Matchers; @@ -70,6 +71,7 @@ import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; * @author Abdul Mohammed * @author Kevin Leturc * @author Mason Chan + * @author Sascha Woo */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:elasticsearch-template-test.xml") @@ -1206,6 +1208,58 @@ public class ElasticsearchTemplateTests { assertThat(sampleEntities.getContent().get(0).getHighlightedMessage(), is(highlightedMessage)); } + @Test // DATAES-412 + public void shouldReturnMultipleHighlightFields() { + + // given + String documentId = randomNumeric(5); + String actualType = "some test type"; + String actualMessage = "some test message"; + String highlightedType = "some test type"; + String highlightedMessage = "some test message"; + + SampleEntity sampleEntity = SampleEntity.builder() + .id(documentId) + .type(actualType) + .message(actualMessage) + .version(System.currentTimeMillis()) + .build(); + + IndexQuery indexQuery = getIndexQuery(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class); + + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery( + boolQuery() + .must(termQuery("type", "test")) + .must(termQuery("message", "test"))) + .withHighlightFields( + new HighlightBuilder.Field("type"), + new HighlightBuilder.Field("message")) + .build(); + + // when + elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() { + @Override + public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + for (SearchHit searchHit : response.getHits()) { + Map highlightFields = searchHit.getHighlightFields(); + HighlightField highlightFieldType = highlightFields.get("type"); + HighlightField highlightFieldMessage = highlightFields.get("message"); + + // then + assertNotNull(highlightFieldType); + assertNotNull(highlightFieldMessage); + assertThat(highlightFieldType.fragments()[0].toString(), is(highlightedType)); + assertThat(highlightFieldMessage.fragments()[0].toString(), is(highlightedMessage)); + } + return null; + } + }); + } + @Test public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery() { // given