Skip to content

Commit b0c2ce3

Browse files
authored
Overload multiSearch method to support list of IndexCoordinates.
Original Pull Request #2436 Closes #2434
1 parent b3f9bdb commit b0c2ce3

File tree

4 files changed

+108
-1
lines changed

4 files changed

+108
-1
lines changed

src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java

+24
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
* Elasticsearch client.
7070
*
7171
* @author Peter-Josef Meisch
72+
* @author Hamid Rahimi
7273
* @since 4.4
7374
*/
7475
public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
@@ -465,6 +466,29 @@ public List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class
465466
return doMultiSearch(multiSearchQueryParameters);
466467
}
467468

469+
@Override
470+
public List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class<?>> classes,
471+
List<IndexCoordinates> indexes) {
472+
473+
Assert.notNull(queries, "queries must not be null");
474+
Assert.notNull(classes, "classes must not be null");
475+
Assert.notNull(indexes, "indexes must not be null");
476+
Assert.isTrue(queries.size() == classes.size() && queries.size() == indexes.size(),
477+
"queries, classes and indexes must have the same size");
478+
479+
List<MultiSearchQueryParameter> multiSearchQueryParameters = new ArrayList<>(queries.size());
480+
Iterator<Class<?>> it = classes.iterator();
481+
Iterator<IndexCoordinates> indexesIt = indexes.iterator();
482+
483+
for (Query query : queries) {
484+
Class<?> clazz = it.next();
485+
IndexCoordinates index = indexesIt.next();
486+
multiSearchQueryParameters.add(new MultiSearchQueryParameter(query, clazz, index));
487+
}
488+
489+
return doMultiSearch(multiSearchQueryParameters);
490+
}
491+
468492
@SuppressWarnings({ "unchecked", "rawtypes" })
469493
private List<SearchHits<?>> doMultiSearch(List<MultiSearchQueryParameter> multiSearchQueryParameters) {
470494

src/main/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchRestTemplate.java

+37
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
* @author Massimiliano Poggi
113113
* @author Farid Faoudi
114114
* @author Sijia Liu
115+
* @author Hamid Rahimi
115116
* @since 4.4
116117
* @deprecated since 5.0
117118
*/
@@ -558,6 +559,42 @@ public List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class
558559
return res;
559560
}
560561

562+
@Override
563+
public List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class<?>> classes,
564+
List<IndexCoordinates> indexes) {
565+
566+
Assert.notNull(queries, "queries must not be null");
567+
Assert.notNull(classes, "classes must not be null");
568+
Assert.notNull(indexes, "indexes must not be null");
569+
Assert.isTrue(queries.size() == classes.size() && queries.size() == indexes.size(),
570+
"queries, classes and indexes must have the same size");
571+
572+
MultiSearchRequest request = new MultiSearchRequest();
573+
Iterator<Class<?>> it = classes.iterator();
574+
Iterator<IndexCoordinates> indexesIt = indexes.iterator();
575+
for (Query query : queries) {
576+
request.add(requestFactory.searchRequest(query, it.next(), indexesIt.next()));
577+
}
578+
579+
MultiSearchResponse.Item[] items = getMultiSearchResult(request);
580+
581+
List<SearchHits<?>> res = new ArrayList<>(queries.size());
582+
Iterator<Class<?>> it1 = classes.iterator();
583+
Iterator<IndexCoordinates> indexesIt1 = indexes.iterator();
584+
for (int i = 0; i < queries.size(); i++) {
585+
Class entityClass = it1.next();
586+
IndexCoordinates index = indexesIt1.next();
587+
588+
ReadDocumentCallback<?> documentCallback = new ReadDocumentCallback<>(elasticsearchConverter, entityClass, index);
589+
SearchDocumentResponseCallback<SearchHits<?>> callback = new ReadSearchDocumentResponseCallback<>(entityClass,
590+
index);
591+
592+
SearchResponse response = items[i].getResponse();
593+
res.add(callback.doWith(SearchDocumentResponseBuilder.from(response, getEntityCreator(documentCallback))));
594+
}
595+
return res;
596+
}
597+
561598
protected MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest request) {
562599
MultiSearchResponse response = execute(client -> client.msearch(request, RequestOptions.DEFAULT));
563600
MultiSearchResponse.Item[] items = response.getResponses();

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

+12-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
*
3131
* @author Peter-Josef Meisch
3232
* @author Sascha Woo
33+
* @author Hamid Rahimi
3334
* @since 4.0
3435
*/
3536
public interface SearchOperations {
@@ -127,11 +128,21 @@ default <T> SearchHit<T> searchOne(Query query, Class<T> clazz, IndexCoordinates
127128
*
128129
* @param queries the queries to execute
129130
* @param classes the entity classes used for property mapping
130-
* @param index the index to run the query against
131+
* @param index the index to run the queries against
131132
* @return list of SearchHits
132133
*/
133134
List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class<?>> classes, IndexCoordinates index);
134135

136+
/**
137+
* Execute the multi search query against elasticsearch and return result as {@link List} of {@link SearchHits}.
138+
*
139+
* @param queries the queries to execute
140+
* @param classes the entity classes used for property mapping
141+
* @param indexes the indexes to run the queries against
142+
* @return list of SearchHits
143+
*/
144+
List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class<?>> classes, List<IndexCoordinates> indexes);
145+
135146
/**
136147
* Execute the criteria query against elasticsearch and return result as {@link SearchHits}
137148
*

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

+35
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
* @author Sijia Liu
109109
* @author Haibo Liu
110110
* @author scoobyzhang
111+
* @author Hamid Rahimi
111112
*/
112113
@SpringIntegrationTest
113114
public abstract class ElasticsearchIntegrationTests {
@@ -1764,6 +1765,40 @@ public void shouldReturnDifferentEntityForMultiSearch() {
17641765
assertThat(searchHit1.getContent().getClass()).isEqualTo(Book.class);
17651766
}
17661767

1768+
@Test // #2434
1769+
public void shouldReturnDifferentEntityForMultiSearchWithMultipleIndexCoordinates() {
1770+
1771+
IndexOperations bookIndexOperations = operations.indexOps(Book.class);
1772+
bookIndexOperations.delete();
1773+
bookIndexOperations.createWithMapping();
1774+
bookIndexOperations.refresh();
1775+
IndexCoordinates bookIndex = IndexCoordinates.of("i-need-my-own-index");
1776+
operations.index(buildIndex(SampleEntity.builder().id("1").message("ab").build()),
1777+
IndexCoordinates.of(indexNameProvider.indexName()));
1778+
operations.index(buildIndex(Book.builder().id("2").description("bc").build()), bookIndex);
1779+
bookIndexOperations.refresh();
1780+
1781+
List<Query> queries = new ArrayList<>();
1782+
queries.add(getTermQuery("message", "ab"));
1783+
queries.add(getTermQuery("description", "bc"));
1784+
1785+
List<SearchHits<?>> searchHitsList = operations.multiSearch(queries,
1786+
Lists.newArrayList(SampleEntity.class, Book.class),
1787+
List.of(IndexCoordinates.of(indexNameProvider.indexName()),
1788+
IndexCoordinates.of(bookIndex.getIndexName())));
1789+
1790+
bookIndexOperations.delete();
1791+
1792+
SearchHits<?> searchHits0 = searchHitsList.get(0);
1793+
assertThat(searchHits0.getTotalHits()).isEqualTo(1L);
1794+
SearchHit<SampleEntity> searchHit0 = (SearchHit<SampleEntity>) searchHits0.getSearchHit(0);
1795+
assertThat(searchHit0.getContent().getClass()).isEqualTo(SampleEntity.class);
1796+
SearchHits<?> searchHits1 = searchHitsList.get(1);
1797+
assertThat(searchHits1.getTotalHits()).isEqualTo(1L);
1798+
SearchHit<Book> searchHit1 = (SearchHit<Book>) searchHits1.getSearchHit(0);
1799+
assertThat(searchHit1.getContent().getClass()).isEqualTo(Book.class);
1800+
}
1801+
17671802
@Test
17681803
public void shouldIndexDocumentForSpecifiedSource() {
17691804

0 commit comments

Comments
 (0)