如何将分片 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