DATAES-713 - Add returned aggregations from the AggregatedPage to the SearchHits.

Original PR: #365
This commit is contained in:
Peter-Josef Meisch 2019-12-26 20:14:04 +01:00 committed by GitHub
parent b634f318ab
commit d2b7df87f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 384 additions and 346 deletions

View File

@ -19,7 +19,6 @@ import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
import org.springframework.data.elasticsearch.ElasticsearchException; import org.springframework.data.elasticsearch.ElasticsearchException;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
import org.springframework.data.elasticsearch.core.document.SearchDocumentResponse; import org.springframework.data.elasticsearch.core.document.SearchDocumentResponse;
@ -108,57 +107,47 @@ public abstract class AbstractElasticsearchTemplate implements ElasticsearchOper
} }
@Override @Override
public <T> AggregatedPage<SearchHit<T>> search(MoreLikeThisQuery query, Class<T> clazz, IndexCoordinates index) { public <T> SearchHits<T> search(MoreLikeThisQuery query, Class<T> clazz, IndexCoordinates index) {
Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery"); Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery");
MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = requestFactory.moreLikeThisQueryBuilder(query, index); MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = requestFactory.moreLikeThisQueryBuilder(query, index);
return search(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz, index);
return searchForPage(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz, index);
} }
@Override @Override
public <T> List<AggregatedPage<SearchHit<T>>> multiSearchForPage(List<? extends Query> queries, Class<T> clazz, public <T> List<SearchHits<T>> multiSearch(List<? extends Query> queries, Class<T> clazz, IndexCoordinates index) {
IndexCoordinates index) {
MultiSearchRequest request = new MultiSearchRequest(); MultiSearchRequest request = new MultiSearchRequest();
for (Query query : queries) { for (Query query : queries) {
request.add(requestFactory.searchRequest(query, clazz, index)); request.add(requestFactory.searchRequest(query, clazz, index));
} }
return doMultiSearch(queries, clazz, request);
MultiSearchResponse.Item[] items = getMultiSearchResult(request);
List<SearchHits<T>> res = new ArrayList<>(queries.size());
int c = 0;
for (Query query : queries) {
res.add(elasticsearchConverter.read(clazz, SearchDocumentResponse.from(items[c++].getResponse())));
}
return res;
} }
@Override @Override
public List<AggregatedPage<? extends SearchHit<?>>> multiSearchForPage(List<? extends Query> queries, public List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class<?>> classes,
List<Class<?>> classes, IndexCoordinates index) { IndexCoordinates index) {
MultiSearchRequest request = new MultiSearchRequest(); MultiSearchRequest request = new MultiSearchRequest();
Iterator<Class<?>> it = classes.iterator(); Iterator<Class<?>> it = classes.iterator();
for (Query query : queries) { for (Query query : queries) {
request.add(requestFactory.searchRequest(query, it.next(), index)); request.add(requestFactory.searchRequest(query, it.next(), index));
} }
return doMultiSearch(queries, classes, request);
}
private <T> List<AggregatedPage<SearchHit<T>>> doMultiSearch(List<? extends Query> queries, Class<T> clazz,
MultiSearchRequest request) {
MultiSearchResponse.Item[] items = getMultiSearchResult(request); MultiSearchResponse.Item[] items = getMultiSearchResult(request);
List<AggregatedPage<SearchHit<T>>> res = new ArrayList<>(queries.size());
int c = 0;
for (Query query : queries) {
res.add(elasticsearchConverter.mapResults(SearchDocumentResponse.from(items[c++].getResponse()), clazz,
query.getPageable()));
}
return res;
}
private List<AggregatedPage<? extends SearchHit<?>>> doMultiSearch(List<? extends Query> queries, List<SearchHits<?>> res = new ArrayList<>(queries.size());
List<Class<?>> classes, MultiSearchRequest request) {
MultiSearchResponse.Item[] items = getMultiSearchResult(request);
List<AggregatedPage<? extends SearchHit<?>>> res = new ArrayList<>(queries.size());
int c = 0; int c = 0;
Iterator<Class<?>> it = classes.iterator(); Iterator<Class<?>> it1 = classes.iterator();
for (Query query : queries) { for (Query query : queries) {
res.add(elasticsearchConverter.mapResults(SearchDocumentResponse.from(items[c++].getResponse()), it.next(), res.add(elasticsearchConverter.read(it1.next(), SearchDocumentResponse.from(items[c++].getResponse())));
query.getPageable()));
} }
return res; return res;
} }

View File

@ -226,19 +226,7 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
} }
@Override @Override
public <T> T query(Query query, ResultsExtractor<T> resultsExtractor, @Nullable Class<T> clazz, public <T> SearchHits<T> search(Query query, Class<T> clazz, IndexCoordinates index) {
IndexCoordinates index) {
SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index);
try {
SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
return resultsExtractor.extract(result);
} catch (IOException e) {
throw new ElasticsearchException("Error for search request: " + searchRequest.toString(), e);
}
}
@Override
public <T> AggregatedPage<SearchHit<T>> searchForPage(Query query, Class<T> clazz, IndexCoordinates index) {
SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index);
SearchResponse response; SearchResponse response;
try { try {
@ -246,7 +234,7 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
} catch (IOException e) { } catch (IOException e) {
throw new ElasticsearchException("Error for search request: " + searchRequest.toString(), e); throw new ElasticsearchException("Error for search request: " + searchRequest.toString(), e);
} }
return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, query.getPageable()); return elasticsearchConverter.read(clazz, SearchDocumentResponse.from(response));
} }
@Override @Override

View File

@ -196,17 +196,10 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
} }
@Override @Override
public <T> T query(Query query, ResultsExtractor<T> resultsExtractor, Class<T> clazz, IndexCoordinates index) { public <T> SearchHits<T> search(Query query, Class<T> clazz, IndexCoordinates index) {
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, clazz, index); SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, clazz, index);
SearchResponse response = getSearchResponse(searchRequestBuilder); SearchResponse response = getSearchResponse(searchRequestBuilder);
return resultsExtractor.extract(response); return elasticsearchConverter.read(clazz, SearchDocumentResponse.from(response));
}
@Override
public <T> AggregatedPage<SearchHit<T>> searchForPage(Query query, Class<T> clazz, IndexCoordinates index) {
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, clazz, index);
SearchResponse response = getSearchResponse(searchRequestBuilder);
return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, query.getPageable());
} }
@Override @Override

View File

@ -22,7 +22,9 @@ import org.springframework.data.domain.Page;
* *
* @param <T> * @param <T>
* @author Sascha Woo * @author Sascha Woo
* @deprecated since 4.0, use {@link org.springframework.data.elasticsearch.core.SearchHits} to return values.
*/ */
@Deprecated
public interface ScoredPage<T> extends Page<T> { public interface ScoredPage<T> extends Page<T> {
float getMaxScore(); float getMaxScore();

View File

@ -21,6 +21,7 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl; import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
@ -81,4 +82,16 @@ public final class SearchHitSupport {
return result; return result;
} }
/**
* Builds an {@link AggregatedPage} with the {@link SearchHit} objects from a {@link SearchHits} object.
*
* @param searchHits, must not be {@literal null}.
* @param pageable, must not be {@literal null}.
* @return the created Page
*/
public static <T> AggregatedPage<SearchHit<T>> page(SearchHits<T> searchHits, Pageable pageable) {
return new AggregatedPageImpl<>(searchHits.getSearchHits(), pageable, searchHits.getTotalHits(),
searchHits.getAggregations(), searchHits.getScrollId(), searchHits.getMaxScore());
}
} }

View File

@ -18,9 +18,10 @@ package org.springframework.data.elasticsearch.core;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
import org.elasticsearch.search.aggregations.Aggregations;
import org.springframework.data.util.Streamable; import org.springframework.data.util.Streamable;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -33,22 +34,28 @@ import org.springframework.util.StringUtils;
*/ */
public class SearchHits<T> implements Streamable<SearchHit<T>> { public class SearchHits<T> implements Streamable<SearchHit<T>> {
private final List<? extends SearchHit<T>> searchHits;
private final long totalHits; private final long totalHits;
private final float maxScore; private final float maxScore;
private final String scrollId;
private final List<? extends SearchHit<T>> searchHits;
private final Aggregations aggregations;
/** /**
* @param searchHits must not be {@literal null}
* @param totalHits * @param totalHits
* @param maxScore * @param maxScore
* @param searchHits must not be {@literal null}
* @param aggregations
*/ */
public SearchHits(List<? extends SearchHit<T>> searchHits, long totalHits, float maxScore) { public SearchHits(long totalHits, float maxScore, @Nullable String scrollId, List<? extends SearchHit<T>> searchHits,
this.totalHits = totalHits; @Nullable Aggregations aggregations) {
this.maxScore = maxScore;
Assert.notNull(searchHits, "searchHits must not be null"); Assert.notNull(searchHits, "searchHits must not be null");
this.totalHits = totalHits;
this.maxScore = maxScore;
this.scrollId = scrollId;
this.searchHits = searchHits; this.searchHits = searchHits;
this.aggregations = aggregations;
} }
@Override @Override
@ -56,21 +63,35 @@ public class SearchHits<T> implements Streamable<SearchHit<T>> {
return (Iterator<SearchHit<T>>) searchHits.iterator(); return (Iterator<SearchHit<T>>) searchHits.iterator();
} }
/**
* @return the number of total hits.
*/
// region getter // region getter
public long getTotalHits() {
return totalHits;
}
/**
* @return the maximum score
*/
public float getMaxScore() {
return maxScore;
}
/**
* @return the scroll id
*/
@Nullable
public String getScrollId() {
return scrollId;
}
/** /**
* @return the contained {@link SearchHit}s. * @return the contained {@link SearchHit}s.
*/ */
public List<SearchHit<T>> getSearchHits() { public List<SearchHit<T>> getSearchHits() {
return Collections.unmodifiableList(searchHits); return Collections.unmodifiableList(searchHits);
} }
public long getTotalHits() {
return totalHits;
}
public float getMaxScore() {
return maxScore;
}
// endregion // endregion
// region SearchHit access // region SearchHit access
@ -86,7 +107,30 @@ public class SearchHits<T> implements Streamable<SearchHit<T>> {
@Override @Override
public String toString() { public String toString() {
return "SearchHits{" + "totalHits=" + totalHits + ", maxScore=" + maxScore + ", searchHits=" return "SearchHits{" +
+ StringUtils.collectionToCommaDelimitedString(searchHits) + '}'; "totalHits=" + totalHits +
", maxScore=" + maxScore +
", scrollId='" + scrollId + '\'' +
", searchHits=" + StringUtils.collectionToCommaDelimitedString(searchHits) +
", aggregations=" + aggregations +
'}';
} }
/**
* @return true if aggregations are available
*/
// region aggregations
public boolean hasAggregations() {
return aggregations != null;
}
/**
* @return the aggregations.
*/
@Nullable
public Aggregations getAggregations() {
return aggregations;
}
// endregion
} }

View File

@ -16,6 +16,7 @@
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -59,8 +60,7 @@ public interface SearchOperations {
*/ */
long count(Query query, @Nullable Class<?> clazz, IndexCoordinates index); long count(Query query, @Nullable Class<?> clazz, IndexCoordinates index);
<T> T query(Query query, ResultsExtractor<T> resultsExtractor, Class<T> clazz, IndexCoordinates index); // region deprecated
/** /**
* Execute the query against elasticsearch and return the first returned object. * Execute the query against elasticsearch and return the first returned object.
* *
@ -82,11 +82,13 @@ public interface SearchOperations {
* @param clazz the entity clazz used for property mapping * @param clazz the entity clazz used for property mapping
* @param index the index to run the query against * @param index the index to run the query against
* @return a page with aggregations * @return a page with aggregations
* @deprecated since 4.0, use {@link #searchForPage(Query, Class, IndexCoordinates)}. * @deprecated since 4.0, use {@link #search(Query, Class, IndexCoordinates)}.
*/ */
@Deprecated @Deprecated
default <T> AggregatedPage<T> queryForPage(Query query, Class<T> clazz, IndexCoordinates index) { default <T> AggregatedPage<T> queryForPage(Query query, Class<T> clazz, IndexCoordinates index) {
return (AggregatedPage<T>) SearchHitSupport.unwrapSearchHits(searchForPage(query, clazz, index)); SearchHits<T> searchHits = search(query, clazz, index);
AggregatedPage<SearchHit<T>> aggregatedPage = SearchHitSupport.page(searchHits, query.getPageable());
return (AggregatedPage<T>) SearchHitSupport.unwrapSearchHits(aggregatedPage);
} }
/** /**
@ -96,13 +98,19 @@ public interface SearchOperations {
* @param clazz the entity clazz used for property mapping * @param clazz the entity clazz used for property mapping
* @param index the index to run the query against * @param index the index to run the query against
* @return list of pages with the results * @return list of pages with the results
* @deprecated since 4.0, use {@link #multiSearchForPage(List, Class, IndexCoordinates)}. * @deprecated since 4.0, use {@link #multiSearch(List, Class, IndexCoordinates)}.
*/ */
@Deprecated @Deprecated
default <T> List<Page<T>> queryForPage(List<? extends Query> queries, Class<T> clazz, IndexCoordinates index) { default <T> List<Page<T>> queryForPage(List<? extends Query> queries, Class<T> clazz, IndexCoordinates index) {
return multiSearchForPage(queries, clazz, index).stream() // List<Page<T>> pageList = new ArrayList<>();
.map(page -> (Page<T>) SearchHitSupport.unwrapSearchHits(page)) // List<SearchHits<T>> searchHitsList = multiSearch(queries, clazz, index);
.collect(Collectors.toList()); Iterator<? extends Query> qit = queries.iterator();
searchHitsList.forEach(searchHits -> {
AggregatedPage<SearchHit<T>> aggregatedPage = SearchHitSupport.page(searchHits, qit.next().getPageable());
Page<T> page = (Page<T>) SearchHitSupport.unwrapSearchHits(aggregatedPage);
pageList.add(page);
});
return pageList;
} }
/** /**
@ -112,14 +120,22 @@ public interface SearchOperations {
* @param classes the entity classes used for the queries * @param classes the entity classes used for the queries
* @param index the index to run the query against * @param index the index to run the query against
* @return list of pages with the results * @return list of pages with the results
* @deprecated since 4.0, use {@link #multiSearchForPage(List, List, IndexCoordinates)}. * @deprecated since 4.0, use {@link #multiSearch(List, List, IndexCoordinates)}.
*/ */
@Deprecated @Deprecated
default List<AggregatedPage<?>> queryForPage(List<? extends Query> queries, List<Class<?>> classes, default List<AggregatedPage<?>> queryForPage(List<? extends Query> queries, List<Class<?>> classes,
IndexCoordinates index) { IndexCoordinates index) {
return multiSearchForPage(queries, classes, index).stream() // List<AggregatedPage<?>> pageList = new ArrayList<>();
.map(page -> (AggregatedPage<?>) SearchHitSupport.unwrapSearchHits(page)) // List<SearchHits<?>> searchHitsList = multiSearch(queries, classes, index);
.collect(Collectors.toList()); Iterator<? extends Query> qit = queries.iterator();
searchHitsList.forEach(searchHits -> {
AggregatedPage<? extends SearchHit<?>> aggregatedPage = SearchHitSupport.page(searchHits,
qit.next().getPageable());
AggregatedPage<?> page = (AggregatedPage<?>) SearchHitSupport.unwrapSearchHits(aggregatedPage);
pageList.add(page);
});
return pageList;
} }
/** /**
@ -219,7 +235,7 @@ public interface SearchOperations {
* @param scrollTimeInMillis duration of the scroll time * @param scrollTimeInMillis duration of the scroll time
* @param clazz The class of entity to retrieve. * @param clazz The class of entity to retrieve.
* @return scrolled page result * @return scrolled page result
* @deprecated since 4.0, use {@link #searchScrollStart(long, Query, Class, IndexCoordinates)}. * @deprecated since 4.0, use {@link #searchScrollContinue(String, long, Class)}.
*/ */
@Deprecated @Deprecated
default <T> ScrolledPage<T> continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class<T> clazz) { default <T> ScrolledPage<T> continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class<T> clazz) {
@ -250,8 +266,11 @@ public interface SearchOperations {
*/ */
@Deprecated @Deprecated
default <T> AggregatedPage<T> moreLikeThis(MoreLikeThisQuery query, Class<T> clazz, IndexCoordinates index) { default <T> AggregatedPage<T> moreLikeThis(MoreLikeThisQuery query, Class<T> clazz, IndexCoordinates index) {
return (AggregatedPage<T>) SearchHitSupport.unwrapSearchHits(search(query, clazz, index)); SearchHits<T> searchHits = search(query, clazz, index);
AggregatedPage<SearchHit<T>> aggregatedPage = SearchHitSupport.page(searchHits, query.getPageable());
return (AggregatedPage<T>) SearchHitSupport.unwrapSearchHits(aggregatedPage);
} }
// endregion
/** /**
* Execute the query against elasticsearch and return the first returned object. * Execute the query against elasticsearch and return the first returned object.
@ -263,41 +282,30 @@ public interface SearchOperations {
*/ */
@Nullable @Nullable
default <T> SearchHit<T> searchOne(Query query, Class<T> clazz, IndexCoordinates index) { default <T> SearchHit<T> searchOne(Query query, Class<T> clazz, IndexCoordinates index) {
List<SearchHit<T>> content = searchForPage(query, clazz, index).getContent(); List<SearchHit<T>> content = search(query, clazz, index).getSearchHits();
return content.isEmpty() ? null : content.get(0); return content.isEmpty() ? null : content.get(0);
} }
/** /**
* Execute the query against elasticsearch and return result as {@link AggregatedPage}. * Execute the multi search query against elasticsearch and return result as {@link List} of {@link SearchHits}.
* *
* @param query the query to execute * @param queries the queries to execute
* @param clazz the entity clazz used for property mapping * @param clazz the entity clazz used for property mapping
* @param index the index to run the query against * @param index the index to run the query against
* @return a page with aggregations * @param <T> element return type
* @return list of SearchHits
*/ */
<T> AggregatedPage<SearchHit<T>> searchForPage(Query query, Class<T> clazz, IndexCoordinates index); <T> List<SearchHits<T>> multiSearch(List<? extends Query> queries, Class<T> clazz, IndexCoordinates index);
/** /**
* Execute the multi-search against elasticsearch and return result as {@link List} of {@link AggregatedPage} * Execute the multi search query against elasticsearch and return result as {@link List} of {@link SearchHits}.
* *
* @param queries the queries * @param queries the queries to execute
* @param clazz the entity clazz used for property mapping * @param classes the entity classes used for property mapping
* @param index the index to run the query against * @param index the index to run the query against
* @return list of pages with the results * @return list of SearchHits
*/ */
<T> List<AggregatedPage<SearchHit<T>>> multiSearchForPage(List<? extends Query> queries, Class<T> clazz, List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class<?>> classes, IndexCoordinates index);
IndexCoordinates index);
/**
* Execute the multi-search against elasticsearch and return result as {@link List} of {@link AggregatedPage}
*
* @param queries the queries
* @param classes the entity classes used for the queries
* @param index the index to run the query against
* @return list of pages with the results
*/
List<AggregatedPage<? extends SearchHit<?>>> multiSearchForPage(List<? extends Query> queries, List<Class<?>> classes,
IndexCoordinates index);
/** /**
* Execute the criteria query against elasticsearch and return result as {@link SearchHits} * Execute the criteria query against elasticsearch and return result as {@link SearchHits}
@ -308,42 +316,7 @@ public interface SearchOperations {
* @param index the index to run the query against * @param index the index to run the query against
* @return SearchHits containing the list of found objects * @return SearchHits containing the list of found objects
*/ */
default <T> SearchHits<T> search(Query query, Class<T> clazz, IndexCoordinates index) { <T> SearchHits<T> search(Query query, Class<T> clazz, IndexCoordinates index);
AggregatedPage<SearchHit<T>> aggregatedPage = searchForPage(query, clazz, index);
return new SearchHits<>(aggregatedPage.getContent(), aggregatedPage.getTotalElements(),
aggregatedPage.getMaxScore());
}
/**
* Execute the multi search query against elasticsearch and return result as {@link List} of {@link SearchHits}.
*
* @param queries the queries to execute
* @param clazz the entity clazz used for property mapping
* @param index the index to run the query against
* @param <T> element return type
* @return list of SearchHits
*/
default <T> List<SearchHits<T>> multiSearch(List<Query> queries, Class<T> clazz, IndexCoordinates index) {
return multiSearchForPage(queries, clazz, index).stream()
.map(page -> new SearchHits<T>(page.getContent(), page.getTotalElements(), page.getMaxScore()))
.collect(Collectors.toList());
}
/**
* Execute the multi search query against elasticsearch and return result as {@link List} of {@link SearchHits}.
*
* @param queries the queries to execute
* @param classes the entity classes used for property mapping
* @param index the index to run the query against
* @return list of SearchHits
*/
default List<SearchHits<?>> multiSearch(List<Query> queries, List<Class<?>> classes, IndexCoordinates index) {
List<SearchHits<?>> searchHitsList = new ArrayList<>();
multiSearchForPage(queries, classes, index).forEach(page -> {
searchHitsList.add(new SearchHits(page.getContent(), page.getTotalElements(), page.getMaxScore()));
});
return searchHitsList;
}
/** /**
* more like this query to search for documents that are "like" a specific document. * more like this query to search for documents that are "like" a specific document.
@ -352,9 +325,9 @@ public interface SearchOperations {
* @param query the query to execute * @param query the query to execute
* @param clazz the entity clazz used for property mapping * @param clazz the entity clazz used for property mapping
* @param index the index to run the query against * @param index the index to run the query against
* @return page with the results * @return SearchHits containing the list of found objects
*/ */
<T> AggregatedPage<SearchHit<T>> search(MoreLikeThisQuery query, Class<T> clazz, IndexCoordinates index); <T> SearchHits<T> search(MoreLikeThisQuery query, Class<T> clazz, IndexCoordinates index);
/** /**
* Returns scrolled page for given query * Returns scrolled page for given query
@ -377,7 +350,7 @@ public interface SearchOperations {
* @return scrolled page result * @return scrolled page result
*/ */
<T> ScrolledPage<SearchHit<T>> searchScrollContinue(@Nullable String scrollId, long scrollTimeInMillis, <T> ScrolledPage<SearchHit<T>> searchScrollContinue(@Nullable String scrollId, long scrollTimeInMillis,
Class<T> clazz); Class<T> clazz);
/** /**
* Clears the search contexts associated with specified scroll ids. * Clears the search contexts associated with specified scroll ids.

View File

@ -9,7 +9,9 @@ import org.springframework.data.elasticsearch.core.ScrolledPage;
* @author Petar Tahchiev * @author Petar Tahchiev
* @author Sascha Woo * @author Sascha Woo
* @author Peter-Josef Meisch * @author Peter-Josef Meisch
* @deprecated since 4.0, use {@link org.springframework.data.elasticsearch.core.SearchHits} to return values.
*/ */
@Deprecated
public interface AggregatedPage<T> extends ScrolledPage<T>, ScoredPage<T> { public interface AggregatedPage<T> extends ScrolledPage<T>, ScoredPage<T> {
boolean hasAggregations(); boolean hasAggregations();

View File

@ -20,6 +20,7 @@ import java.util.List;
import org.springframework.data.convert.EntityConverter; import org.springframework.data.convert.EntityConverter;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.document.Document; import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.data.elasticsearch.core.document.SearchDocument; import org.springframework.data.elasticsearch.core.document.SearchDocument;
@ -85,11 +86,21 @@ public interface ElasticsearchConverter
<T> T mapDocument(@Nullable Document document, Class<T> type); <T> T mapDocument(@Nullable Document document, Class<T> type);
/** /**
* builds a {@link SearchHit} from a {@link SearchDocument}. * builds a {@link SearchHits} from a {@link SearchDocumentResponse}.
*
* @param searchDocument must not be {@literal null}
* @param <T> the clazz of the type, must not be {@literal null}. * @param <T> the clazz of the type, must not be {@literal null}.
* @param type the type of the returned data, must not be {@literal null}. * @param type the type of the returned data, must not be {@literal null}.
* @param searchDocumentResponse the response to read from, must not be {@literal null}.
* @return a SearchHits object
* @since 4.0
*/
<T> SearchHits<T> read(Class<T> type, SearchDocumentResponse searchDocumentResponse);
/**
* builds a {@link SearchHit} from a {@link SearchDocument}.
*
* @param <T> the clazz of the type, must not be {@literal null}.
* @param type the type of the returned data, must not be {@literal null}.
* @param searchDocument must not be {@literal null}
* @return SearchHit with all available information filled in * @return SearchHit with all available information filled in
* @since 4.0 * @since 4.0
*/ */
@ -108,7 +119,7 @@ public interface ElasticsearchConverter
/** /**
* Map an object to a {@link Document}. * Map an object to a {@link Document}.
* *
* @param source * @param source
* @return will not be {@literal null}. * @return will not be {@literal null}.
*/ */

View File

@ -17,10 +17,20 @@ package org.springframework.data.elasticsearch.core.convert;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.elasticsearch.search.aggregations.Aggregations;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -36,6 +46,7 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.ElasticsearchException; import org.springframework.data.elasticsearch.ElasticsearchException;
import org.springframework.data.elasticsearch.annotations.ScriptedField; import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl; import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.document.Document; import org.springframework.data.elasticsearch.core.document.Document;
@ -152,11 +163,6 @@ public class MappingElasticsearchConverter
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Nullable @Nullable
protected <R> R doRead(Document source, TypeInformation<R> typeHint) { protected <R> R doRead(Document source, TypeInformation<R> typeHint) {
if (source == null) {
return null;
}
typeHint = (TypeInformation<R>) typeMapper.readType(source, typeHint); typeHint = (TypeInformation<R>) typeMapper.readType(source, typeHint);
if (conversions.hasCustomReadTarget(Map.class, typeHint.getType())) { if (conversions.hasCustomReadTarget(Map.class, typeHint.getType())) {
@ -597,8 +603,28 @@ public class MappingElasticsearchConverter
: type.cast(mappedResult); : type.cast(mappedResult);
} }
@Override
public <T> SearchHits<T> read(Class<T> type, SearchDocumentResponse searchDocumentResponse) {
Assert.notNull(type, "type must not be null");
Assert.notNull(searchDocumentResponse, "searchDocumentResponse must not be null");
long totalHits = searchDocumentResponse.getTotalHits();
float maxScore = searchDocumentResponse.getMaxScore();
String scrollId = searchDocumentResponse.getScrollId();
List<SearchHit<T>> searchHits = searchDocumentResponse.getSearchDocuments().stream() //
.map(searchDocument -> read(type, searchDocument)) //
.collect(Collectors.toList());
Aggregations aggregations = searchDocumentResponse.getAggregations();
return new SearchHits<T>(totalHits, maxScore, scrollId, searchHits, aggregations);
}
@Override @Override
public <T> SearchHit<T> read(Class<T> type, SearchDocument searchDocument) { public <T> SearchHit<T> read(Class<T> type, SearchDocument searchDocument) {
Assert.notNull(type, "type must not be null");
Assert.notNull(searchDocument, "searchDocument must not be null");
String id = searchDocument.hasId() ? searchDocument.getId() : null; String id = searchDocument.hasId() ? searchDocument.getId() : null;
float score = searchDocument.getScore(); float score = searchDocument.getScore();
Object[] sortValues = searchDocument.getSortValues(); Object[] sortValues = searchDocument.getSortValues();

View File

@ -18,6 +18,7 @@ package org.springframework.data.elasticsearch.repository.query;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHitSupport; import org.springframework.data.elasticsearch.core.SearchHitSupport;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
@ -71,7 +72,8 @@ public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery
elasticsearchOperations.delete(query, clazz, index); elasticsearchOperations.delete(query, clazz, index);
} else if (queryMethod.isPageQuery()) { } else if (queryMethod.isPageQuery()) {
query.setPageable(accessor.getPageable()); query.setPageable(accessor.getPageable());
result = elasticsearchOperations.searchForPage(query, clazz, index); SearchHits<?> searchHits = elasticsearchOperations.search(query, clazz, index);
result = SearchHitSupport.page(searchHits, query.getPageable());
} else if (queryMethod.isStreamQuery()) { } else if (queryMethod.isStreamQuery()) {
Class<?> entityType = clazz; Class<?> entityType = clazz;
if (accessor.getPageable().isUnpaged()) { if (accessor.getPageable().isUnpaged()) {

View File

@ -21,6 +21,7 @@ import java.util.regex.Pattern;
import org.springframework.core.convert.support.GenericConversionService; import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHitSupport; import org.springframework.data.elasticsearch.core.SearchHitSupport;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.convert.DateTimeConverters; import org.springframework.data.elasticsearch.core.convert.DateTimeConverters;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.elasticsearch.core.query.StringQuery;
@ -77,7 +78,8 @@ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQue
if (queryMethod.isPageQuery()) { if (queryMethod.isPageQuery()) {
stringQuery.setPageable(accessor.getPageable()); stringQuery.setPageable(accessor.getPageable());
result = elasticsearchOperations.searchForPage(stringQuery, clazz, index); SearchHits<?> searchHits = elasticsearchOperations.search(stringQuery, clazz, index);
result = SearchHitSupport.page(searchHits, stringQuery.getPageable());
} else if (queryMethod.isCollectionQuery()) { } else if (queryMethod.isCollectionQuery()) {
if (accessor.getPageable().isPaged()) { if (accessor.getPageable().isPaged()) {
stringQuery.setPageable(accessor.getPageable()); stringQuery.setPageable(accessor.getPageable());

View File

@ -39,6 +39,7 @@ import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.IndexOperations; import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHitSupport; import org.springframework.data.elasticsearch.core.SearchHitSupport;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
@ -139,8 +140,9 @@ public abstract class AbstractElasticsearchRepository<T, ID> implements Elastics
@Override @Override
public Page<T> findAll(Pageable pageable) { public Page<T> findAll(Pageable pageable) {
NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(pageable).build(); NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(pageable).build();
AggregatedPage<SearchHit<T>> page = operations.searchForPage(query, getEntityClass(), getIndexCoordinates()); SearchHits<T> searchHits = operations.search(query, getEntityClass(), getIndexCoordinates());
return unwrapSearchHits(page); AggregatedPage<SearchHit<T>> page = SearchHitSupport.page(searchHits, query.getPageable());
return (Page<T>) SearchHitSupport.unwrapSearchHits(page);
} }
@Override @Override
@ -152,12 +154,9 @@ public abstract class AbstractElasticsearchRepository<T, ID> implements Elastics
} }
NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withPageable(PageRequest.of(0, itemCount, sort)).build(); .withPageable(PageRequest.of(0, itemCount, sort)).build();
AggregatedPage<SearchHit<T>> page = operations.searchForPage(query, getEntityClass(), getIndexCoordinates()); List<SearchHit<T>> searchHitList = operations.search(query, getEntityClass(), getIndexCoordinates())
return unwrapSearchHits(page); .getSearchHits();
} return (List<T>) SearchHitSupport.unwrapSearchHits(searchHitList);
private Page<T> unwrapSearchHits(AggregatedPage<SearchHit<T>> page) {
return (Page<T>) SearchHitSupport.unwrapSearchHits(page);
} }
@Override @Override
@ -226,21 +225,24 @@ public abstract class AbstractElasticsearchRepository<T, ID> implements Elastics
return new PageImpl<>(Collections.<T> emptyList()); return new PageImpl<>(Collections.<T> emptyList());
} }
searchQuery.setPageable(PageRequest.of(0, count)); searchQuery.setPageable(PageRequest.of(0, count));
AggregatedPage<SearchHit<T>> page = operations.searchForPage(searchQuery, getEntityClass(), getIndexCoordinates()); SearchHits<T> searchHits = operations.search(searchQuery, getEntityClass(), getIndexCoordinates());
return unwrapSearchHits(page); AggregatedPage<SearchHit<T>> page = SearchHitSupport.page(searchHits, searchQuery.getPageable());
return (Page<T>) SearchHitSupport.unwrapSearchHits(page);
} }
@Override @Override
public Page<T> search(QueryBuilder query, Pageable pageable) { public Page<T> search(QueryBuilder query, Pageable pageable) {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(query).withPageable(pageable).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(query).withPageable(pageable).build();
AggregatedPage<SearchHit<T>> page = operations.searchForPage(searchQuery, getEntityClass(), getIndexCoordinates()); SearchHits<T> searchHits = operations.search(searchQuery, getEntityClass(), getIndexCoordinates());
return unwrapSearchHits(page); AggregatedPage<SearchHit<T>> page = SearchHitSupport.page(searchHits, searchQuery.getPageable());
return (Page<T>) SearchHitSupport.unwrapSearchHits(page);
} }
@Override @Override
public Page<T> search(Query query) { public Page<T> search(Query query) {
AggregatedPage<SearchHit<T>> page = operations.searchForPage(query, getEntityClass(), getIndexCoordinates()); SearchHits<T> searchHits = operations.search(query, getEntityClass(), getIndexCoordinates());
return unwrapSearchHits(page); AggregatedPage<SearchHit<T>> page = SearchHitSupport.page(searchHits, query.getPageable());
return (Page<T>) SearchHitSupport.unwrapSearchHits(page);
} }
@Override @Override
@ -255,8 +257,9 @@ public abstract class AbstractElasticsearchRepository<T, ID> implements Elastics
query.addFields(fields); query.addFields(fields);
} }
AggregatedPage<SearchHit<T>> page = operations.search(query, getEntityClass(), getIndexCoordinates()); SearchHits<T> searchHits = operations.search(query, getEntityClass(), getIndexCoordinates());
return unwrapSearchHits(page); AggregatedPage<SearchHit<T>> page = SearchHitSupport.page(searchHits, pageable);
return (Page<T>) SearchHitSupport.unwrapSearchHits(page);
} }
@Override @Override

View File

@ -38,16 +38,13 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.InnerField; import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField; import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.GetQuery; import org.springframework.data.elasticsearch.core.query.GetQuery;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
@ -196,11 +193,11 @@ public class NestedObjectTests {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
Page<SearchHit<PersonMultipleLevelNested>> personIndexed = elasticsearchTemplate.searchForPage(searchQuery, SearchHits<PersonMultipleLevelNested> personIndexed = elasticsearchTemplate.search(searchQuery,
PersonMultipleLevelNested.class, index); PersonMultipleLevelNested.class, index);
assertThat(personIndexed).isNotNull(); assertThat(personIndexed).isNotNull();
assertThat(personIndexed.getTotalElements()).isEqualTo(1); assertThat(personIndexed.getTotalHits()).isEqualTo(1);
assertThat(personIndexed.getContent().get(0).getContent().getId()).isEqualTo("1"); assertThat(personIndexed.getSearchHit(0).getContent().getId()).isEqualTo("1");
} }
private List<IndexQuery> createPerson() { private List<IndexQuery> createPerson() {
@ -381,10 +378,10 @@ public class NestedObjectTests {
// then // then
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"), ScoreMode.None)).build(); .withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"), ScoreMode.None)).build();
AggregatedPage<SearchHit<Book>> books = elasticsearchTemplate.searchForPage(searchQuery, Book.class, index); SearchHits<Book> books = elasticsearchTemplate.search(searchQuery, Book.class, index);
assertThat(books.getContent()).hasSize(1); assertThat(books.getSearchHits()).hasSize(1);
assertThat(books.getContent().get(0).getContent().getId()).isEqualTo(book2.getId()); assertThat(books.getSearchHit(0).getContent().getId()).isEqualTo(book2.getId());
} }
@Setter @Setter

View File

@ -60,7 +60,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version; import org.springframework.data.annotation.Version;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
@ -73,7 +72,6 @@ import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField; import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.annotations.Score; import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField; import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.geo.GeoPoint; import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.*; import org.springframework.data.elasticsearch.core.query.*;
@ -271,7 +269,7 @@ public abstract class ElasticsearchTemplateTests {
} }
@Test @Test
public void shouldReturnPageForGivenSearchQuery() { public void shouldReturnSearchHitsForGivenSearchQuery() {
// given // given
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
@ -286,15 +284,15 @@ public abstract class ElasticsearchTemplateTests {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(sampleEntities.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test // DATAES-595 @Test // DATAES-595
public void shouldReturnPageUsingLocalPreferenceForGivenSearchQuery() { public void shouldReturnSearchHitsUsingLocalPreferenceForGivenSearchQuery() {
// given // given
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
@ -310,12 +308,11 @@ public abstract class ElasticsearchTemplateTests {
.withPreference("_local").build(); .withPreference("_local").build();
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQueryWithValidPreference, SearchHits<SampleEntity> searchHits = operations.search(searchQueryWithValidPreference, SampleEntity.class, index);
SampleEntity.class, index);
// then // then
assertThat(sampleEntities).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(sampleEntities.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test // DATAES-595 @Test // DATAES-595
@ -336,7 +333,7 @@ public abstract class ElasticsearchTemplateTests {
// when // when
assertThatThrownBy(() -> { assertThatThrownBy(() -> {
operations.searchForPage(searchQueryWithInvalidPreference, SampleEntity.class, index); operations.search(searchQueryWithInvalidPreference, SampleEntity.class, index);
}).isInstanceOf(Exception.class); }).isInstanceOf(Exception.class);
} }
@ -353,15 +350,16 @@ public abstract class ElasticsearchTemplateTests {
operations.index(idxQuery, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); operations.index(idxQuery, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type"));
indexOperations.refresh(IndexCoordinates.of(INDEX_1_NAME)); indexOperations.refresh(IndexCoordinates.of(INDEX_1_NAME));
// when
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withIndicesOptions(IndicesOptions.lenientExpandOpen()).build(); .withIndicesOptions(IndicesOptions.lenientExpandOpen()).build();
Page<SearchHit<SampleEntity>> entities = operations.searchForPage(searchQuery, SampleEntity.class,
// when
SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class,
IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME)); IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME));
// then // then
assertThat(entities).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(entities.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -381,15 +379,16 @@ public abstract class ElasticsearchTemplateTests {
.version(System.currentTimeMillis()).build(); .version(System.currentTimeMillis()).build();
indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2));
// when
operations.bulkIndex(indexQueries, index); operations.bulkIndex(indexQueries, index);
indexOperations.refresh(SampleEntity.class); indexOperations.refresh(SampleEntity.class);
// then
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(2); // when
SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then
assertThat(searchHits.getTotalHits()).isEqualTo(2);
} }
@Test @Test
@ -443,8 +442,9 @@ public abstract class ElasticsearchTemplateTests {
// then // then
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(0);
assertThat(searchHits.getTotalHits()).isEqualTo(0);
} }
@Test @Test
@ -465,8 +465,8 @@ public abstract class ElasticsearchTemplateTests {
// then // then
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> sampleEntities = operations.search(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(0); assertThat(sampleEntities.getTotalHits()).isEqualTo(0);
} }
@Test @Test
@ -490,8 +490,8 @@ public abstract class ElasticsearchTemplateTests {
// then // then
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(0); assertThat(searchHits.getTotalHits()).isEqualTo(0);
} }
@Test // DATAES-547 @Test // DATAES-547
@ -578,10 +578,10 @@ public abstract class ElasticsearchTemplateTests {
.withFilter(boolQuery().filter(termQuery("id", documentId))).build(); .withFilter(boolQuery().filter(termQuery("id", documentId))).build();
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
} }
@Test @Test
@ -613,11 +613,11 @@ public abstract class ElasticsearchTemplateTests {
.withSort(new FieldSortBuilder("rate").order(SortOrder.ASC)).build(); .withSort(new FieldSortBuilder("rate").order(SortOrder.ASC)).build();
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isEqualTo(3); assertThat(searchHits.getTotalHits()).isEqualTo(3);
assertThat(sampleEntities.getContent().get(0).getContent().getRate()).isEqualTo(sampleEntity2.getRate()); assertThat(searchHits.getSearchHit(0).getContent().getRate()).isEqualTo(sampleEntity2.getRate());
} }
@Test @Test
@ -650,12 +650,12 @@ public abstract class ElasticsearchTemplateTests {
.withSort(new FieldSortBuilder("message").order(SortOrder.ASC)).build(); .withSort(new FieldSortBuilder("message").order(SortOrder.ASC)).build();
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isEqualTo(3); assertThat(searchHits.getTotalHits()).isEqualTo(3);
assertThat(sampleEntities.getContent().get(0).getContent().getRate()).isEqualTo(sampleEntity2.getRate()); assertThat(searchHits.getSearchHit(0).getContent().getRate()).isEqualTo(sampleEntity2.getRate());
assertThat(sampleEntities.getContent().get(1).getContent().getMessage()).isEqualTo(sampleEntity1.getMessage()); assertThat(searchHits.getSearchHit(1).getContent().getMessage()).isEqualTo(sampleEntity1.getMessage());
} }
@Test // DATAES-312 @Test // DATAES-312
@ -688,12 +688,12 @@ public abstract class ElasticsearchTemplateTests {
.withPageable(PageRequest.of(0, 10, Sort.by(Sort.Order.asc("message").nullsFirst()))).build(); .withPageable(PageRequest.of(0, 10, Sort.by(Sort.Order.asc("message").nullsFirst()))).build();
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isEqualTo(3); assertThat(searchHits.getTotalHits()).isEqualTo(3);
assertThat(sampleEntities.getContent().get(0).getContent().getRate()).isEqualTo(sampleEntity3.getRate()); assertThat(searchHits.getSearchHit(0).getContent().getRate()).isEqualTo(sampleEntity3.getRate());
assertThat(sampleEntities.getContent().get(1).getContent().getMessage()).isEqualTo(sampleEntity1.getMessage()); assertThat(searchHits.getSearchHit(1).getContent().getMessage()).isEqualTo(sampleEntity1.getMessage());
} }
@Test // DATAES-312 @Test // DATAES-312
@ -726,12 +726,12 @@ public abstract class ElasticsearchTemplateTests {
.withPageable(PageRequest.of(0, 10, Sort.by(Sort.Order.asc("message").nullsLast()))).build(); .withPageable(PageRequest.of(0, 10, Sort.by(Sort.Order.asc("message").nullsLast()))).build();
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isEqualTo(3); assertThat(searchHits.getTotalHits()).isEqualTo(3);
assertThat(sampleEntities.getContent().get(0).getContent().getRate()).isEqualTo(sampleEntity1.getRate()); assertThat(searchHits.getSearchHit(0).getContent().getRate()).isEqualTo(sampleEntity1.getRate());
assertThat(sampleEntities.getContent().get(1).getContent().getMessage()).isEqualTo(sampleEntity2.getMessage()); assertThat(searchHits.getSearchHit(1).getContent().getMessage()).isEqualTo(sampleEntity2.getMessage());
} }
@Test // DATAES-467, DATAES-657 @Test // DATAES-467, DATAES-657
@ -752,12 +752,12 @@ public abstract class ElasticsearchTemplateTests {
.build(); .build();
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(page.getTotalElements()).isEqualTo(2); assertThat(searchHits.getTotalHits()).isEqualTo(2);
assertThat(page.getContent().get(0).getContent().getId()).isEqualTo("2"); assertThat(searchHits.getSearchHit(0).getContent().getId()).isEqualTo("2");
assertThat(page.getContent().get(1).getContent().getId()).isEqualTo("1"); assertThat(searchHits.getSearchHit(1).getContent().getId()).isEqualTo("1");
} }
@Test @Test
@ -776,10 +776,10 @@ public abstract class ElasticsearchTemplateTests {
StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); StringQuery stringQuery = new StringQuery(matchAllQuery().toString());
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(stringQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(stringQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
} }
@Test @Test
@ -807,11 +807,11 @@ public abstract class ElasticsearchTemplateTests {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withScriptField( NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withScriptField(
new ScriptField("scriptedRate", new Script(ScriptType.INLINE, "expression", "doc['rate'] * factor", params))) new ScriptField("scriptedRate", new Script(ScriptType.INLINE, "expression", "doc['rate'] * factor", params)))
.build(); .build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
assertThat(sampleEntities.getContent().get(0).getContent().getScriptedRate()).isEqualTo(4.0); assertThat(searchHits.getSearchHit(0).getContent().getScriptedRate()).isEqualTo(4.0);
} }
@Test @Test
@ -830,14 +830,14 @@ public abstract class ElasticsearchTemplateTests {
StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), PageRequest.of(0, 10)); StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), PageRequest.of(0, 10));
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(stringQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(stringQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldReturnSortedPageableResultsGivenStringQuery() { public void shouldReturnSortedResultsGivenStringQuery() {
// given // given
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
@ -857,10 +857,10 @@ public abstract class ElasticsearchTemplateTests {
Sort.by(Order.asc("message"))); Sort.by(Order.asc("message")));
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(stringQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(stringQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -962,12 +962,12 @@ public abstract class ElasticsearchTemplateTests {
.build(); .build();
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
final SampleEntity actual = page.getContent().get(0).getContent(); final SampleEntity actual = searchHits.getSearchHit(0).getContent();
assertThat(actual.message).isEqualTo(message); assertThat(actual.message).isEqualTo(message);
assertThat(actual.getType()).isNull(); assertThat(actual.getType()).isNull();
assertThat(actual.getLocation()).isNull(); assertThat(actual.getLocation()).isNull();
@ -994,12 +994,12 @@ public abstract class ElasticsearchTemplateTests {
.withSourceFilter(sourceFilter.build()).build(); .withSourceFilter(sourceFilter.build()).build();
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
assertThat(page.getContent().get(0).getContent().getMessage()).isEqualTo(message); assertThat(searchHits.getSearchHit(0).getContent().getMessage()).isEqualTo(message);
} }
@Test @Test
@ -1034,11 +1034,11 @@ public abstract class ElasticsearchTemplateTests {
moreLikeThisQuery.setMinDocFreq(1); moreLikeThisQuery.setMinDocFreq(1);
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.search(moreLikeThisQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(moreLikeThisQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
List<SampleEntity> content = sampleEntities.getContent().stream().map(SearchHit::getContent) List<SampleEntity> content = searchHits.getSearchHits().stream().map(SearchHit::getContent)
.collect(Collectors.toList()); .collect(Collectors.toList());
assertThat(content).contains(sampleEntity); assertThat(content).contains(sampleEntity);
} }
@ -1564,10 +1564,9 @@ public abstract class ElasticsearchTemplateTests {
queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("message", "ac")).build()); queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("message", "ac")).build());
// then // then
List<AggregatedPage<SearchHit<SampleEntity>>> sampleEntities = operations.multiSearchForPage(queries, List<SearchHits<SampleEntity>> searchHits = operations.multiSearch(queries, SampleEntity.class, index);
SampleEntity.class, index); for (SearchHits<SampleEntity> sampleEntity : searchHits) {
for (Page<SearchHit<SampleEntity>> sampleEntity : sampleEntities) { assertThat(sampleEntity.getTotalHits()).isEqualTo(1);
assertThat(sampleEntity.getTotalElements()).isEqualTo(1);
} }
} }
@ -1593,18 +1592,17 @@ public abstract class ElasticsearchTemplateTests {
queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("message", "ab")).build()); queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("message", "ab")).build());
queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("description", "bc")).build()); queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("description", "bc")).build());
List<AggregatedPage<? extends SearchHit<?>>> pages = operations.multiSearchForPage(queries, List<SearchHits<?>> searchHitsList = operations.multiSearch(queries, Lists.newArrayList(SampleEntity.class, clazz),
Lists.newArrayList(SampleEntity.class, clazz),
IndexCoordinates.of(index.getIndexName(), bookIndex.getIndexName())); IndexCoordinates.of(index.getIndexName(), bookIndex.getIndexName()));
// then // then
Page<?> page0 = pages.get(0); SearchHits<?> searchHits0 = searchHitsList.get(0);
assertThat(page0.getTotalElements()).isEqualTo(1L); assertThat(searchHits0.getTotalHits()).isEqualTo(1L);
SearchHit<SampleEntity> searchHit0 = (SearchHit<SampleEntity>) page0.getContent().get(0); SearchHit<SampleEntity> searchHit0 = (SearchHit<SampleEntity>) searchHits0.getSearchHit(0);
assertThat(searchHit0.getContent().getClass()).isEqualTo(SampleEntity.class); assertThat(searchHit0.getContent().getClass()).isEqualTo(SampleEntity.class);
Page<?> page1 = pages.get(1); SearchHits<?> searchHits1 = searchHitsList.get(1);
assertThat(page1.getTotalElements()).isEqualTo(1L); assertThat(searchHits1.getTotalHits()).isEqualTo(1L);
SearchHit<Book> searchHit1 = (SearchHit<Book>) page1.getContent().get(0); SearchHit<Book> searchHit1 = (SearchHit<Book>) searchHits1.getSearchHit(0);
assertThat(searchHit1.getContent().getClass()).isEqualTo(clazz); assertThat(searchHit1.getContent().getClass()).isEqualTo(clazz);
} }
@ -1629,8 +1627,8 @@ public abstract class ElasticsearchTemplateTests {
// then // then
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(0); assertThat(searchHits.getTotalHits()).isEqualTo(0);
} }
@Test @Test
@ -1649,10 +1647,10 @@ public abstract class ElasticsearchTemplateTests {
.build(); .build();
// then // then
Page<SearchHit<SampleEntity>> page = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getContent()).hasSize(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
assertThat(page.getContent().get(0).getContent().getId()).isEqualTo(indexQuery.getId()); assertThat(searchHits.getSearchHit(0).getContent().getId()).isEqualTo(indexQuery.getId());
} }
@Test @Test
@ -1699,11 +1697,11 @@ public abstract class ElasticsearchTemplateTests {
.withQuery(boolQuery().must(wildcardQuery("message", "*a*")).should(wildcardQuery("message", "*b*"))) .withQuery(boolQuery().must(wildcardQuery("message", "*a*")).should(wildcardQuery("message", "*b*")))
.withMinScore(2.0F).build(); .withMinScore(2.0F).build();
Page<SearchHit<SampleEntity>> page = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(page.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
assertThat(page.getContent().get(0).getContent().getMessage()).isEqualTo("ab"); assertThat(searchHits.getSearchHit(0).getContent().getMessage()).isEqualTo("ab");
} }
@Test // DATAES-462 @Test // DATAES-462
@ -1723,12 +1721,11 @@ public abstract class ElasticsearchTemplateTests {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("message", "xz")) NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("message", "xz"))
.withSort(SortBuilders.fieldSort("message")).withTrackScores(true).build(); .withSort(SortBuilders.fieldSort("message")).withTrackScores(true).build();
Page<SearchHit<SampleEntity>> page = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(page).isInstanceOf(AggregatedPage.class); assertThat(searchHits.getMaxScore()).isGreaterThan(0f);
assertThat(((AggregatedPage) page).getMaxScore()).isGreaterThan(0f); assertThat(searchHits.getSearchHit(0).getScore()).isGreaterThan(0f);
assertThat(page.getContent().get(0).getScore()).isGreaterThan(0f);
} }
@Test @Test
@ -1784,12 +1781,12 @@ public abstract class ElasticsearchTemplateTests {
// then // then
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(2);
List<SearchHit<SampleEntity>> content = sampleEntities.getContent(); assertThat(searchHits.getTotalHits()).isEqualTo(2);
assertThat(content.get(0).getContent().getId()).isNotNull();
assertThat(content.get(1).getContent().getId()).isNotNull(); assertThat(searchHits.getSearchHit(0).getContent().getId()).isNotNull();
assertThat(searchHits.getSearchHit(1).getContent().getId()).isNotNull();
} }
@Test @Test
@ -1828,12 +1825,11 @@ public abstract class ElasticsearchTemplateTests {
// then // then
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
Page<SearchHit<Map>> sampleEntities = operations.searchForPage(searchQuery, Map.class, index); SearchHits<Map> searchHits = operations.search(searchQuery, Map.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(2); assertThat(searchHits.getTotalHits()).isEqualTo(2);
List<SearchHit<Map>> content = sampleEntities.getContent(); assertThat(searchHits.getSearchHit(0).getContent().get("userId")).isEqualTo(person1.get("userId"));
assertThat(content.get(0).getContent().get("userId")).isEqualTo(person1.get("userId")); assertThat(searchHits.getSearchHit(1).getContent().get("userId")).isEqualTo(person2.get("userId"));
assertThat(content.get(1).getContent().get("userId")).isEqualTo(person2.get("userId"));
} }
@Test // DATAES-523 @Test // DATAES-523
@ -1852,10 +1848,10 @@ public abstract class ElasticsearchTemplateTests {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
// when // when
Page<SearchHit<GTEVersionEntity>> entities = operations.searchForPage(searchQuery, GTEVersionEntity.class, index); SearchHits<GTEVersionEntity> entities = operations.search(searchQuery, GTEVersionEntity.class, index);
// then // then
assertThat(entities).isNotNull(); assertThat(entities).isNotNull();
assertThat(entities.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(entities.getTotalHits()).isGreaterThanOrEqualTo(1);
// reindex with same version // reindex with same version
operations.index(indexQueryBuilder.build(), index); operations.index(indexQueryBuilder.build(), index);
@ -1883,11 +1879,11 @@ public abstract class ElasticsearchTemplateTests {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
// when // when
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(sampleEntities).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(sampleEntities.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test // DATAES-106 @Test // DATAES-106
@ -2287,10 +2283,10 @@ public abstract class ElasticsearchTemplateTests {
// when // when
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
Page<SearchHit<ResultAggregator>> page = operations.searchForPage(searchQuery, ResultAggregator.class, SearchHits<ResultAggregator> page = operations.search(searchQuery, ResultAggregator.class,
IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME)); IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME));
assertThat(page.getTotalElements()).isEqualTo(2); assertThat(page.getTotalHits()).isEqualTo(2);
} }
@Test @Test
@ -2348,9 +2344,9 @@ public abstract class ElasticsearchTemplateTests {
// then // then
// document with id "remainingDocumentId" should still be indexed // document with id "remainingDocumentId" should still be indexed
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
assertThat(sampleEntities.getContent().get(0).getContent().getId()).isEqualTo(remainingDocumentId); assertThat(searchHits.getSearchHit(0).getContent().getId()).isEqualTo(remainingDocumentId);
} }
@Test // DATAES-525 @Test // DATAES-525
@ -2379,9 +2375,9 @@ public abstract class ElasticsearchTemplateTests {
// then // then
// document with id "remainingDocumentId" should still be indexed // document with id "remainingDocumentId" should still be indexed
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
assertThat(sampleEntities.getContent().get(0).getContent().getId()).isEqualTo(remainingDocumentId); assertThat(searchHits.getSearchHit(0).getContent().getId()).isEqualTo(remainingDocumentId);
} }
@Test // DATAES-525 @Test // DATAES-525
@ -2408,9 +2404,9 @@ public abstract class ElasticsearchTemplateTests {
// then // then
// document with id "remainingDocumentId" should still be indexed // document with id "remainingDocumentId" should still be indexed
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
Page<SearchHit<SampleEntity>> sampleEntities = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
assertThat(sampleEntities.getTotalElements()).isEqualTo(1L); assertThat(searchHits.getTotalHits()).isEqualTo(1L);
assertThat(sampleEntities.getContent().get(0).getContent().getId()).isEqualTo(remainingDocumentId); assertThat(searchHits.getSearchHit(0).getContent().getId()).isEqualTo(remainingDocumentId);
} }
@Test // DATAES-525 @Test // DATAES-525
@ -2634,14 +2630,14 @@ public abstract class ElasticsearchTemplateTests {
.build(); .build();
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(searchQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isEqualTo(3); assertThat(searchHits.getTotalHits()).isEqualTo(3);
assertThat(page.getContent()).hasSize(2); assertThat(searchHits.getSearchHits()).hasSize(2);
assertThat(page.getContent().get(0).getContent().getMessage()).isEqualTo("message 1"); assertThat(searchHits.getSearchHit(0).getContent().getMessage()).isEqualTo("message 1");
assertThat(page.getContent().get(1).getContent().getMessage()).isEqualTo("message 2"); assertThat(searchHits.getSearchHit(1).getContent().getMessage()).isEqualTo("message 2");
} }
private IndexQuery getIndexQuery(SampleEntity sampleEntity) { private IndexQuery getIndexQuery(SampleEntity sampleEntity) {

View File

@ -42,6 +42,7 @@ import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.InnerField; import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField; import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.ResultsExtractor; import org.springframework.data.elasticsearch.core.ResultsExtractor;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
@ -120,12 +121,9 @@ public class ElasticsearchTemplateAggregationTests {
.addAggregation(terms("subjects").field("subject")) // .addAggregation(terms("subjects").field("subject")) //
.build(); .build();
// when // when
Aggregations aggregations = operations.query(searchQuery, new ResultsExtractor<Aggregations>() { SearchHits<ArticleEntity> searchHits = operations.search(searchQuery, ArticleEntity.class, IndexCoordinates.of(INDEX_NAME));
@Override Aggregations aggregations = searchHits.getAggregations();
public Aggregations extract(SearchResponse response) {
return response.getAggregations();
}
}, null, IndexCoordinates.of(INDEX_NAME).withTypes("article"));
// then // then
assertThat(aggregations).isNotNull(); assertThat(aggregations).isNotNull();
assertThat(aggregations.asMap().get("subjects")).isNotNull(); assertThat(aggregations.asMap().get("subjects")).isNotNull();

View File

@ -37,12 +37,12 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version; import org.springframework.data.annotation.Version;
import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score; import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchRestTemplateConfiguration; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchRestTemplateConfiguration;
import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest;
@ -137,11 +137,11 @@ public class CriteriaQueryTests {
new Criteria("message").contains("some").or("message").contains("test")); new Criteria("message").contains("some").or("message").contains("test"));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -168,14 +168,13 @@ public class CriteriaQueryTests {
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
// @Ignore("DATAES-30")
@Test @Test
public void shouldPerformOrOperationWithinCriteria() { public void shouldPerformOrOperationWithinCriteria() {
@ -199,11 +198,11 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().or(new Criteria("message").contains("some"))); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().or(new Criteria("message").contains("some")));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -228,11 +227,11 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message"));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -270,11 +269,11 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message"));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(page.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
} }
@Test @Test
@ -520,12 +519,12 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("foo").not()); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("foo").not());
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(criteriaQuery.getCriteria().isNegating()).isTrue(); assertThat(criteriaQuery.getCriteria().isNegating()).isTrue();
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.iterator().next().getContent().getMessage()).doesNotContain("foo"); assertThat(searchHits.iterator().next().getContent().getMessage()).doesNotContain("foo");
} }
@Test @Test
@ -606,11 +605,11 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(350, null)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(350, null));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -649,11 +648,11 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(null, 550)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(null, 550));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -692,11 +691,11 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").lessThanEqual(750)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").lessThanEqual(750));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -735,11 +734,11 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").greaterThanEqual(950)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").greaterThanEqual(950));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page).isNotNull(); assertThat(searchHits).isNotNull();
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -778,10 +777,10 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("foo").boost(1)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("foo").boost(1));
// when // when
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); assertThat(searchHits.getTotalHits()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
@ -801,11 +800,11 @@ public class CriteriaQueryTests {
CriteriaQuery criteriaQuery = new CriteriaQuery( CriteriaQuery criteriaQuery = new CriteriaQuery(
new Criteria("message").contains("a").or(new Criteria("message").contains("b"))); new Criteria("message").contains("a").or(new Criteria("message").contains("b")));
criteriaQuery.setMinScore(2.0F); criteriaQuery.setMinScore(2.0F);
Page<SearchHit<SampleEntity>> page = operations.searchForPage(criteriaQuery, SampleEntity.class, index); SearchHits<SampleEntity> searchHits = operations.search(criteriaQuery, SampleEntity.class, index);
// then // then
assertThat(page.getTotalElements()).isEqualTo(1); assertThat(searchHits.getTotalHits()).isEqualTo(1);
assertThat(page.getContent().get(0).getContent().getMessage()).isEqualTo("ab"); assertThat(searchHits.getSearchHit(0).getContent().getMessage()).isEqualTo("ab");
} }
@Test // DATAES-213 @Test // DATAES-213