当前位置: 首页 > 后端技术 > Java

Spring认证中国教育管理中心-SpringDataElasticsearch教程二

时间:2023-04-01 16:42:34 Java

原标题:Spring认证中国教育管理中心-SpringDataElasticsearch教程二(Spring中国教育管理中心)SpringDataElasticsearch教程二6.1.2。映射规则类型提示映射允许使用发送到服务器的文档中嵌入的类型提示进行通用类型映射。这些类型提示在文档中表示为属性,并为每个聚合根编写。示例56.类型提示publicclassPerson{@IdStringid;字符串名字;Stringlastname;}{"_class":"com.example.Person","id":"cb7bef","firstname":"Sarah","lastname":"Connor"}默认情况下,域类型类名是用于类型提示。可以配置类型提示以保存自定义信息。使用@TypeAlias注解来做到这一点。确保在初始实体集(AbstractElasticsearchConfiguration#getInitialEntitySet)中添加@TypeAlias类型,以便您在第一次从存储中读取数据时已经拥有可用的实体信息。示例57.使用别名@TypeAlias("human")进行类型提示publicclassPerson{@IdStringid;//...}{"_class":"human","id":...}使用配置的别名写入实体。除非属性类型是Object、接口或实际值类型与属性声明不匹配,否则不会为嵌套对象编写类型提示。禁用类型提示当应该使用的索引已经存在且其映射中没有定义类型提示并且映射模式设置为严格时,可能需要禁用类型提示的写入。在这种情况下,写入类型提示会产生错误,因为无法自动添加该字段。通过覆盖派生自AbstractElasticsearchConfiguration的配置类中的writeTypeHints()方法,可以为整个应用程序禁用类型提示(请参阅Elasticsearch客户端)。作为替代方案,可以使用@Document注释为单个索引禁用它们:@Document(indexName="index",writeTypeHint=WriteTypeHint.FALSE)我们强烈建议不要禁用类型提示。只有在被迫时才这样做。在多态数据或文档检索可能完全失败的情况下,禁用类型提示可能会阻止从Elasticsearch正确检索文档。地理空间类型Point&GeoPoint等地理空间类型被转换为纬度/经度对。示例58.地理空间类型publicclassAddress{Stringcity,street;Pointlocation;}{"city":"LosAngeles","street":"2800EastObservatoryRoad","location":{"lat":34.118347,"lon":-118.3026284}}GeoJsontypeSpringDataElasticsearch支持GeoJson类型,通过为不同的GeoJson几何图形提供接口和实现。它们根据GeoJson规范映射到Elasticsearch文档。在indexmap中指定entity对应的属性,就像写indexmap时的geo_shape一样。(另请参阅Elasticsearch文档)示例59.GeoJson类型publicclassAddress{Stringcity,street;GeoJsonPointlocation;}{"city":"LosAngeles","street":"2800EastObservatoryRoad","location":{"type":"Point","coordinates":[-118.3026284,34.118347]}}实现以下GeoJson类型:GeoJsonPointGeoJsonMultiPointGeoJsonLineStringGeoJsonMultiLineStringGeoJsonPolygonGeoJsonMultiPolygonGeoJsonGeometryCollectionCollections应用与集合映射规则中的值相同的类型聚合提示和自定义转换。示例60.集合publicclassPerson{//...Listfriends;}{//..."friends":[{"firstname":"Kyle","lastname":"Reese"}]}Maps对于Maps中的值,在类型提示和自定义转换方面应用与聚合根相同的映射规则。但是,映射键需要一个字符串才能由Elasticsearch处理。示例61.集合publicclassPerson{//...MapknownLocations;}{//..."knownLocations":{"arrivedAt":{"city":"LosAngeles","street":"2800天文台东道","location":{"lat":34.118347,"lon":-118.3026284}}}}6.1.3.自定义转换查看上一节中的配置ElasticsearchCustomConversions允许注册映射域和简单的特定于类型的规则。示例62.元模型对图像射击配置@ConfigurationpublicclassConfigextendsAbstractElasticsearchConfiguration{@OverridepublicRestHighLevelClientelasticsearchClient(){returnRestClients.create(ClientConfiguration.create("localhost:9200")).rest();}@Bean@OverridepublicElasticsearchCustomConversionselasticsearchCustomConversions(){返回新的ElasticsearchCustomConversions(Arrays.asList(newAddressToMap(),newMapToAddress()));}@WritingConverter静态类AddressToMap实现Converter>{@OverridepublicMapconvert(Addresssource){LinkedHashMaptarget=newLinkedHashMap<>();target.put("ciudad",source.getCity());//...返回目标;}}@ReadingConverter静态类MapToAddress实现Converter,Address>{@OverridepublicAddressconvert(Mapsource){//...返回地址;}}}{"ciudad":"LosAngeles","calle":"2800EastObservatoryRoad","localidad":{"lat":34.118347,"lon":-118.3026284}}SpringDataElasticsearchTutorial2添加转换器实现设置转换器写入DomainTypeElasticsearch。将域类型的转换器设置为从搜索结果中读取。ElasticsearchOperationsSpringDataElasticsearch使用多个接口来定义可以针对Elasticsearch索引调用的操作(有关反应接口的描述,请参阅ReactiveElasticsearchOperations)。IndexOperations定义索引级操作,例如创建或删除索引。DocumentOperations定义了基于id存储、更新和检索实体的操作。SearchOperations定义使用查询搜索多个实体的操作。ElasticsearchOperations结合了DocumentOperations和SearchOperations接口。这些接口对应于ElasticsearchAPI的结构。该接口的默认实现提供:索引管理功能。域类型的读/写映射支持。丰富的查询和标准的api。资源管理和异常翻译。索引管理和自动创建索引和地图。可以从ElasticsearchOperations实例(例如,通过调用operations.indexOps(clazz))获得的IndexOperations接口和提供的实现使用户能够在Elasticsearch集群中创建索引、放置映射或存储模板和别名信息。可以使用@Setting注释设置将要创建的索引的详细信息,有关更多信息,请参阅索引设置。这些操作都不是由ElasticsearchOperations的IndexOperations或IndexOperations的实现自动完成的。调用该方法是用户的责任。使用SpringDataElasticsearchrepositories时支持自动创建索引和写入映射7.1ElasticsearchTemplate从4.0版本开始,ElasticsearchTemplate被弃用,请改用ElasticsearchRestTemplate。ElasticsearchTemplate是传输客户端使用的ElasticsearchOperations接口的实现。示例63.ElasticsearchTemplate配置@ConfigurationpublicclassTransportClientConfigextendsElasticsearchConfigurationSupport=newPreBuiltTransportClient(settings);client.addTransportAddress(newTransportAddress(InetAddress.getByName("127.0.0.1"),9300));返回客户端;}@Bean(name={"elasticsearchOperations","elasticsearchTemplate"})publicElasticsearchTemplateelasticsearchTemplate()抛出UnknownHostException{returnnewElasticsearchTemplate(elasticsearchClient());}}设置传输客户端。自4.0版后已弃用。创建ElasticsearchTemplatebean,提供名称、elasticsearchOperations和elasticsearchTemplate。7.2.ElasticsearchRestTemplate这个ElasticsearchRestTemplate是使用HighLevelRESTClient的ElasticsearchOperations的接口实现。示例64.ElasticsearchRestTemplate配置@ConfigurationpublicclassRestClientConfigextendsAbstractElasticsearchConfiguration{@OverridepublicRestHighLevelClientelasticsearchClient(){returnRestClients.create(ClientConfiguration.localhost()).rest();}//不需要创建特殊的bean高级REST客户端设置}.基类AbstractElasticsearchConfiguration已经提供了elasticsearchTemplatebean。7.3.使用示例由于ElasticsearchTemplate和ElasticsearchRestTemplate都实现了ElasticsearchOperations接口,因此使用它们的代码没有什么不同。此示例说明如何在SpringREST控制器中使用ElasticsearchOperations的注入实例。通过为相应的bean提供上面显示的配置之一来确定这是使用TransportClient还是RestClient。示例65.使用@RestController@RequestMapping("/")的ElasticsearchOperationspublicTestController(ElasticsearchOperationselasticsearchOperations){this.elasticsearchOperations=elasticsearchOperations;}@PostMapping("/person@String")publicResPerson){IndexQueryindexQuery=newIndexQueryBuilder().withId(person.getId().toString()).withObject(person).build();StringdocumentId=elasticsearchOperations.index(indexQuery);returndocumentId;}@GetMapping("/person/{id}")publicPersonfindById(@PathVariable("id")Longid){Personperson=elasticsearchOperations.queryForObject(GetQuery.getById(id.toString()),Person.class);returnperson;}}SpringDataElasticsearch教程2让SpringElasticsearchOperations在构造函数中注入提供的bean。将一些实体存储在Elasticsearch集群中。通过id查询检索实体。要查看全部可能性,请参阅ElasticsearchOperationsAPI文档。7.4.ReactiveElasticsearch操作ReactiveElasticsearchOperations就是使用ReactiveElasticsearchClient。ReactiveElasticsearchTemplate是ReactiveElasticsearchOperations的默认实现。7.4.1.ReactiveElasticsearchTemplate在开始之前,ReactiveElasticsearchTemplate需要了解它将与之合作的实际客户端。有关客户端的详细信息,请参阅ReactiveClient。创建反应式模板配置最简单的方法是使用AbstractReactiveElasticsearchConfiguration提供专用的配置方法hook基础包,初始实体集等实例66.AbstractReactiveElasticsearchConfiguration@ConfigurationpublicclassConfigextendsAbstractReactiveElasticsearchConfiguration{@Bean@ElasticpublicReactiveElasticlas)entreactiveelasticsearch{//...}}配置客户端使用。这可以通过ReactiveRestClients或直接通过DefaultReactiveElasticsearchClient完成。如果通过ReactiveElasticsearchClient的ClientConfiguration对HttpHeaders进行适用的默认设置。请参阅客户端配置。如果需要,ReactiveElasticsearchTemplate可以配置默认的RefreshPolicy,IndicesOptions是通过覆盖refreshingPolicy()和indicesOptions()应用于相关请求的默认值获得的。但是,人们可能希望更好地控制实际组件并使用更详细的方法。示例67.配置ReactiveElasticsearchTemplate@ConfigurationreturnnewSimpleElasticsearchMappingContext();}@BeanpublicReactiveElasticsearchOperationsreactiveElasticsearchOperations(){returnnewReactiveElasticsearchTemplate(reactiveElasticsearchClient(),elasticsearchConverter());}}配置客户端使用。这可以通过ReactiveRestClients或直接通过DefaultReactiveElasticsearchClient完成。ElasticsearchConverter设置为利用映射上下文提供的元数据域类型映射。域类型元数据的Elasticsearch特定映射上下文。基于客户端和转换基础结构的实际模板。SpringDataElasticsearchTutorialTwoReactiveTemplates使用ReactiveElasticsearchTemplate允许您保存、查找和删除域对象,并将这些对象映射到存储在Elasticsearch中的文档。考虑以下内容:示例68.使用ReactiveElasticsearchTemplate@Document(indexName="marvel")publicclassPerson{private@IdStringid;私有字符串名称;私人年龄;//省略Getter/Setter...}template.save(newPerson("BruceBanner",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();above在控制台上输出以下序列。Person(id=QjWCWWcBXiLANp77ksfR,name=BruceBanner,age=42)Person(id=QjWCWWcBXiLANp77ksfR,name=BruceBanner,age=42)QjWCWWcBXiLANp77ksfR0在wonderindex的字符类型下插入一个新的Person文档。这是在服务器端完成的,并生成一个集合来返回实例。id在字符类型下的奇迹索引中查找与Person的匹配项。id删除从给定实例中提取的Person匹配字符id,在miracle索引中的字符类型下。统计wonderindex中字符类型下的文档总数。不要忘记订阅()。