7.5.2.6. 在共享环境中使用过滤器


在分片环境中,可以对可用分片的子集执行查询。这可以通过两个步骤完成:

查询索引共享的子集

  1. 创建一个分片策略,它将根据过滤器配置选择 IndexManagers 的子集。
  2. 在查询时激活过滤器。

示例:查询索引共享的子集

在本例中,如果激活了 客户 过滤器,查询会针对特定的客户分片运行。

public class CustomerShardingStrategy implements IndexShardingStrategy {

     // stored IndexManagers in an array indexed by customerID
     private IndexManager[] indexManagers;

     public void initialize(Properties properties, IndexManager[] indexManagers) {
       this.indexManagers = indexManagers;
     }

     public IndexManager[] getIndexManagersForAllShards() {
       return indexManagers;
     }

     public IndexManager getIndexManagerForAddition(
         Class<?> entity, Serializable id, String idInString, Document document) {
       Integer customerID = Integer.parseInt(document.getFieldable("customerID").stringValue());
       return indexManagers[customerID];
     }

     public IndexManager[] getIndexManagersForDeletion(
         Class<?> entity, Serializable id, String idInString) {
       return getIndexManagersForAllShards();
     }

      /**
      * Optimization; don't search ALL shards and union the results; in this case, we
      * can be certain that all the data for a particular customer Filter is in a single
      * shard; simply return that shard by customerID.
      */
     public IndexManager[] getIndexManagersForQuery(
         FullTextFilterImplementor[] filters) {
       FullTextFilter filter = getCustomerFilter(filters, "customer");
       if (filter == null) {
         return getIndexManagersForAllShards();
       }
       else {
         return new IndexManager[] { indexManagers[Integer.parseInt(
           filter.getParameter("customerID").toString())] };
       }
     }

     private FullTextFilter getCustomerFilter(FullTextFilterImplementor[] filters, String name) {
       for (FullTextFilterImplementor filter: filters) {
         if (filter.getName().equals(name)) return filter;
       }
       return null;
     }
    }
Copy to Clipboard Toggle word wrap

在本例中,如果存在名为 customer 的过滤器,则只会查询专用于此客户的分片,否则将返回所有分片。给定分片策略可以响应一个或多个过滤器,并依赖于其参数。

第二步是在查询时激活过滤器。尽管过滤器可以是常规过滤器(如 中定义的),它也在查询后过滤 Lucene 结果,但您可以使用仅传递给分片策略(否则将被忽略)的特殊过滤器。

要使用此功能,请在声明过滤器时指定 ShardSensitiveOnlyFilter 类。

@Indexed
@FullTextFilterDef(name="customer", impl=ShardSensitiveOnlyFilter.class)
public class Customer {
   ...
}

FullTextQuery query = ftEm.createFullTextQuery(luceneQuery, Customer.class);
query.enableFulltextFilter("customer").setParameter("CustomerID", 5);
@SuppressWarnings("unchecked")
List<Customer> results = query.getResultList();
Copy to Clipboard Toggle word wrap

请注意,通过使用 ShardSensitiveOnlyFilter,您不必实施任何 Lucene 过滤器。建议使用过滤器和分片策略来加快分片环境中的查询。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat