尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Spring Data ElasticSearch 5.x 版本新特性

Spring Data ElasticSearch 5.x 版本新特性 从 Spring Data Elasticsearch 4.x 升级到 5.x 是一次基础架构的重大升级核心驱动力是底层 Elasticsearch 客户端的全面更换以及对 Java 17 和 Spring Framework 6 的支持。因此这次迁移会引入一些破坏性变更。以下是我在实际使用时遇到过的一些新特性Java 17 基线Spring Data Elasticsearch 5.0 要求Java 17作为最低版本。包结构调整所有依赖于被弃用RestHighLevelClient的类都被移动到了org.springframework.data.elasticsearch.client.erhlc包下。与此相关原先用于构建查询的NativeSearchQuery类已被NativeQuery取代后者可以接收来自新客户端库的Query实例。原先的ElasticsearchRestTemplate已经被移除现在需要使用ElasticsearchOperations进行操作。搜索模板支持它提供了一种更简洁、声明式的方式来使用 Elasticsearch 的搜索模板功能。为此首先需要创建一个存储脚本。ElasticsearchOperations接口扩展了ScriptOperations后者提供了必要的功能。这里使用的示例假设我们有一个带有名为firstName属性的Person实体及PersonCustomRepositoryDocument(indexNameperson-index)DataAllArgsConstructorNoArgsConstructorpublicclassPerson{IdprivateStringid;Field(typeFieldType.Text,namefirstName)privateStringfirstName;Field(typeFieldType.Text,namelastName)privateStringlastName;Field(typeFieldType.Integer,nameage)privateIntegerage;}interfacePersonCustomRepository{SearchPagePersonfindByFirstNameWithSearchTemplate(StringfirstName,Pageablepageable);}搜索模板脚本可以这样保存ConfigurationpublicclassElasticsearchConfigextendsElasticsearchConfiguration{AutowiredprivateElasticsearchOperationsoperations;PostConstructpublicvoidregisterSearchTemplates(){operations.putScript(Script.builder().withId(person-firstname).withLanguage(mustache).withSource( { query: { bool: { must: [ { match: { firstName: {{firstName}} } } ] } }, from: {{from}}, size: {{size}} } ).build());}}在 Service 中可以这么操作AutowiredprivateElasticsearchOperationsoperations;OverridepublicR?findByFirstNameWithSearchTemplate(StringfirstName,Pageablepageable){// ....varquerySearchTemplateQuery.builder().withId(person-firstname).withParams(Map.of(firstName,firstName,from,pageable.getOffset(),size,pageable.getPageSize())).build();SearchHitsPersonsearchHitsoperations.search(query,Person.class);// ....}个人认为相对NativeQuery来说这种方法是更简单灵活的对我来说更友好一点。但是如果说查询条件需要根据用户的多重选择动态组合那么还是选择NativeQuery比较好一些。新的 Elasticsearch 客户端这是 5.x 版本最根本的变化其影响也最为广泛。弃用旧客户端Spring Data Elasticsearch 5.x 弃用了旧的RestHighLevelClient全面采用 Elasticsearch 官方提供的新 Java 客户端ElasticsearchClient。配置方式变更你需要创建一个继承自ElasticsearchConfiguration的配置类来使用新客户端。ConfigurationpublicclassMyClientConfigextendsElasticsearchConfiguration{OverridepublicClientConfigurationclientConfiguration(){returnClientConfiguration.builder().connectedTo(localhost:9200).build();}}类转换为 Java Record在 5.x 版本中可以用记录类替代实体类Document(indexNameproducts)publicrecordProduct(IdStringid,Stringname,Stringcategory,doubleprice){}这样会更简洁一些。
返回列表