原标题:Spring认证中国教育管理中心-SpringDataElasticsearch教程1(Spring中国教育管理中心)SpringDataElasticsearch教程5.1TransportClient将放弃使用TransportClientElasticsearch7,并将在Elasticsearch8中删除(请参阅Elasticsearch文档)。SpringDataElasticsearch将支持TransportClient,只要它在所使用的Elasticsearch版本中可用,但使用它的类自4.0版以来已被弃用。我们强烈建议使用高级REST客户端而不是TransportClient。示例52.传输客户端@ConfigurationpublicclassTransportClientConfigextendsElasticsearchConfigurationSupport{@BeanpublicClientelasticsearchClient()throwsUnknownHostException{Settingssettings=Settings.builder().,"弹性搜索").build();TransportClientclient=newPreBuiltTransportClient(settings);client.addTransportAddress(newTransportAddress(InetAddress.getByName("127.0.0.1"),9300));returnclient;}@Bean(name={"elasticsearchOperations","elasticsearchTemplate"})publicElasticsearchTemplateelasticsearchTemplate()throwsUnknownHostException{ElasticsearchTemplatetemplate=newElasticsearchTemplate(elasticsearchClient,elasticsearchConverter);template.setRefreshPolicy(refreshPolicy());returntemplate;}}//...IndexRequestrequest=newIndexRequest("spring-data").id(randomID()).source(someObjec吨);IndexResponseresponse=client.index(request);TransportClient必须配置集群名称才能连接到客户端的主机和端口。RefreshPolicy必须在ElasticsearchTemplate中设置(重写refreshPolicy()不使用默认值)SpringDataElasticsearchTutorial15.2.AdvancedRESTClientJavaHighLevelRESTClient是Elasticsearch的默认客户端,它提供了一个直接的替代品,TransportClient因为它接受并返回完全相同的请求/响应对象,因此依赖于Elasticsearch核心项目。异步调用在客户端管理的线程池上运行,并且需要在请求完成时通知回调。示例53.高级REST客户端@ConfigurationpublicclassRestClientConfigextendsAbstractElasticsearchConfiguration{@Override@BeanpublicRestHighLevelClientelasticsearchClient(){finalClientConfigurationclientConfiguration=ClientConfiguration.builder().connectedTo("localhost.Clientild.Recreated()")(clientConfiguration).rest();}}//...@AutowiredRestHighLevelClienthighLevelClient;RestClientlowLevelClient=highLevelClient.lowLevelClient();//...IndexRequestrequest=newIndexRequest("spring-data").id(randomID()).source(singletonMap("feature","high-level-rest-client")).setRefreshPolicy(IMMEDIATE);IndexResponseresponse=highLevelClient.index(request,RequestOptions.DEFAULT);使用构建器提供集群地址、设置默认HttpHeaders或启用SSL。创建一个RestHighLevelClient。也可以获得lowLevelRest()客户端。SpringDataElasticsearch教程15.3。ReactiveClient这个ReactiveElasticsearchClient是基于WebClient的。它使用Elasticsearch核心项目提供的请求/响应对象。调用直接在反应堆栈上运行,而不是将异步(线程池绑定)响应包装到反应类型中。示例54。响应式REST客户端@ConfigurationpublicclassReactiveRestClientConfigextendsAbstractReactiveElasticsearchConfiguration{@Override@BeanpublicReactiveElasticsearchClientreactiveElasticsearchClient(){finalClientConfigurationclientConfiguration=ClientConfiguration.builder().connectedTo("localhost:9200")//.build();returnReactiveRestClients.create(clientConfiguration);}}//...Monoresponse=client.index(request->request.index("spring-data").id(randomID()).source(singletonMap(“功能”,“反应式客户端”));使用构建器提供集群地址,设置默认HttpHeaders或启用SSL。SpringDataElasticsearch教程-ReactiveClient响应,尤其是对于搜索操作,绑定到请求的from(offset)和size(limit)选项。5.4.客户端配置可以通过ClientConfiguration选项更改客户端行为,这些选项允许设置SSL、连接和套接字超时、标头和其他参数。示例55.客户端配置HttpHeadershttpHeaders=newHttpHeaders();httpHeaders.add("some-header","oneveryrequest")ClientConfigurationclientConfiguration=ClientConfiguration.builder().connectedTo("localhost:9200","localhost:9291”)(用户名,密码).withHeaders(()->{HttpHeadersheaders=newHttpHeaders();headers.add("currentTime",LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));returnheaders;}).withClientConfigurer(ReactiveRestClients.WebClientConfigurationCallback.from(webClient->{//...returnwebClient;})).withClientConfigurer(RestClients.RestClientConfigurationCallback.from(clientBuilder->{//...returnclientBuilder;})).//...其他选项.build();SpringDataElasticsearch教程1定义默认标头(如果需要自定义)使用构建器提供集群地址,设置默认HttpHeaders或启用SSL可选地启用SSL。(可选)设置代理。可选设置路径前缀,主要用于不同集群位于某个反向代理后面的情况。设置连接超时。默认值为10秒。设置套接字超时。默认值为5秒。(可选)设置标题。添加基本??身份验证。Supplier可以指定每次向Elasticsearch发送请求时调用的函数——例如,将当前时间写在标头中。对于反应式设置,函数配置WebClient对于非反应式设置,函数配置REST客户端,如上例所示添加标头提供程序允许注入可能随时间变化的标头,例如身份验证JWT令牌。如果在反应设置中使用供应商功能,则不得阻塞!5.5.客户端日志要查看实际发送到服务器和从服务器接收的请求/响应需要打开传输级别日志记录,如下面的代码片段所述。启用传输层日志记录以上分别适用于RestHighLevelClient和ReactiveElasticsearchClient分别通过RestClients获取ReactiveRestClients时,不适用于TransportClient。Elasticsearch对象映射SpringDataElasticsearch对象映射是将Java对象(域实体)映射到存储在Elasticsearch中并返回的JSON表示的过程。早期版本的SpringDataElasticsearch使用基于Jackson的转换,SpringDataElasticsearch3.2.x引入了MetaModelObjectMapping。从4.0版开始,只使用元对象映射,而不是使用基于Jackson的映射器的MappingElasticsearchConverter。删除基于Jackson的映射器的主要原因是:字段的自定义映射需要使用@JsonFormat或@JsonInclude等注释来完成。当同一对象用于不同的基于JSON的数据存储或通过基于JSON的API发送时,这通常会导致问题。自定义字段类型和格式也需要存储到Elasticsearch索引映射中。基于Jackson的注解并不能完全提供表示Elasticsearch类型所需的所有信息。不仅在实体之间转换时,而且在查询参数、返回数据和其他地方都必须映射字段。现在使用MappingElasticsearchConverter涵盖了所有这些情况。6.1.元模型对象映射基于元模型的方法使用域类型信息来读/写Elasticsearch。这允许Converter为特定域类型映射注册实例。6.1.1.映射注释概述MappingElasticsearchConverter使用元数据驱动的对象映射文件。元数据取自可以注释的实体属性。可以使用以下注释:@Document:应用于类级别以指示该类是映射到数据库的候选者。最重要的属性是:indexName:存储此实体的索引的名称。这可以包含一个SpEL模板表达式,如“log-#{T(java.time.LocalDate).now().toString()}”createIndex:标记是否在存储库引导时创建索引。默认值是true。请参阅具有相应映射versionType:Configuration的自动索引创建以进行版本管理。默认是外部的。@Id:应用于字段级别以标记字段以用于识别目的。@Transient:默认情况下,所有字段在存储或检索时都映射到文档,此注解不包含此字段。@PersistenceConstructor:标记一个给定的构造函数——甚至是一个包保护的构造函数——用于实例化数据库中的对象。构造函数参数按名称映射到检索到的Document中的键值。@Field:应用于字段级别,定义字段的属性,其中大部分映射到各自的ElasticsearchMapping定义(以下列表不完整,完整参考请看注解Javadoc):将在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,对象、嵌套、Ip、TokenCount、过滤器、扁平化、Search_As_You_Type。请参阅Elasticsearch映射类型。如果未指定字段类型,则默认为FieldType.Auto。这意味着不会为该属性写入映射条目,Elasticsearch会在存储该属性的第一个数据时动态添加一个映射条目(动态映射规则请参阅Elasticsearch文档)。format:一种或多种内置日期格式,请参考下一节日期格式映射。pattern:一种或多种自定义日期格式,请参考下一节日期格式映射。store:标志原始字段值是否应存储在Elasticsearch中,默认值为false。analyzer、searchAnalyzer、normalizer用于指定自定义分析器和规范器。@GeoPoint:将字段标记为geo_point数据类型。如果该字段是GeoPoint类的实例,则可以省略。@ValueConverter定义了一个用于转换给定属性的类。与注册的Spring转换器不同,这只转换带注释的属性,而不是给定类型的每个属性。映射元数据基础设施在一个单独的spring-data-commons项目中定义,该项目与技术无关。派生自TemporalAccessor或java.util.Date类型的日期格式映射属性必须具有@Field类型注释,必须为此类型注册FieldType.Date或自定义转换器。这一段描述了FieldType.Date.@Field注释的两个属性定义了将哪种日期格式信息写入映射(另请参阅ElasticsearchBuiltInFormats和ElasticsearchCustomDateFormats)并且format属性用于定义预定义格式至少其中之一。如果没有定义,则使用_date_optional_time和epoch_millis的默认值。pattern属性可用于添加额外的自定义格式字符串。如果您只想使用自定义日期格式,则必须将格式属性设置为空{}。下表显示了不同的属性和根据它们的值创建的映射:SpringDataElasticsearch教程-范围类型当一个字段被注释为Integer_Range、Float_Range、Long_Range、Double_Range、Date_Range或Ip_Range类型之一时,该字段必须是An将映射到Elasticsearch范围的类的实例,例如:从;@Field(name="lte")privateIntegerto;//getterandsetter}作为替代方案,SpringDataElasticsearch提供了一个Range类,所以前面的例子可以写成:classSomePersonData{@Field(type=FieldType.Integer_Range)privateRangevalidAge;//getterandsetter}类型支持类为Integer、Long、Float、Double、Date,该类实现了TemporalAccessor接口。映射的字段名不需要进一步配置,SpringDataElasticsearch将使用对象的属性名作为Elasticsearch中的字段名。这可以通过在属性上使用@Field注释来更改单个字段。您还可以在客户端配置(Elasticsearch客户端)中定义FieldNamingStrategy。比如SnakeCaseFieldNamingStrategy,如果配置了a,对象的属性sampleProperty会映射到Elasticsearch中的sample_property。AFieldNamingStrategy适用于所有实体;可以通过@Field在属性上设置特定名称来覆盖它。