7.8.4. sharding Indexes
在某些情况下,将给定实体的索引化数据分到几个 Lucene 索引中非常有用。
只有在优点大于缺点时才应实施分片。搜索分片索引通常较慢,因为所有分片都必须打开一次搜索。
分片的可能用例是:
- 单个索引非常大,因此索引更新时间正在减慢应用程序的速度。
- 典型的搜索只会达到索引的一个子集,例如数据自然被客户、区域或应用细分。
默认情况下不启用分片,除非配置了分片数量。要做到这一点,请使用 hibernate.search.<indexName>.sharding_strategy.nbr_of_shards
属性。
示例:启用索引划分
在本例中,启用五个分片。
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards = 5
hibernate.search.<indexName>.sharding_strategy.nbr_of_shards = 5
负责将数据拆分为 sub-indexes 是 indexShardingStrategy。默认分片策略会根据 ID 字符串表示法的散列值(由 FieldBridge 生成)来分割数据。这可确保比较平衡的分片。您可以通过实施自定义 IndexShardingStrategy 来替换默认策略。要使用自定义策略,您必须设置 hibernate.search.<indexName>.sharding_strategy
属性。
示例:指定自定义划分策略
hibernate.search.<indexName>.sharding_strategy = my.shardingstrategy.Implementation
hibernate.search.<indexName>.sharding_strategy = my.shardingstrategy.Implementation
IndexShardingStrategy 属性还允许通过选择针对哪个分片运行查询来优化搜索。通过激活过滤器,分片策略可以选择用于应答查询的分片的子集(IndexShardingStrategy.getIndexManagersForQuery),从而加快查询执行。
每个分片都有独立的 IndexManager,因此可以配置为使用不同的目录供应商和后端配置。以下示例中 Animal 实体的 IndexManager 索引名称是 Animal.0 到
Animal.4
。换句话说,每个分片都有其自己的索引的名称,后跟 .
(dot)及其索引号。
示例:对实体 Animal 进行划分配置
在上例中,配置使用默认的 id 字符串散列策略,并将 Animal 索引分片为 5 子索引。所有子索引都是文件系统实例,以及存储每个子索引的目录如下:
-
对于 sub-index 0:
/usr/lucene/indexes/Animal00
(共享 indexBase,但覆盖 indexName) -
对于子索引 1:
/usr/lucene/indexes/Animal.1
(共享索引Base,默认 indexName) -
对于子索引 2:
/usr/lucene/indexes/Animal.2
(共享 indexBase,默认 indexName) -
对于 sub-index 3:
/usr/lucene/shared/Animal03
(覆盖索引Base,覆盖 indexName) -
对于子索引 4:
/usr/lucene/indexes/Animal.4(
共享 indexBase,默认 indexName)
在实施 IndexShardingStrategy 时,可使用任何字段来确定分片选择。考虑为了处理删除、清除
和清除All
操作,实施可能需要返回一个或多个索引,而无需读取所有字段值或主标识符。在这种情况下,信息不足以选择一个索引,应该返回所有索引,以便将删除操作传播到所有可能包含要删除的文档的索引。