如何将分片 ID 添加到 ShardIdentifierProvider?
How to add shard id to ShardIdentifierProvider?
我使用属性文件配置了 ShardIdProvider。
hibernate.search.default.sharding_strategy=com.sodonsolution.portalcms3.search.SiteIdAsShardIdProvider
然后我需要在 运行 时添加分片 ID。 ShardIdentifierProviderTemplate.addShard
方法存在,但如何访问?
简短的回答是:您不需要调用该方法,至少不需要从分片标识符提供程序外部调用:它是自动的。
长答案:只要发现分片中的第一个实体,就应该自动添加分片。
这就是 addShard
方法是 protected
的原因:它仅从分片标识符提供程序内部调用,如下所示:
public static class SiteIdShardIdentifierProvider extends ShardIdentifierProviderTemplate {
@Override
public String getShardIdentifier(Class<?> entityType, Serializable id, String idAsString, Document document) {
if ( entityType.equals( MyEntityAssociatedWithASite.class ) ) {
final String siteId = document.getField( "site.id" ).stringValue();
addShard( siteId );
return siteId;
}
throw new RuntimeException( "MyEntityAssociatedWithASite expected but found " + entityType );
}
}
从您的分片标识符提供程序的名称来看,它使用站点 ID 作为分片 ID(类似于我上面的示例),因此您无需执行任何操作即可添加新分片:它应在您使用新站点 ID 索引新实体后立即添加。如果这不起作用,则您的分片标识符提供程序的代码可能存在问题。
另请参阅 Hibernate Search 文档,其中解释了 ShardIdentifierProviderTemplate
的工作原理:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#advanced-features-dynamic-sharding
我使用属性文件配置了 ShardIdProvider。
hibernate.search.default.sharding_strategy=com.sodonsolution.portalcms3.search.SiteIdAsShardIdProvider
然后我需要在 运行 时添加分片 ID。 ShardIdentifierProviderTemplate.addShard
方法存在,但如何访问?
简短的回答是:您不需要调用该方法,至少不需要从分片标识符提供程序外部调用:它是自动的。
长答案:只要发现分片中的第一个实体,就应该自动添加分片。
这就是 addShard
方法是 protected
的原因:它仅从分片标识符提供程序内部调用,如下所示:
public static class SiteIdShardIdentifierProvider extends ShardIdentifierProviderTemplate {
@Override
public String getShardIdentifier(Class<?> entityType, Serializable id, String idAsString, Document document) {
if ( entityType.equals( MyEntityAssociatedWithASite.class ) ) {
final String siteId = document.getField( "site.id" ).stringValue();
addShard( siteId );
return siteId;
}
throw new RuntimeException( "MyEntityAssociatedWithASite expected but found " + entityType );
}
}
从您的分片标识符提供程序的名称来看,它使用站点 ID 作为分片 ID(类似于我上面的示例),因此您无需执行任何操作即可添加新分片:它应在您使用新站点 ID 索引新实体后立即添加。如果这不起作用,则您的分片标识符提供程序的代码可能存在问题。
另请参阅 Hibernate Search 文档,其中解释了 ShardIdentifierProviderTemplate
的工作原理:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#advanced-features-dynamic-sharding