2016-12-07 8 views
0

最近ShardIdentifierProviderが実装されました。それは正常に動作しています。しかし、それが確実に1つのクエリで共有を使用していることを確認するには?検索クエリにshardを選択するにはどうすればよいですか?

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(); 
} 
} 

答えて

1

独自のカスタムフィルタを作成し、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

0

クエリ時のシャード選択は、カスタムフィルタを使用して制御されます。

詳細および例については、"5.3.1. Using filters in a sharded environment"を参照してください。

+0

IndexShardingStrategyが廃止されました。私はShardIdentifierProviderTemplateを実装しています。 IndexShardingStrategyの代わりにShardIdentifierProviderTemplateをFilterで使用できますか? – hurelhuyag

関連する問題