Skip to content

Commit c0b26a5

Browse files
authored
Add new Elasticsearch client as an alternative to the existing REST client.
Original Pull Request #2160 Closes #1973
1 parent 3dbb1e7 commit c0b26a5

26 files changed

+329
-138
lines changed

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

+25-3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.Collection;
3232
import java.util.List;
3333
import java.util.Optional;
34+
import java.util.Set;
3435
import java.util.stream.Collectors;
3536

3637
import org.springframework.data.elasticsearch.core.convert.GeoConverters;
@@ -67,9 +68,13 @@ public static Optional<Query> createQuery(Criteria criteria) {
6768
for (Criteria chainedCriteria : criteria.getCriteriaChain()) {
6869

6970
if (chainedCriteria.isOr()) {
70-
// todo #1973
71+
BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
72+
queriesForEntries(chainedCriteria).forEach(boolQueryBuilder::should);
73+
filterQueries.add(new Query(boolQueryBuilder.build()));
7174
} else if (chainedCriteria.isNegating()) {
72-
// todo #1973
75+
Collection<? extends Query> negatingFilters = buildNegatingFilter(criteria.getField().getName(),
76+
criteria.getFilterCriteriaEntries());
77+
filterQueries.addAll(negatingFilters);
7378
} else {
7479
filterQueries.addAll(queriesForEntries(chainedCriteria));
7580
}
@@ -85,11 +90,28 @@ public static Optional<Query> createQuery(Criteria criteria) {
8590
BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
8691
filterQueries.forEach(boolQueryBuilder::must);
8792
BoolQuery boolQuery = boolQueryBuilder.build();
88-
return Optional.of(boolQuery._toQuery());
93+
return Optional.of(new Query(boolQuery));
8994
}
9095
}
9196
}
9297

98+
private static Collection<? extends Query> buildNegatingFilter(String fieldName,
99+
Set<Criteria.CriteriaEntry> filterCriteriaEntries) {
100+
101+
List<Query> negationFilters = new ArrayList<>();
102+
103+
filterCriteriaEntries.forEach(criteriaEntry -> {
104+
Optional<Query> query = queryFor(criteriaEntry.getKey(), criteriaEntry.getValue(), fieldName);
105+
106+
if (query.isPresent()) {
107+
BoolQuery negatingFilter = QueryBuilders.bool().mustNot(query.get()).build();
108+
negationFilters.add(new Query(negatingFilter));
109+
}
110+
});
111+
112+
return negationFilters;
113+
}
114+
93115
private static Collection<? extends Query> queriesForEntries(Criteria criteria) {
94116

95117
Assert.notNull(criteria.getField(), "criteria must have a field");

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ public static SearchDocument from(Hit<?> hit, JsonpMapper jsonpMapper) {
8080

8181
Explanation explanation = from(hit.explanation());
8282

83-
// todo #1973 matchedQueries
84-
List<String> matchedQueries = null;
83+
List<String> matchedQueries = hit.matchedQueries();
8584

8685
Function<Map<String, JsonData>, EntityAsMap> fromFields = fields -> {
8786
StringBuilder sb = new StringBuilder("{");

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

-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ public DataAccessException translateExceptionIfPossible(RuntimeException ex) {
106106
}
107107

108108
private boolean isSeqNoConflict(Throwable exception) {
109-
// todo #1973 check if this works
110109
Integer status = null;
111110
String message = null;
112111

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

+8-5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import java.util.Map;
3535
import java.util.stream.Collectors;
3636

37+
import org.apache.commons.logging.Log;
38+
import org.apache.commons.logging.LogFactory;
3739
import org.springframework.data.elasticsearch.BulkFailureException;
3840
import org.springframework.data.elasticsearch.client.UnsupportedBackendOperation;
3941
import org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate;
@@ -68,6 +70,8 @@
6870
*/
6971
public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
7072

73+
private static final Log LOGGER = LogFactory.getLog(ElasticsearchTemplate.class);
74+
7175
private final ElasticsearchClient client;
7276
private final RequestConverter requestConverter;
7377
private final ResponseConverter responseConverter;
@@ -249,7 +253,6 @@ public String submitReindex(ReindexRequest reindexRequest) {
249253
client -> client.reindex(reindexRequestES));
250254

251255
if (reindexResponse.task() == null) {
252-
// todo #1973 check behaviour and create issue in ES if necessary
253256
throw new UnsupportedBackendOperation("ElasticsearchClient did not return a task id on submit request");
254257
}
255258

@@ -447,9 +450,6 @@ private List<SearchHits<?>> doMultiSearch(List<MultiSearchQueryParameter> multiS
447450
MultiSearchQueryParameter queryParameter = queryIterator.next();
448451
MultiSearchResponseItem<EntityAsMap> responseItem = responseIterator.next();
449452

450-
// if responseItem kind is Result then responseItem.value is a MultiSearchItem which is derived from
451-
// SearchResponse
452-
453453
if (responseItem.isResult()) {
454454

455455
Class clazz = queryParameter.clazz;
@@ -463,7 +463,10 @@ private List<SearchHits<?>> doMultiSearch(List<MultiSearchQueryParameter> multiS
463463

464464
searchHitsList.add(searchHits);
465465
} else {
466-
// todo #1973 add failure
466+
if (LOGGER.isWarnEnabled()) {
467+
LOGGER
468+
.warn(String.format("multisearch responsecontains failure: {}", responseItem.failure().error().reason()));
469+
}
467470
}
468471
}
469472

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

-8
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,6 @@ private void addParameters(HighlightParameters parameters,
8787
builder.boundaryScannerLocale(parameters.getBoundaryScannerLocale());
8888
}
8989

90-
if (parameters.getForceSource()) { // default is false
91-
// todo #1973 parameter missing in new client
92-
}
93-
9490
if (StringUtils.hasLength(parameters.getFragmenter())) {
9591
builder.fragmenter(highlighterFragmenter(parameters.getFragmenter()));
9692
}
@@ -111,10 +107,6 @@ private void addParameters(HighlightParameters parameters,
111107
builder.order(highlighterOrder(parameters.getOrder()));
112108
}
113109

114-
if (parameters.getPhraseLimit() > -1) {
115-
// todo #1973 parameter missing in new client
116-
}
117-
118110
if (parameters.getPreTags().length > 0) {
119111
builder.preTags(Arrays.asList(parameters.getPreTags()));
120112
}

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

+17
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import co.elastic.clients.elasticsearch._types.FieldValue;
1919
import co.elastic.clients.elasticsearch._types.LatLonGeoLocation;
20+
import co.elastic.clients.elasticsearch._types.query_dsl.IdsQuery;
2021
import co.elastic.clients.elasticsearch._types.query_dsl.MatchAllQuery;
2122
import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery;
2223
import co.elastic.clients.elasticsearch._types.query_dsl.Operator;
@@ -29,6 +30,7 @@
2930

3031
import java.nio.charset.StandardCharsets;
3132
import java.util.Base64;
33+
import java.util.List;
3234
import java.util.function.Function;
3335

3436
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
@@ -45,6 +47,21 @@ public final class QueryBuilders {
4547

4648
private QueryBuilders() {}
4749

50+
public static IdsQuery idsQuery(List<String> ids) {
51+
52+
Assert.notNull(ids, "ids must not be null");
53+
54+
return IdsQuery.of(i -> i.values(ids));
55+
}
56+
57+
public static Query idsQueryAsQuery(List<String> ids) {
58+
59+
Assert.notNull(ids, "ids must not be null");
60+
61+
Function<Query.Builder, ObjectBuilder<Query>> builder = b -> b.ids(idsQuery(ids));
62+
63+
return builder.apply(new Query.Builder()).build();
64+
}
4865
public static MatchQuery matchQuery(String fieldName, String query, @Nullable Operator operator,
4966
@Nullable Float boost) {
5067

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,7 @@ public Mono<String> submitReindex(ReindexRequest reindexRequest) {
177177
return Mono.from(execute( //
178178
(ClientCallback<Publisher<co.elastic.clients.elasticsearch.core.ReindexResponse>>) client -> client
179179
.reindex(reindexRequestES)))
180-
.flatMap(response -> (response.task() == null) ? Mono.error( // todo #1973 check behaviour and create issue in
181-
// ES if necessary
180+
.flatMap(response -> (response.task() == null) ? Mono.error(
182181
new UnsupportedBackendOperation("ElasticsearchClient did not return a task id on submit request"))
183182
: Mono.just(response.task()));
184183
}
@@ -499,7 +498,7 @@ public Query matchAllQuery() {
499498

500499
@Override
501500
public Query idsQuery(List<String> ids) {
502-
throw new UnsupportedOperationException("not implemented");
501+
return NativeQuery.builder().withQuery(QueryBuilders.idsQueryAsQuery(ids)).build();
503502
}
504503

505504
/**

0 commit comments

Comments
 (0)