我目前正在像这样使用MassIndexer重新索引我的实体:
fullTextSession.createIndexer().startAndWait();
但是,我了解到MassIndexer不会删除现有的映射。似乎唯一的删除映射的方法是将index_schema_management_strategy
设置为“拖放并创建”,不建议在生产环境中使用。
我曾尝试在使用MassIndexer重新索引之前,先使用DELETE索引API 来直接进行弹性搜索,但这会在我们的映射中引入奇怪的行为。
删除索引及其映射,然后使用MassIndexer重建该索引的推荐方法是什么?
答案 0 :(得分:1)
我已经找到了一种使休眠搜索完全删除映射和索引的方法,尽管这是一个非常好的解决方法。
通过像这样实例化ElasticSearchService
:
SearchIntegrator si = org.hibernate.search.orm.spi.SearchIntegratorHelper.extractFromEntityManagerFactory( fullTextSession.getEntityManagerFactory() );
ElasticsearchService elasticsearchService = si.getServiceManager().requestService(ElasticsearchService.class);
然后您可以访问以下课程:
ElasticsearchSchemaDropper schemaDropper = elasticsearchService.getSchemaDropper();
ElasticsearchSchemaCreator schemaCreator = elasticsearchService.getSchemaCreator();
并执行以下操作:
schemaDropper.drop(URLEncodedString.fromString("index you want to drop"), options);
schemaCreator.createIndex( indexMetadata, options );
schemaCreator.createMappings( indexMetadata, options );
这实际上是drop-and-create
配置设置将为您执行的操作。我们计划将其设置为一些外部服务,以便在我们要完全重建索引(包括映射和文档)时都可以使用。
不幸的是,这感觉很hacky,而且很好奇,似乎没有更好的方法可以做到这一点。
答案 1 :(得分:0)
MassIndexer的目的是作为灾难恢复策略来帮助更新索引内容或建立初始索引状态,因为通常情况下索引保持同步。
这并不意味着ro对索引执行更高级的生命周期操作,例如实时模式更改。
为此,我建议您至少应该停止/重新启动Hibernate应用程序(以便可以使用该其他属性),并且最有可能通过外部脚本或在发行过程中调用索引管理操作。
让Hibernate Search管理索引架构是为了在开发过程中提供方便。