原题目: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 {
@Beanpublic 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@Beanpublic 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@Beanpublic 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。
- 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在属性上设置特定名称来笼罩它。