如何 select 分片搜索查询?
How to select shard for search query?
我最近实现了 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();
}
}
查询时的分片选择由自定义过滤器控制。
有关详细信息和示例,请参阅 "5.3.1. Using filters in a sharded environment"。
创建您自己的自定义过滤器并覆盖 getShardIdentifiersForQuery
应该可以解决问题。这是与 the documentation 中的内容大致相同的内容,但具有 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
我最近实现了 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();
}
}
查询时的分片选择由自定义过滤器控制。
有关详细信息和示例,请参阅 "5.3.1. Using filters in a sharded environment"。
创建您自己的自定义过滤器并覆盖 getShardIdentifiersForQuery
应该可以解决问题。这是与 the documentation 中的内容大致相同的内容,但具有 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