原题目: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>> {
@Override
public 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> {
@Override
public 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 从搜寻后果中读取。
- 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,在奇观索引中的字符类型下。
在字符类型下计算奇观索引中的文档总数。
不要遗记订阅()。