7.5.4. 优化查询过程
查询性能取决于几个条件:
- Lucene 查询。
- 加载的对象数量:使用分页(始终)或索引投射(如果需要)。
- Hibernate 搜索与 Lucene 读取器交互的方式:定义相应的读取器策略。
- 从索引中缓存经常提取的值。如需更多信息,请参阅 缓存索引值:fieldCache。
7.5.4.1. 缓存索引值:fieldCache 复制链接链接已复制到粘贴板!
Lucene 索引的主要功能是识别与您查询的匹配项。在执行查询后,必须分析结果,以提取有用的信息。Hibernate 搜索通常需要提取类类型和主密钥。
从索引中提取所需的值具有性能成本,在某些情况下这可能非常低且不容易,但在某些情况下,这可能是缓存的良好候选者。
要求取决于使用的 Projections 的类型,因为在某些情况下不需要类类型,因为它可以从查询上下文或其他方法推断出来。
使用 @CacheFromIndex 注释,您可以试验 Hibernate Search 所需的各种主元数据字段:
可以使用此注解缓存类类型和 ID:
CLASS
:Hibernate Search 将使用 Lucene FieldCache 来提高从索引中提取类类型的性能。此值默认为启用,如果您不指定 @CacheFromIndex 注释,则应用 Hibernate Search。
-
ID
:提取主标识符将使用缓存。这有可能提供最佳性能查询,但会消耗更多的内存,进而可能会降低性能。
测量静止后性能和内存消耗的影响(执行某些查询)。通过启用字段缓存可以提高性能,但情况并非始终如此。
使用 FieldCache 有两个缺点需要考虑:
- 内存使用情况:这些缓存可能会相当耗尽内存。通常 CLASS 缓存的要求低于 ID 缓存。
- 索引温:使用字段缓存时,新索引或分段上的第一个查询将比未启用缓存时慢。
对于某些查询,根本不需要类类型,在这种情况下,即使您启用了 CLASS
字段缓存,也可能不会使用它;例如,如果您的目标为一个类,很明显,所有返回的值都将是该类型(每次查询执行中都会评估)。
若要使用 ID FieldCache,目标实体的 ID 必须使用 TwoWayFieldBridge(作为所有构建的网桥),并且特定查询中加载的所有类型都必须将 fieldname 用于 id,并且具有相同类型的 ID(每次执行查询时都会进行评估)。