Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring认证中国教育管理中心-Spring Data Elasticsearch教程一

Spring认证中国教育管理中心-Spring Data Elasticsearch教程一

原创
作者头像
IT胶囊
发布于 2022-01-13 07:08:38
发布于 2022-01-13 07:08:38
75800
代码可运行
举报
文章被收录于专栏:IT技能应用IT技能应用
运行总次数:0
代码可运行

原标题:Spring认证中国教育管理中心-Spring Data Elasticsearch教程一(Spring中国教育管理中心)

5.1传输客户端

将TransportClient被弃用Elasticsearch 7的,并会在Elasticsearch 8被移除(见Elasticsearch文档)。Spring Data Elasticsearch 将支持它TransportClient,只要它在使用的 Elasticsearch版本中可用,但自 4.0 版以来已弃用使用它的类。

我们强烈建议使用高级 REST 客户端而不是TransportClient.

示例 52. 传输客户端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class TransportClientConfig extends ElasticsearchConfigurationSupport {

    @Bean
    public Client elasticsearchClient() throws UnknownHostException {
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();        
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); 
        return client;
    }

    @Bean(name = { "elasticsearchOperations", "elasticsearchTemplate" })
    public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {

		ElasticsearchTemplate template = new ElasticsearchTemplate(elasticsearchClient, elasticsearchConverter);
		template.setRefreshPolicy(refreshPolicy());                                                 

		return template;
    }
}

// ...

IndexRequest request = new IndexRequest("spring-data")
 .id(randomID())
 .source(someObject);

IndexResponse response = client.index(request);

在TransportClient必须与群集名称进行配置。

连接客户端的主机和端口。

RefreshPolicy 必须设置在ElasticsearchTemplate(覆盖refreshPolicy()不使用默认值)

5.2.高级 REST 客户端

Java High Level REST Client 是 Elasticsearch 的默认客户端,它提供了直接的替代,TransportClient因为它接受并返回完全相同的请求/响应对象,因此依赖于 Elasticsearch 核心项目。异步调用在客户端管理的线程池上进行操作,并且需要在请求完成时通知回调。

示例 53. 高级 REST 客户端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {

        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()  
            .connectedTo("localhost:9200")
            .build();

        return RestClients.create(clientConfiguration).rest();                         
    }
}

// ...

  @Autowired
  RestHighLevelClient highLevelClient;

  RestClient lowLevelClient = highLevelClient.lowLevelClient();                        

// ...

IndexRequest request = new IndexRequest("spring-data")
  .id(randomID())
  .source(singletonMap("feature", "high-level-rest-client"))
  .setRefreshPolicy(IMMEDIATE);

IndexResponse response = highLevelClient.index(request,RequestOptions.DEFAULT);

使用构建器提供集群地址、设置默认值HttpHeaders或启用 SSL。

创建 RestHighLevelClient。

也可以获取lowLevelRest()客户端。

5.3.反应式客户端

这 ReactiveElasticsearchClient是一个基于WebClient. 它使用 Elasticsearch 核心项目提供的请求/响应对象。调用直接在响应式堆栈上操作,而不是将异步(线程池绑定)响应包装到响应式类型中。

示例 54. 反应式 REST 客户端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class ReactiveRestClientConfig extends AbstractReactiveElasticsearchConfiguration {

    @Override
    @Bean
    public ReactiveElasticsearchClient reactiveElasticsearchClient() {
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder() 
            .connectedTo("localhost:9200") //
            .build();
        return ReactiveRestClients.create(clientConfiguration);

    }
}
// ...

Mono<IndexResponse> response = client.index(request ->

  request.index("spring-data")
    .id(randomID())
    .source(singletonMap("feature", "reactive-client"));
);

使用构建器提供集群地址、设置默认值HttpHeaders或启用 SSL。

ReactiveClient 响应,特别是对于搜索操作,绑定到请求的from(offset) & size(limit) 选项。

5.4.客户端配置

客户端行为可以通过ClientConfiguration允许设置 SSL、连接和套接字超时、标头和其他参数的选项来更改。

示例 55. 客户端配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("some-header", "on every request")                      

ClientConfiguration clientConfiguration = ClientConfiguration.builder()
  .connectedTo("localhost:9200", "localhost:9291")                      
  .usingSsl()                                                           
  .withProxy("localhost:8888")                                          
  .withPathPrefix("ela")                                                
  .withConnectTimeout(Duration.ofSeconds(5))                            
  .withSocketTimeout(Duration.ofSeconds(3))                             
  .withDefaultHeaders(defaultHeaders)                                   
  .withBasicAuth(username, password)                                    
  .withHeaders(() -> {                                                  
    HttpHeaders headers = new HttpHeaders();
    headers.add("currentTime", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    return headers;
  })
  .withClientConfigurer(                                                
    ReactiveRestClients.WebClientConfigurationCallback.from(webClient -> {
  	  // ...
      return webClient;
  	}))
  .withClientConfigurer(                                                
    RestClients.RestClientConfigurationCallback.from(clientBuilder -> {
  	  // ...
      return clientBuilder;
  	}))
  . // ... other options
  .build();

定义默认标题(如果需要自定义)

使用构建器提供集群地址、设置默认值HttpHeaders或启用 SSL。

可选择启用 SSL。

(可选)设置代理。

可选地设置路径前缀,主要用于在某些反向代理后面的不同集群时。

设置连接超时。默认值为 10 秒。

设置套接字超时。默认值为 5 秒。

可选地设置标题。

添加基本身份验证

Supplier<Header>可以指定一个函数,在每次将请求发送到 Elasticsearch 之前调用该函数 - 例如,当前时间写入标头中。

对于反应性设置一个功能配置 WebClient

对于非反应式设置,配置 REST 客户端的功能

如上例所示添加 Header 供应商允许注入可能随时间变化的标头,例如身份验证 JWT 令牌。如果在反应设置中使用它,则供应商功能不得阻塞!

5.5.客户端日志

要查看实际发送到服务器和从服务器接收的内容Request/Response需要打开传输级别的日志记录,如下面的片段中所述。

启用传输层日志记录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<logger name="org.springframework.data.elasticsearch.client.WIRE" level="trace"/>

以上同时适用于RestHighLevelClient和 ReactiveElasticsearchClient通过获得时RestClients分别ReactiveRestClients,是不能用于TransportClient。

6. Elasticsearch 对象映射

Spring Data Elasticsearch 对象映射是将 Java 对象(域实体)映射到存储在 Elasticsearch 中并返回的 JSON 表示的过程。

Spring Data Elasticsearch 的早期版本使用基于 Jackson 的转换,Spring Data Elasticsearch 3.2.x 引入了Meta Model Object Mapping。从 4.0 版开始,仅使用 Meta Object Mapping,不再 MappingElasticsearchConverter使用基于 Jackson 的映射器,而是使用了。

移除基于 Jackson 的映射器的主要原因是:

  • 字段的自定义映射需要使用@JsonFormat或 之类的注释来完成@JsonInclude。当相同的对象用于不同的基于 JSON 的数据存储或通过基于 JSON 的 API 发送时,这通常会导致问题。
  • 自定义字段类型和格式也需要存储到 Elasticsearch 索引映射中。基于 Jackson 的注释没有完全提供表示 Elasticsearch 类型所需的所有信息。
  • 字段不仅在从实体转换到实体时必须映射,而且在查询参数、返回数据和其他地方也必须映射。

使用 MappingElasticsearchConverternow 涵盖了所有这些情况。

6.1。元模型对象映射

基于元模型的方法使用域类型信息来读取/写入 Elasticsearch。这允许Converter为特定域类型映射注册实例。

6.1.1.映射注释概述

在 MappingElasticsearchConverter使用元数据驱动的对象的映射文件。元数据取自可以注释的实体属性。

可以使用以下注释:

  • @Document:在类级别应用以指示该类是映射到数据库的候选对象。最重要的属性是:indexName:存储此实体的索引的名称。这可以包含一个 SpEL 模板表达式,如 "log-#{T(java.time.LocalDate).now().toString()}"createIndex: 标记是否在存储库引导时创建索引。默认值为true。请参阅使用相应映射自动创建索引versionType:版本管理的配置。默认值为外部
  • @Id:应用于字段级别以标记用于标识目的的字段。
  • @Transient:默认情况下,所有字段在存储或检索时都映射到文档,此注释不包括该字段。
  • @PersistenceConstructor: 标记一个给定的构造函数——甚至是一个包保护的构造函数——在从数据库中实例化对象时使用。构造函数参数按名称映射到检索到的 Document 中的键值。
  • @Field:应用于字段级别并定义字段的属性,大部分属性映射到各自的Elasticsearch Mapping定义(以下列表不完整,请查看注释 Javadoc 以获得完整参考):name:将在 Elasticsearch 文档中表示的字段名称,如果未设置,则使用 Java 字段名称。type:字段类型,可以是Text、Keyword、Long、Integer、Short、Byte、Double、Float、Half_Float、Scaled_Float、Date、Date_Nanos、Boolean、Binary、Integer_Range、Float_Range、Long_Range、Double_Range、Date_Range、Ip_Range、Object 之一, 嵌套, Ip, TokenCount, Percolator, Flattened, Search_As_You_Type。请参阅Elasticsearch 映射类型。如果未指定字段类型,则默认为FieldType.Auto。这意味着,不会为该属性写入任何映射条目,并且 Elasticsearch 将在存储该属性的第一个数据时动态添加一个映射条目(查看 Elasticsearch 文档以了解动态映射规则)。format:一种或多种内置日期格式,请参阅下一节日期格式映射。pattern:一种或多种自定义日期格式,请参阅下一节日期格式映射。store: 标记原始字段值是否应该存储在 Elasticsearch 中,默认值为false。analyzer, searchAnalyzer,normalizer用于指定自定义分析器和规范器。
  • @GeoPoint:将字段标记为geo_point数据类型。如果字段是GeoPoint类的实例,则可以省略。
  • @ValueConverter定义一个用于转换给定属性的类。与已注册的 Spring 不同,Converter这只转换了带注释的属性,而不是给定类型的每个属性。

映射元数据基础设施在一个独立的 spring-data-commons 项目中定义,该项目与技术无关。

日期格式映射

派生自TemporalAccessor或属于类型的属性java.util.Date必须具有@Field类型注释,FieldType.Date或者必须为此类型注册自定义转换器。本段描述了 FieldType.Date.

@Field注释的两个属性定义了将哪些日期格式信息写入映射(另请参阅Elasticsearch Built In Formats和Elasticsearch Custom Date Formats)

的format属性是用来定义预定义的格式中的至少之一。如果未定义,则使用默认值_date_optional_timeepoch_millis

该pattern属性可用于添加其他自定义格式字符串。如果您只想使用自定义日期格式,则必须将该format属性设置为 empty {}。

下表显示了不同的属性以及从它们的值创建的映射:

范围类型

当字段使用Integer_Range、Float_Range、Long_Range、Double_Range、Date_RangeIp_Range 中的一种类型进行注释时该字段必须是将映射到 Elasticsearch 范围的类的实例,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SomePersonData {

    @Field(type = FieldType.Integer_Range)
    private ValidAge validAge;

    // getter and setter
}

class ValidAge {
    @Field(name="gte")
    private Integer from;

    @Field(name="lte")
    private Integer to;

    // getter and setter
}

作为替代方案,Spring Data Elasticsearch 提供了一个Range<T>类,因此前面的示例可以写成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SomePersonData {

    @Field(type = FieldType.Integer_Range)
    private Range<Integer> validAge;

    // getter and setter
}

该类型支持类<T>是Integer,Long,Float,Double,Date和类实现该 TemporalAccessor接口。

映射的字段名称

无需进一步配置,Spring Data Elasticsearch 将使用对象的属性名称作为 Elasticsearch 中的字段名称。这可以通过使用该@Field属性上的注释来更改单个字段。

也可以FieldNamingStrategy在客户端的配置中定义一个(Elasticsearch Clients)。例如 SnakeCaseFieldNamingStrategy,如果配置了a,则对象的属性sampleProperty将映射到Elasticsearch 中的sample_property。AFieldNamingStrategy适用于所有实体;可以通过@Field在属性上设置特定名称来覆盖它。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring认证中国教育管理中心-Spring Data Elasticsearch教程二
原标题:Spring认证中国教育管理中心-Spring Data Elasticsearch教程二(Spring中国教育管理中心)
IT胶囊
2022/01/13
1.1K0
Spring认证中国教育管理中心-Spring Data Elasticsearch教程二
【全文检索_08】Spring Data Elasticsearch
  Spring Data Elasticsearch 是 Spring Data 项目的一部分,该项目旨在为新数据存储提供熟悉且一致的基于 Spring 的编程模型,同时保留特定于存储的功能。Spring Data Elasticsearch 项目提供了与 Elasticsearch 搜索引擎的集成。 Spring Data Elasticsearch 的关键功能区域是一个以 POJO 为中心的模型,该模型用于与 Elastichsearch 文档进行交互并轻松编写存储库样式的数据访问层。   从 Elasticsearch 7 开始不推荐使用 TransportClient,并将在 Elasticsearch 8 中将其删除。Spring Data Elasticsearch 也支持 TransportClient,前提是使用的 Elasticsearch 中可用,Spring Data Elasticsearch 从 4.0 版本开始已弃用使用 TransportClient 的类。现在 High Level REST Client 是 Elasticsearch 的默认客户端,它在接受并返回完全相同的请求/响应对象时直接替代 TransportClient。
Demo_Null
2021/03/02
2.4K0
【全文检索_08】Spring Data Elasticsearch
【Elasticsearch】整合Spring Data Elasticsearch
官方文档:Java High Level REST Client | Java REST Client [6.8] | Elastic
陶然同学
2023/02/24
1.3K0
【Elasticsearch】整合Spring Data Elasticsearch
Spring认证中国教育管理中心-Spring Data Elasticsearch教程六
原标题:Spring认证中国教育管理中心-Spring Data Elasticsearch教程六(Spring中国教育管理中心)
IT胶囊
2022/01/17
1K0
Spring认证中国教育管理中心-Spring Data Elasticsearch教程六
ElasticSearch 多框架集成
Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce 框架和云计 算数据服务。Spring Data 可以极大的简化 JPA(Elasticsearch ......)的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了 CRUD 外,还包括如分页、排序等一些常用的功能。
用户9615083
2022/12/25
7690
ElasticSearch 多框架集成
ElasticSearch客户端调用
在elasticsearch官网中提供了各种语言的客户端:https://www.elastic.co/guide/en/elasticsearch/client/index.html
兜兜转转
2023/03/29
3.4K0
ElasticSearch客户端调用
spring data操作ES简直不能再香
Elasticsearch(以下简称ES)并不像mysql这么容易上手,很多java程序员会觉得ES的java客户端比较难以掌握,尽管ES 7.x官方推荐的high level client已经相对于早期的TransportClient好用很多了。
用户7634691
2020/08/10
2.7K0
springboot集成elasticsearch7.2
上篇文章我们讲解了elasticsearch的安装,这次我们来搞一下,如何在自己的项目中集成elasticsearch。 正常来讲spring-data中都会提供相应的starter,让我们方便的使用各种Template操作对应的组件,比如常用RedisTemplate, JdbcTemplate等,其实spring-data中也提供的相应的elasticsearch的对应工具。但是我这里并没有使用,而是直接使用的elasticsearch原生api实现的。为什么这么做呢,因为spring-data-elasticsearch 最新的版本3.2,最高支持的elasticsearch版本为6.8, 而我们用的是7.2的版本,并且官方建议我们使用的jar版本最好和软件版本一致。
一缕82年的清风
2021/12/06
7190
springboot集成elasticsearch7.2
Spring Boot 整合 ElasticSearch 这么简单?
ElasticSearch 作为一款常见的搜索引擎,在项目中随时会用到。为方便在项目中访问 ElasticSearch,Spring 官方封装了对 ElasticSearch 的支持。通过 Spring Data 的 ElasticSearch 模块,我们可以方便地使用 ElasticSearch。 本文主要涉及的知识点有: ElasticSearch 的使用场景和技术。 spring-data-elasticsearch 中 Operations 和 Repository 相关技术的使用。 如何在 Spr
江南一点雨
2022/10/08
1.6K0
Spring Boot 整合 ElasticSearch 这么简单?
ElasticSearch系列-SpringBoot整合
聚合:英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能。聚合有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。
架构狂人
2023/09/21
3180
ElasticSearch系列-SpringBoot整合
SpringDataElasticsearch操作Elasticsearch创建索引库以及创建映射
注意:SpringDataElasticsearch底层使用的不是Elasticsearch提供的RestHighLevelClient,而是TransportClient,并不采用Http协议通信,而是访问elasticsearch对外开放的tcp端口
用户9006224
2022/12/21
8740
应用接入ES(一)-Springboot集成ES
Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名。一句话来说,Elasticsearch就是专业做搜索的,支持各种复杂的检索。
叔牙
2020/11/19
4.5K2
应用接入ES(一)-Springboot集成ES
Spring认证中国教育管理中心-Spring Data MongoDB教程十三
原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程十三(内容来源:Spring中国教育管理中心)
IT胶囊
2021/11/29
2.9K0
Spring认证中国教育管理中心-Spring Data MongoDB教程十三
好玩的ES--第三篇之过滤查询,整合SpringBoot
过滤查询,其实准确来说,ES中的查询操作分为2种: 查询(query)和过滤(filter)。查询即是之前提到的query查询,它 (查询)默认会计算每个返回文档的得分,然后根据得分排序。而过滤(filter)只会筛选出符合的文档,并不计算 得分,而且它可以缓存文档 。所以,单从性能考虑,过滤比查询更快。 换句话说过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据。
大忽悠爱学习
2022/05/10
8640
好玩的ES--第三篇之过滤查询,整合SpringBoot
Lucene 和 Kibana、ElasticSeach、Spring Data ElasticSearch
结构化数据 - 行数据,可以用二维表结构来逻辑表达实现的数据;指具有固定格式或有限长度的数据,如数据库,元数据等。
RendaZhang
2020/12/02
2.3K0
springboot集成elasticsearch7实现全文检索及分页
elasticsearch系列文章前面已经更新过三篇(https://blog.csdn.net/lsqingfeng/category_10219329.html)(建议先看下这三篇文章),分别讲解了elasticsearch7.2的安装,和springboot的集成以及简单的使用。前面都是通过demo的方式,主要讲解了他的一下简单使用,最近已经将es成功应用到了项目当中,本篇文章主要系统的介绍一下到底在项目中该如何使用es.
一缕82年的清风
2021/12/06
2.4K0
springboot集成elasticsearch7实现全文检索及分页
01_ElasticSearch学习笔记
如何能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,一般我们都会使用全文检索技术。 常见的全文检索技术有 Lucene、solr 、elasticsearch 等。
全栈程序员站长
2022/06/30
1.4K0
01_ElasticSearch学习笔记
Elasticsearch java API客户端介绍
在ES 7.0之前最常采用的API,基于TransportClient客户端。网上大部分ES 客户端的资料基本都是基于它的。这种方式在ES 7.x后已经不被官方推荐,且在8.0版本中完全移除它。
用户7634691
2020/08/10
3.5K0
SpringData集成Elasticsearch
Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA(Elasticsearch„)的写法,可以在几乎不用 写实现的情况下,实现对数据的访问和操作。除了 CRUD 外,还包括如分页、排序等一些 常用的功能。
鱼找水需要时间
2023/02/16
6070
SpringData集成Elasticsearch
Elasticsearch Document Index API详解、原理与示例
本节将开始介绍Document API,本节将重点介绍ElasticSearch Doucment Index API(新增索引)。
丁威
2019/06/10
3K0
Elasticsearch Document Index API详解、原理与示例
相关推荐
Spring认证中国教育管理中心-Spring Data Elasticsearch教程二
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验