Как вернуть простой запрос с агрегацией с помощью Spring Data Elasticsearch (последняя версия) и Spring Boot? ⇐ JAVA
-
Гость
Как вернуть простой запрос с агрегацией с помощью Spring Data Elasticsearch (последняя версия) и Spring Boot?
Я пытаюсь получить список агрегированных брендов, используя Spring-Boot 3 + Spring Data ElasticSearch 5 и Elasticsearch 8.
В настоящее время я получаю результаты, но не агрегированные.
Я просмотрел документацию и поискал в Google, но ответы, которые я нашел, я пытался реализовать без каких-либо убедительных результатов.
Вот три моих подхода:
Базовый запрос, который работает с Postman и возвращает агрегированные результаты:
{ «размер»: 0, "аггс": { "distinct_brand": { "условия": { "поле": "торговая марка", «размер»: 10000, "заказ": { "_key": "по возрастанию" } } } } } Тест 1 с использованием StringQuery:
Запрос запроса = new StringQuery("{" + " \"match_all\" : {}" + " }," + "Размер: 100", + " \"аггс\": {" + " \"distinct_brand\": {" + " \"условия\": {" + ""поле": "торговая марка"," + "Размер: 10000", + " \"заказ\": {" + " \"_key\": \"по возрастанию\"" + " }" + " }" + " }" + " }"); SearchHits
searchHits = elasticsearchOperations.search(query, Brand.class); List
BrandList = searchHits.getSearchHits().stream() .map(SearchHit::getContent) .collect(Коллекторы.toList()); Тест 2 с AggregationBuilders и withAggregation:
Агрегация агрегации = AggregationBuilders.terms(ta -> ta.field("brand").size(10000)); Запрос запроса = NativeQuery.builder() .withQuery(q -> q.matchAll(ма -> ма)) .withAggregation("distinct_brand", агрегация) .withPageable(PageRequest.of(0, 10000)) .строить(); SearchHits
searchHits = elasticsearchOperations.search(query, Brand.class); List
BrandList = searchHits.getSearchHits().stream() .map(SearchHit::getContent) .collect(Коллекторы.toList()); Тест 3 с JsonParser и SearchRequest:
JsonpMapper jsonpMapper = новый JacksonJsonpMapper(); JsonParser jsonParser = Json.createParser(new StringReader("{" + " \"match_all\" : {}" + " }," + "Размер: 100", + " \"аггс\": {" + " \"distinct_brand\": {" + " \"условия\": {" + ""поле": "торговая марка"," + "Размер: 10000", + " \"заказ\": {" + " \"_key\": \"по возрастанию\"" + " }" + " }" + " }" + " }")); Запрос SearchRequest = SearchRequest._DESERIALIZER.deserialize(jsonParser, jsonpMapper); NativeQueryBuildernativeQueryBuilder = NativeQuery.builder(); for (Map.Entry aggregationEntry: request.aggregations().entrySet()) { nativeQueryBuilder.withAggregation(aggregationEntry.getKey(), aggregationEntry.getValue()); } Запрос запроса = NativeQueryBuilder.withPageable(PageRequest.of(0, 10000)).build(); SearchHits
searchHits = elasticsearchOperations.search(query, Brand.class); List
BrandList = searchHits.getSearchHits().stream() .map(SearchHit::getContent) .collect(Коллекторы.toList()); Знаете почему?
Я пытаюсь получить список агрегированных брендов, используя Spring-Boot 3 + Spring Data ElasticSearch 5 и Elasticsearch 8.
В настоящее время я получаю результаты, но не агрегированные.
Я просмотрел документацию и поискал в Google, но ответы, которые я нашел, я пытался реализовать без каких-либо убедительных результатов.
Вот три моих подхода:
Базовый запрос, который работает с Postman и возвращает агрегированные результаты:
{ «размер»: 0, "аггс": { "distinct_brand": { "условия": { "поле": "торговая марка", «размер»: 10000, "заказ": { "_key": "по возрастанию" } } } } } Тест 1 с использованием StringQuery:
Запрос запроса = new StringQuery("{" + " \"match_all\" : {}" + " }," + "Размер: 100", + " \"аггс\": {" + " \"distinct_brand\": {" + " \"условия\": {" + ""поле": "торговая марка"," + "Размер: 10000", + " \"заказ\": {" + " \"_key\": \"по возрастанию\"" + " }" + " }" + " }" + " }"); SearchHits
searchHits = elasticsearchOperations.search(query, Brand.class); List
BrandList = searchHits.getSearchHits().stream() .map(SearchHit::getContent) .collect(Коллекторы.toList()); Тест 2 с AggregationBuilders и withAggregation:
Агрегация агрегации = AggregationBuilders.terms(ta -> ta.field("brand").size(10000)); Запрос запроса = NativeQuery.builder() .withQuery(q -> q.matchAll(ма -> ма)) .withAggregation("distinct_brand", агрегация) .withPageable(PageRequest.of(0, 10000)) .строить(); SearchHits
searchHits = elasticsearchOperations.search(query, Brand.class); List
BrandList = searchHits.getSearchHits().stream() .map(SearchHit::getContent) .collect(Коллекторы.toList()); Тест 3 с JsonParser и SearchRequest:
JsonpMapper jsonpMapper = новый JacksonJsonpMapper(); JsonParser jsonParser = Json.createParser(new StringReader("{" + " \"match_all\" : {}" + " }," + "Размер: 100", + " \"аггс\": {" + " \"distinct_brand\": {" + " \"условия\": {" + ""поле": "торговая марка"," + "Размер: 10000", + " \"заказ\": {" + " \"_key\": \"по возрастанию\"" + " }" + " }" + " }" + " }")); Запрос SearchRequest = SearchRequest._DESERIALIZER.deserialize(jsonParser, jsonpMapper); NativeQueryBuildernativeQueryBuilder = NativeQuery.builder(); for (Map.Entry aggregationEntry: request.aggregations().entrySet()) { nativeQueryBuilder.withAggregation(aggregationEntry.getKey(), aggregationEntry.getValue()); } Запрос запроса = NativeQueryBuilder.withPageable(PageRequest.of(0, 10000)).build(); SearchHits
searchHits = elasticsearchOperations.search(query, Brand.class); List
BrandList = searchHits.getSearchHits().stream() .map(SearchHit::getContent) .collect(Коллекторы.toList()); Знаете почему?
Мобильная версия