如何为搜索查询选择碎片



我最近实现了shardidentifierProvider。正常工作。但是如何确保它仅使用一个共享查询?

public class SiteIdAsShardIdProvider extends ShardIdentifierProviderTemplate {
@Override
protected Set<String> loadInitialShardNames(Properties properties, BuildContext buildContext) {
    ServiceManager serviceManager = buildContext.getServiceManager();
    SessionFactory sessionFactory = serviceManager.requestService(HibernateSessionFactoryServiceProvider.class, buildContext);
    Session session = sessionFactory.openSession();
    try {
        @SuppressWarnings("unchecked")
        List<String> ids = session.createSQLQuery("select cast(id as CHAR(3)) from website").list();
        return new HashSet<>(ids);
    } finally {
        session.close();
    }
}
@Override
public String getShardIdentifier(Class<?> entityType, Serializable id, String idAsString, Document document) {
    return document.getFieldable("siteId").stringValue();
}
}

创建自己的自定义过滤器,覆盖getShardIdentifiersForQuery应该可以解决问题。这是与文档中的内容大致相同的功能,但是使用ShardIdentifierProviderTemplate

@Override
public Set<String> getShardIdentifiersForQuery(FullTextFilterImplementor[] filters) {
    FullTextFilter filter = getFilterByName( filters, "customer" );
    if ( filter == null ) {
        return getAllShardIdentifiers();
    }
    else {
        Set<String> result = new HashSet<>();
        result.add( filter.getParameter( "customerID" ) );
        return result;
    }
}
private FullTextFilter getFilterByName(FullTextFilterImplementor[] filters, String name) {
    for ( FullTextFilterImplementor filter: filters ) {
        if ( filter.getName().equals( name ) ) {
            return filter;
        }
    }
    return null;
}

我创建了一张票以更新文档:https://hibernate.atlassian.net/browse/hsearch-2513

查询时间的碎片选择是通过使用自定义过滤器来控制的。

有关详细信息和示例,请参见" 5.3.1。在碎片环境中使用过滤器"。

最新更新