11.4. 嵌入式搜索
当 Data Grid 用作库时,可以使用嵌入式搜索。不需要 protobuf 映射,并在 Java 对象之上进行索引和搜索。
11.4.1. 快速示例 复制链接链接已复制到粘贴板!
我们将将 Book 实例存储在名为"books"的数据网格缓存中。将对本书实例进行索引,因此我们为缓存启用索引:
Data Grid 配置:
infinispan.xml
获取缓存:
每个 Book 将按照以下示例定义;我们必须选择索引哪些属性;对于每个属性,我们可以选择使用 Hibernate Search 项目中定义的注释选择高级索引选项。
Book.java
Author.java
public class Author {
@Field String name;
@Field String surname;
// hashCode() and equals() omitted
}
public class Author {
@Field String name;
@Field String surname;
// hashCode() and equals() omitted
}
假设我们在我们的 Data Grid Cache 中存储了多个 Book 实例,我们可以根据以下示例所示搜索任何匹配字段。
QueryExample.java
除了 list () 外,您还可以选择获取 迭代器 () 或使用分页。
11.4.2. 映射实体 复制链接链接已复制到粘贴板!
网格依赖于 Hibernate Search 的丰富 API,以定义在实体级别索引的精细配置。此配置包括注解哪些字段,这些分析器应使用,如何映射嵌套对象等。Hibernate Search 手册中 提供了详细的文档。
11.4.2.1. @DocumentId 复制链接链接已复制到粘贴板!
与 Hibernate Search 不同,使用 @DocumentId 将字段标记为标识符不适用于 Data Grid 值;在 Data Grid 中,所有 @Indexed 对象的标识符是用于存储值的密钥。您仍然可以使用 @Transformable、自定义类型和自定义 FieldBridge 实施的组合来自定义键的索引方式。
11.4.2.2. @Transformable 键 复制链接链接已复制到粘贴板!
每个值的密钥也需要索引,必须在 String 中转换密钥实例。Data Grid 包括一些默认的转换例程来编码常见的原语,但要使用一个自定义密钥,您必须提供一个 org.infinispan.query.Transformer 的实现。
通过注解注册密钥转换程序
您可以使用 org.infinispan.query.Transformable 标注密钥类,您的自定义转换器实施将自动获取:
通过缓存索引配置注册密钥转换程序
在嵌入式和服务器配置中使用 key-transformers xml 元素:
或者,使用 Java 配置 API (embedded 模式):
ConfigurationBuilder builder = ...
builder.indexing().enable()
.addKeyTransformer(CustomKey.class, CustomTransformer.class);
ConfigurationBuilder builder = ...
builder.indexing().enable()
.addKeyTransformer(CustomKey.class, CustomTransformer.class);
11.4.2.3. 程序映射 复制链接链接已复制到粘贴板!
除了使用注解将实体映射到索引外,还可以以编程方式进行配置。
在以下示例中,我们映射了一个要存储在网格中的对象 Author,并可在两个属性上搜索,但没有注解类。