7.5.4. 优化查询过程


查询性能取决于几个条件:

  • Lucene 查询。
  • 加载的对象数量:使用分页(始终)或索引投射(如果需要)。
  • Hibernate 搜索与 Lucene 读取器交互的方式:定义相应的读取器策略。
  • 从索引中缓存经常提取的值。如需更多信息,请参阅 缓存索引值:fieldCache

7.5.4.1. 缓存索引值:fieldCache

Lucene 索引的主要功能是识别与您查询的匹配项。在执行查询后,必须分析结果,以提取有用的信息。Hibernate 搜索通常需要提取类类型和主密钥。

从索引中提取所需的值具有性能成本,在某些情况下这可能非常低且不容易,但在某些情况下,这可能是缓存的良好候选者。

要求取决于使用的 Projections 的类型,因为在某些情况下不需要类类型,因为它可以从查询上下文或其他方法推断出来。

使用 @CacheFromIndex 注释,您可以试验 Hibernate Search 所需的各种主元数据字段:

import static org.hibernate.search.annotations.FieldCacheType.CLASS;
import static org.hibernate.search.annotations.FieldCacheType.ID;

@Indexed
@CacheFromIndex( { CLASS, ID } )
public class Essay {
    ...
Copy to Clipboard Toggle word wrap

可以使用此注解缓存类类型和 ID:

  • CLASS :Hibernate Search 将使用 Lucene FieldCache 来提高从索引中提取类类型的性能。

    此值默认为启用,如果您不指定 @CacheFromIndex 注释,则应用 Hibernate Search。

  • ID :提取主标识符将使用缓存。这有可能提供最佳性能查询,但会消耗更多的内存,进而可能会降低性能。
注意

测量静止后性能和内存消耗的影响(执行某些查询)。通过启用字段缓存可以提高性能,但情况并非始终如此。

使用 FieldCache 有两个缺点需要考虑:

  • 内存使用情况:这些缓存可能会相当耗尽内存。通常 CLASS 缓存的要求低于 ID 缓存。
  • 索引温:使用字段缓存时,新索引或分段上的第一个查询将比未启用缓存时慢。

对于某些查询,根本不需要类类型,在这种情况下,即使您启用了 CLASS 字段缓存,也可能不会使用它;例如,如果您的目标为一个类,很明显,所有返回的值都将是该类型(每次查询执行中都会评估)。

若要使用 ID FieldCache,目标实体的 ID 必须使用 TwoWayFieldBridge(作为所有构建的网桥),并且特定查询中加载的所有类型都必须将 fieldname 用于 id,并且具有相同类型的 ID(每次执行查询时都会进行评估)。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat