После обновления Elasticsearch до версии 7.x я чувствую себя в яме!

Java Elasticsearch
После обновления Elasticsearch до версии 7.x я чувствую себя в яме!

Адрес фактического центра электронной коммерции SpringBoot (35k+star):GitHub.com/macro-positive/…

Резюме

я хочу получить свойmallВ рамках обновления проекта поддерживается версия SpringBoot 2.3.0. В процессе обновления выясняется, что Elasticsearch необходимо обновить до7.xверсия, выучил моюmallДрузья проекта должны знать, Elasticsearch, который я использую,6.xверсию, обновить до7.xElasticsearchTemplate больше не будет использоваться. В этой статье документируется Elasticsearch от6.xобновитесь до7.xНекоторые из проблем, с которыми столкнулись, для каждого гребут ямы!

Выбор версии

Поскольку мы переходим на Elasticsearch7.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()метод ушел;

  • Вы можете использовать ElasticsearchRestTemplatesearch()метод исходный сложный запрос будет иметь следующие улучшения;
// 使用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.

Адрес исходного кода проекта

GitHub.com/macro-positive/…

публика

проект торгового центраПолный набор учебных пособий сериализуется,Обратите внимание на публичный аккаунтПолучите это прямо сейчас.

公众号图片