7.8.2. 使用 IndexReader


Lucene 中的查询在 IndexReader 上执行。Hibernate 搜索可能会缓存索引读取器以最大化性能,或者提供其他有效策略来检索更新的 indexReader 最小化 I/O 操作。您的代码可以访问这些缓存的资源,但有几个要求。

示例:访问 IndexReader

IndexReader reader = searchFactory.getIndexReaderAccessor().open(Order.class);
try {
   //perform read-only operations on the reader
}
finally {
   searchFactory.getIndexReaderAccessor().close(reader);
}
Copy to Clipboard Toggle word wrap

在本例中,SearchFactory 确定查询此实体需要哪些索引(包含分片策略)。使用每个索引上配置的 ReaderProvider,它会在所有涉及的索引之上返回复合 IndexReader。因为这个 IndexReader 在多个客户端间共享,所以您必须遵循以下规则:

  • 从不调用 indexReader.close(),而是在需要时使用 readerProvider.closeReader(reader),最好是在最后的块中。
  • 不要使用此 IndexReader 进行修改操作(它是只读 indexReader,任何这种尝试都将导致异常)。

除了这些规则外,您还可以自由使用 IndexReader,特别是执行原生 Lucene 查询。使用共享 IndexReaders 时,与从文件系统直接打开一个查询相比,将提高大多数查询的效率。

作为方法 open(Class…​ type)的替代方案,您可以使用 open(String…​ indexNames),允许您传递一个或多个索引名称。如果使用分片,您还可以使用此策略为任何索引类型选择索引子集。

示例:按索引名称访问 IndexReader

IndexReader reader = searchFactory.getIndexReaderAccessor().open("Products.1", "Products.3");
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat