关于spring:Spring认证中国教育管理中心Spring-Data-Elasticsearch教程一

5次阅读

共计 7674 个字符,预计需要花费 20 分钟才能阅读完成。

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

Spring Data Elasticsearch 教程一
5.1 传输客户端
将 TransportClient 被弃用 Elasticsearch 7 的,并会在 Elasticsearch 8 被移除(见 Elasticsearch 文档)。Spring Data Elasticsearch 将反对它 TransportClient,只有它在应用的 Elasticsearch 版本中可用,但自 4.0 版以来已弃用应用它的类。

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

示例 52. 传输客户端

@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()不应用默认值)

Spring Data Elasticsearch 教程一
5.2. 高级 REST 客户端
Java High Level REST Client 是 Elasticsearch 的默认客户端,它提供了间接的代替,TransportClient 因为它承受并返回完全相同的申请 / 响应对象,因而依赖于 Elasticsearch 外围我的项目。异步调用在客户端治理的线程池上进行操作,并且须要在申请实现时告诉回调。

示例 53. 高级 REST 客户端

@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()客户端。

Spring Data Elasticsearch 教程一
5.3. 反应式客户端

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

示例 54. 反应式 REST 客户端

@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。

Spring Data Elasticsearch 教程一
ReactiveClient 响应,特地是对于搜寻操作,绑定到申请的 from(offset) & size(limit) 选项。

5.4. 客户端配置
客户端行为能够通过 ClientConfiguration 容许设置 SSL、连贯和套接字超时、标头和其余参数的选项来更改。

示例 55. 客户端配置

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();
Spring Data Elasticsearch 教程一
定义默认题目(如果须要自定义)

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

可抉择启用 SSL。

(可选)设置代理。

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

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

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

可选地设置题目。

增加根本身份验证。

Supplier<Header> 能够指定一个函数,在每次将申请发送到 Elasticsearch 之前调用该函数 – 例如,以后工夫写入标头中。

对于反馈性设置一个性能配置 WebClient

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

如上例所示增加 Header 供应商容许注入可能随工夫变动的标头,例如身份验证 JWT 令牌。如果在反馈设置中应用它,则供应商性能不得阻塞!

5.5. 客户端日志
要查看理论发送到服务器和从服务器接管的内容 Request/Response 须要关上传输级别的日志记录,如上面的片段中所述。

启用传输层日志记录

<logger name=”org.springframework.data.elasticsearch.client.WIRE” level=”trace”/>
以上同时实用于 RestHighLevelClient 和
ReactiveElasticsearchClient 通过取得时 RestClients 别离 ReactiveRestClients,是不能用于 TransportClient。

  1. 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_time 和 epoch_millis。

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

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

Spring Data Elasticsearch 教程一
范畴类型
当字段应用 Integer_Range、Float_Range、Long_Range、Double_Range、Date_Range 或 Ip_Range 中的一种类型进行正文时,该字段必须是将映射到 Elasticsearch 范畴的类的实例,例如:

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> 类,因而后面的示例能够写成:

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 在属性上设置特定名称来笼罩它。

正文完
 0