第 4 章 查询嵌入式缓存
当您将 Data Grid 作为库添加到自定义应用程序时,请使用嵌入式查询。
内嵌查询不需要 protobuf 映射。索引和查询都在 Java 对象之上完成。
4.1. 查询嵌入式缓存 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
本节介绍如何使用名为"books"的示例缓存查询嵌入式缓存,该缓存存储了索引的书签实例。
在本例中,每个书签实例都定义了索引哪些属性,并使用 Hibernate Search 注解指定一些高级索引选项,如下所示:
Book.java
package org.infinispan.sample;
import java.time.LocalDate;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.*;
// Annotate values with @Indexed to add them to indexes
// Annotate each fields according to how you want to index it
@Indexed
public class Book {
@FullTextField
String title;
@FullTextField
String description;
@KeywordField
String isbn;
@GenericField
LocalDate publicationDate;
@IndexedEmbedded
Set<Author> authors = new HashSet<Author>();
}
Author.java
package org.infinispan.sample;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
public class Author {
@FullTextField
String name;
@FullTextField
String surname;
}
流程
配置 Data Grid 以索引"books"缓存,并将
org.infinispan.sample.Book指定为索引的实体。<distributed-cache name="books"> <indexing path="${user.home}/index"> <indexed-entities> <indexed-entity>org.infinispan.sample.Book</indexed-entity> </indexed-entities> </indexing> </distributed-cache>获取缓存。
import org.infinispan.Cache; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; EmbeddedCacheManager manager = new DefaultCacheManager("infinispan.xml"); Cache<String, Book> cache = manager.getCache("books");对存储在 Data Grid 缓存中的书签实例中执行查询,如下例所示:
// Get the query factory from the cache QueryFactory queryFactory = org.infinispan.query.Search.getQueryFactory(cache); // Create an Ickle query that performs a full-text search using the ':' operator on the 'title' and 'authors.name' fields // You can perform full-text search only on indexed caches Query<Book> fullTextQuery = queryFactory.create("FROM org.infinispan.sample.Book b WHERE b.title:'infinispan' AND b.authors.name:'sanne'"); // Use the '=' operator to query fields in caches that are indexed or not // Non full-text operators apply only to fields that are not analyzed Query<Book> exactMatchQuery=queryFactory.create("FROM org.infinispan.sample.Book b WHERE b.isbn = '12345678' AND b.authors.name : 'sanne'"); // You can use full-text and non-full text operators in the same query Query<Book> query=queryFactory.create("FROM org.infinispan.sample.Book b where b.authors.name : 'Stephen' and b.description : (+'dark' -'tower')"); // Get the results List<Book> found=query.execute().list();