Адрес фактического центра электронной коммерции SpringBoot (35k+star):GitHub.com/macro-positive/…
Резюме
я хочу получить свойmall
В рамках обновления проекта поддерживается версия SpringBoot 2.3.0. В процессе обновления выясняется, что Elasticsearch необходимо обновить до7.x
версия, выучил моюmall
Друзья проекта должны знать,
Elasticsearch, который я использую,6.x
версию, обновить до7.x
ElasticsearchTemplate больше не будет использоваться. В этой статье документируется Elasticsearch от6.x
обновитесь до7.x
Некоторые из проблем, с которыми столкнулись, для каждого гребут ямы!
Выбор версии
Поскольку мы переходим на Elasticsearch
7.x
версии, сначала выберите соответствующую версию. Как выбрать правильную версию, вот небольшая хитрость, которой я хочу поделиться с вами.
- Сначала мы можем
pom.xml
Измените версию, от которой зависит SpringBoot, в2.3.0
;
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
- тогда в проекте
External Libraries
искать вelasticsearch
, его можно найтиelasticsearch-7.6.2.jar
эта зависимость;
- затем откройте
MANIFEST.MF
файл, через пакет jarX-Compile-Elasticsearch-Version
свойства, мы можем найти совместимый номер версии Elasticsearch как7.6.2
;
-
Я пробовал две версии раньше
6.2.2
версия и7.4.0
версии, и обнаружил, что существуют проблемы совместимости с SpringBoot 2.3.0, поэтому очень важно выбрать подходящую версию! -
Также стоит отметить, что если вы используете китайский токенизатор (IK Analysis), то также необходимо выбрать соответствующую версию
7.6.2
, и то же самое касается использования Kibana и Logstash.
возникшие проблемы
После выбора подходящей версии Elasticsearch поговорим о проблемах, возникших в обновленной версии!
- существует
application.yml
, конфигурация, которую мы использовали для настройки пути доступа к Elasticsearch и имени кластера, больше не рекомендуется;
- Вместо этого настройте оставшийся адрес доступа Elasticsearch напрямую;
spring:
elasticsearch:
rest:
uris: http://localhost:9200
- На самом деле самая большая проблема в том, что ElasticsearchTemplate устарел и не рекомендуется к использованию, раньше использовался в сложных операциях с данными;
- Рекомендуется использовать ElasticsearchRestTemplate, который, вероятно, является модификацией
application.yml
Причина двух описанных выше конфигураций: после модификации для использования ElasticsearchRestTemplate мы можем найти исходный ElasticsearchTemplate.query()
метод ушел;
- Вы можете использовать ElasticsearchRestTemplate
search()
метод исходный сложный запрос будет иметь следующие улучшения;
// 使用ElasticsearchTemplate进行复杂查询
return elasticsearchTemplate.query(searchQuery, response -> {
LOGGER.info("DSL:{}",searchQuery.getQuery().toString());
return convertProductRelatedInfo(response);
});
// 使用ElasticsearchRestTemplate进行复杂查询
SearchHits<EsProduct> searchHits = elasticsearchRestTemplate.search(searchQuery, EsProduct.class);
return convertProductRelatedInfo(searchHits);
- Как мы преобразуем агрегированный объект результата
convertProductRelatedInfo
Также улучшено, просто изменен тип параметра метода;
//改进前
private EsProductRelatedInfo convertProductRelatedInfo(SearchResponse response) {
//省略方法体代码...
}
//改进后
private EsProductRelatedInfo convertProductRelatedInfo(SearchHits<EsProduct> response) {
//省略方法体代码...
}
- Если вы считаете, что этого достаточно, то вы обнаружите, что при вызове интерфейса сообщается об исключении преобразования типа;
2020-07-21 14:40:48.154 ERROR 11616 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed;
nested exception is java.lang.ClassCastException: org.elasticsearch.search.aggregations.bucket.nested.ParsedNested cannot be cast to org.elasticsearch.search.aggregations.bucket.nested.InternalNested] with root cause
java.lang.ClassCastException: org.elasticsearch.search.aggregations.bucket.nested.ParsedNested cannot be cast to org.elasticsearch.search.aggregations.bucket.nested.InternalNested
at com.macro.mall.tiny.service.impl.EsProductServiceImpl.convertProductRelatedInfo(EsProductServiceImpl.java:254) ~[classes/:na]
at com.macro.mall.tiny.service.impl.EsProductServiceImpl.searchRelatedInfo(EsProductServiceImpl.java:229) ~[classes/:na]
at com.macro.mall.tiny.controller.EsProductController.searchRelatedInfo(EsProductController.java:104) ~[classes/:na]
- Мы исправили проблему, в основном оригинал
Terms
объекты были изменены наParsedTerms
Связанные объекты, такие как StringTerms, были изменены на объекты ParsedStringTerms, конкретное сравнение выглядит следующим образом;
- Мы также обнаружили, что ElasticsearchRepository изначально использовал
search()
Этот метод также устарел и признан устаревшим, ранее мы использовали его для выполнения некоторых сложных запросов;
- Вместо этого мы можем использовать ElasticsearchRestTemplate.
search()
метод достижения конкретного сравнения реализации заключается в следующем;
// ElasticsearchRepository实现复杂搜索
return productRepository.search(searchQuery)
// ElasticsearchRestTemplate实现复杂搜索
SearchHits<EsProduct> searchHits = elasticsearchRestTemplate.search(searchQuery, EsProduct.class);
if(searchHits.getTotalHits()<=0){
return new PageImpl<>(null,pageable,0);
}
List<EsProduct> searchProductList = searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
return new PageImpl<>(searchProductList,pageable,searchHits.getTotalHits());
Суммировать
Elasticsearch от6.x
обновитесь до7.x
Изменение на самом деле не большое. ElasticsearchTemplate не рекомендуется. Вместо этого используйте ElasticsearchRestTemplate. Метод реализации сложных запросов ElasticsearchRepository также не рекомендуется. Отныне наши простые операции с данными могут использовать ElasticsearchRepository, а сложные операции с данными могут использовать только ElasticsearchRestTemplate.
Адрес исходного кода проекта
публика
проект торгового центраПолный набор учебных пособий сериализуется,Обратите внимание на публичный аккаунтПолучите это прямо сейчас.