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

Spring Data Elasticsearch教程二
6.1.2.映射规定
类型提醒
映射应用嵌入在发送到服务器的文档中的类型提醒来容许泛型类型映射。这些类型提醒_class在文档中示意为属性,并为每个聚合根写入。

示例 56. 类型提醒

public class Person {

@Id String id;
String firstname;
String lastname;
}
{
"_class" : "com.example.Person",
"id" : "cb7bef",
"firstname" : "Sarah",
"lastname" : "Connor"
}
默认状况下,域类型类名用于类型提醒。

类型提醒能够配置为保留自定义信息。应用@TypeAlias正文来执行此操作。

确保@TypeAlias在初始实体集 (
AbstractElasticsearchConfiguration#getInitialEntitySet) 中增加类型,以便在首次从存储中读取数据时曾经领有可用的实体信息。

示例 57. 带别名的类型提醒

@TypeAlias("human")
public class Person {

@Id String id;
// ...
}
{
"_class" : "human",
"id" : ...
}
写入实体时应用配置的别名。

除非属性类型是Object、接口或理论值类型与属性申明不匹配,否则不会为嵌套对象编写类型提醒。

禁用类型提醒
当应该应用的索引曾经存在而没有在其映射中定义类型提醒并且映射模式设置为严格时,可能须要禁用类型提醒的写入。在这种状况下,写入类型提醒会产生谬误,因为该字段无奈主动增加。

通过笼罩writeTypeHints()派生自的配置类中的办法,能够为整个应用程序禁用类型提醒
AbstractElasticsearchConfiguration(请参阅Elasticsearch 客户端)。

作为代替计划,能够应用@Document正文为单个索引禁用它们:

@Document(indexName = "index", writeTypeHint = WriteTypeHint.FALSE)
咱们强烈建议不要禁用类型提醒。只有在被迫时才这样做。禁用类型提醒可能会导致无奈从 Elasticsearch 正确检索文档,以防多态数据或文档检索可能齐全失败。

天文空间类型
像Point&这样的天文空间类型GeoPoint被转换为纬度/经度对。

示例 58. 天文空间类型

public class Address {

String city, street;
Point location;
}
{
"city" : "Los Angeles",
"street" : "2800 East Observatory Road",
"location" : { "lat" : 34.118347, "lon" : -118.3026284 }
}
GeoJson 类型
Spring Data Elasticsearch 通过为GeoJson不同几何提供接口和实现来反对 GeoJson 类型。它们依据 GeoJson 标准映射到 Elasticsearch 文档。实体的相应属性在索引映射中指定,就像geo_shape编写索引映射时一样。(也请查看Elasticsearch 文档)

示例 59. GeoJson 类型

public class Address {

String city, street;
GeoJsonPoint location;
}
{
"city": "Los Angeles",
"street": "2800 East Observatory Road",
"location": {

"type": "Point","coordinates": [-118.3026284, 34.118347]

}
}
实现了以下 GeoJson 类型:

GeoJsonPoint
GeoJsonMultiPoint
GeoJsonLineString
GeoJsonMultiLineString
GeoJsonPolygon
GeoJsonMultiPolygon
GeoJsonGeometryCollection
收藏品
对于汇合中的值,在类型提醒和自定义转换方面利用与聚合根雷同的映射规定。

示例 60. 汇合

public class Person {

// ...

List<Person> friends;

}
{
// ...

"friends" : [ { "firstname" : "Kyle", "lastname" : "Reese" } ]
}
地图
对于 Maps 中的值,在类型提醒和自定义转换方面利用与聚合根雷同的映射规定。然而,映射键须要一个字符串能力由 Elasticsearch 解决。

示例 61. 汇合

public class Person {

// ...

Map<String, Address> knownLocations;

}
{
// ...

"knownLocations" : {

"arrivedAt" : {   "city" : "Los Angeles",   "street" : "2800 East Observatory Road",   "location" : { "lat" : 34.118347, "lon" : -118.3026284 } }

}
}
6.1.3.自定义转化
望着Configuration从上一节
ElasticsearchCustomConversions容许注册映射域和简略类型的具体规定。

示例 62. 元模型对象映射配置

@Configuration
public class Config extends AbstractElasticsearchConfiguration {

@Override
public RestHighLevelClient elasticsearchClient() {

return RestClients.create(ClientConfiguration.create("localhost:9200")).rest();

}

@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {

return new ElasticsearchCustomConversions(  Arrays.asList(new AddressToMap(), new MapToAddress()));       

}

@WritingConverter
static class AddressToMap implements Converter<Address, Map<String, Object>> {

@Overridepublic Map<String, Object> convert(Address source) {  LinkedHashMap<String, Object> target = new LinkedHashMap<>();  target.put("ciudad", source.getCity());  // ...  return target;}

}

@ReadingConverter
static class MapToAddress implements Converter<Map<String, Object>, Address> {

@Overridepublic Address convert(Map<String, Object> source) {  // ...  return address;}

}
}
{
"ciudad" : "Los Angeles",
"calle" : "2800 East Observatory Road",
"localidad" : { "lat" : 34.118347, "lon" : -118.3026284 }
}
Spring Data Elasticsearch教程二
增加Converter实现。

设置Converter用于写入DomainTypeElasticsearch。

设置Converter用于DomainType从搜寻后果中读取。

  1. Elasticsearch 操作
    Spring Data Elasticsearch 应用多个接口来定义能够针对 Elasticsearch 索引调用的操作(无关响应式接口的形容,请参阅Reactive Elasticsearch Operations)。

IndexOperations 定义索引级别的操作,例如创立或删除索引。
DocumentOperations 定义基于 id 存储、更新和检索实体的操作。
SearchOperations 定义应用查问搜寻多个实体的操作
ElasticsearchOperations联合DocumentOperations和SearchOperations接口。
这些接口对应于Elasticsearch API的构造。

接口的默认实现提供:

索引治理性能。
对域类型的读/写映射反对。
丰盛的查问和规范 api。
资源管理和异样翻译。
索引治理和主动创立索引和映射。

IndexOperations能够从ElasticsearchOperations实例中获取的接口和提供的实现(例如通过调用operations.indexOps(clazz))使用户可能在 Elasticsearch 集群中创立索引、搁置映射或存储模板和别名信息。能够应用@Setting正文设置将要创立的索引的详细信息,请参阅索引设置以获取更多信息。

这些操作都不是由IndexOperationsor的实现主动实现的ElasticsearchOperations。调用办法是用户的责任。

应用 Spring Data Elasticsearch 存储库时反对主动创立索引和编写映射

7.1弹性搜寻模板
自 4.0 版起,不举荐应用 ElasticsearchTemplate,请改用 ElasticsearchRestTemplate。

这ElasticsearchTemplate是ElasticsearchOperations应用传输客户端的接口实现。

示例 63. ElasticsearchTemplate 配置

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

  return new ElasticsearchTemplate(elasticsearchClient());

}
}
设置传输客户端。自 4.0 版起已弃用。

创立ElasticsearchTemplatebean,同时提供名称、elasticsearchOperations和elasticsearchTemplate。

7.2.ElasticsearchRestTemplate
这ElasticsearchRestTemplate是ElasticsearchOperations应用High Level REST Client的接口实现。

示例 64. ElasticsearchRestTemplate 配置

@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {

return RestClients.create(ClientConfiguration.localhost()).rest();

}

// no special bean creation needed
}
设置高级 REST 客户端。

基类
AbstractElasticsearchConfiguration曾经提供了elasticsearchTemplatebean。

7.3.应用示例
因为两个ElasticsearchTemplate和ElasticsearchRestTemplate实现ElasticsearchOperations接口,应用它们的代码是没有不同的。该示例展现了如何ElasticsearchOperations在 Spring REST 控制器中应用注入的实例。通过为相应的 Bean 提供下面显示的配置之一来做出决定,如果这是应用TransportClient或RestClient。

示例 65. ElasticsearchOperations 应用

@RestController
@RequestMapping("/")
public class TestController {

private ElasticsearchOperations elasticsearchOperations;

public TestController(ElasticsearchOperations elasticsearchOperations) {

this.elasticsearchOperations = elasticsearchOperations;

}

@PostMapping("/person")
public String save(@RequestBody Person person) {

IndexQuery indexQuery = new IndexQueryBuilder()  .withId(person.getId().toString())  .withObject(person)  .build();String documentId = elasticsearchOperations.index(indexQuery);return documentId;

}

@GetMapping("/person/{id}")
public Person findById(@PathVariable("id") Long id) {

Person person = elasticsearchOperations  .queryForObject(GetQuery.getById(id.toString()), Person.class);return person;

}
}
Spring Data Elasticsearch教程二

SpringElasticsearchOperations在构造函数中注入提供的bean。

在 Elasticsearch 集群中存储一些实体。

通过 id 检索具备查问的实体。

要查看残缺的可能性,ElasticsearchOperations请参阅 API 文档。

7.4.反应式 Elasticsearch 操作

ReactiveElasticsearchOperations是应用ReactiveElasticsearchClient.


ReactiveElasticsearchTemplate是默认的实现ReactiveElasticsearchOperations。

7.4.1。反应式 Elasticsearch 模板
要开始,
ReactiveElasticsearchTemplate须要理解要与之单干的理论客户。无关客户端的详细信息,请参阅Reactive Client。

反应式模板配置
建设的最简略的办法
ReactiveElasticsearchTemplate是通过AbstractReactiveElasticsearchConfiguration用于提供专用配置办法钩base package,所述initial entity set等

示例 66.
AbstractReactiveElasticsearchConfiguration

@Configuration
public class Config extends AbstractReactiveElasticsearchConfiguration {

@Bean
@Override
public ReactiveElasticsearchClient reactiveElasticsearchClient() {

  // ...

}
}
配置要应用的客户端。这能够通过ReactiveRestClients或间接通过来实现
DefaultReactiveElasticsearchClient。

如果实用的默认设置HttpHeaders通过ClientConfiguration的
ReactiveElasticsearchClient。请参阅客户端配置。

如果需要的话
ReactiveElasticsearchTemplate能够用默认的配置RefreshPolicy,并IndicesOptions是那些取得通过笼罩的默认利用到相干申请refreshPolicy()和indicesOptions()。

然而,人们可能心愿更好地管制理论组件并应用更具体的办法。

示例 67.配置
ReactiveElasticsearchTemplate

@Configuration
public class Config {

@Bean
public ReactiveElasticsearchClient reactiveElasticsearchClient() {

// ...

}
@Bean
public ElasticsearchConverter elasticsearchConverter() {

return new MappingElasticsearchConverter(elasticsearchMappingContext());

}
@Bean
public SimpleElasticsearchMappingContext elasticsearchMappingContext() {

return new SimpleElasticsearchMappingContext();

}
@Bean
public ReactiveElasticsearchOperations reactiveElasticsearchOperations() {

return new ReactiveElasticsearchTemplate(reactiveElasticsearchClient(), elasticsearchConverter());

}
}
配置要应用的客户端。这能够通过ReactiveRestClients或间接通过来实现
DefaultReactiveElasticsearchClient。

设置了ElasticsearchConverter用于利用由映射上下文提供的元数据域类型映射。

域类型元数据的 Elasticsearch 特定映射上下文。

基于客户端和转换基础架构的理论模板。

Spring Data Elasticsearch教程二
反应式模板应用

ReactiveElasticsearchTemplate 容许您保留、查找和删除您的域对象并将这些对象映射到存储在 Elasticsearch 中的文档。

思考以下:

示例 68. 应用
ReactiveElasticsearchTemplate

@Document(indexName = "marvel")
public class Person {

private @Id String id;
private String name;
private int age;
// Getter/Setter omitted...
}
template.save(new Person("Bruce Banner", 42))
.doOnNext(System.out::println)
.flatMap(person -> template.findById(person.id, Person.class))
.doOnNext(System.out::println)
.flatMap(person -> template.delete(person))
.doOnNext(System.out::println)
.flatMap(id -> template.count(Person.class))
.doOnNext(System.out::println)
.subscribe();
以上在管制台上输入以下序列。

Person(id=QjWCWWcBXiLAnp77ksfR, name=Bruce Banner, age=42)
Person(id=QjWCWWcBXiLAnp77ksfR, name=Bruce Banner, age=42)
QjWCWWcBXiLAnp77ksfR
0
在字符类型下将新Person文档插入奇观索引中。该是在服务器端和一套生成到返回的实例。id

在字符类型下的奇观索引中查找Person与匹配。id

删除从给定实例中提取的Person匹配字符id,在奇观索引中的字符类型下。

在字符类型下计算奇观索引中的文档总数。

不要遗记订阅()。