2016-12-07 1 views
0

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

답변

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

관련 문제