3.4. 使用带有远程缓存的 analyzers
分析器将输入数据转换为您可以索引和查询的术语。您可以在 Java 类中使用 @Text
注释指定分析器定义,或者在 Protobuf schema 中直接指定分析器定义。
流程
-
使用
@Text
注释给属性添加注释,以指示其值已被分析。 -
使用
分析器
属性指定您要用于索引和搜索所需的分析器。
protobuf 模式
/* @Indexed */ message TestEntity { /* @Keyword(projectable = true) */ optional string id = 1; /* @Text(projectable = true, analyzer = "simple") */ optional string name = 2; }
Java 类
@Text(projectable = true, analyzer = "whitespace") @ProtoField(value = 1) private String id; @Text(projectable = true, analyzer = "simple") @ProtoField(value = 2) private String description;
3.4.1. 默认分析器定义
Data Grid 提供了一组默认的分析器定义。
定义 | 描述 |
---|---|
| 将文本字段拆分为令牌,将空格和标点分隔为分隔符。 |
| 通过取消限制非字母的令牌化输入流,然后将所有字母转换为小写字符。空格和非字母将被丢弃。 |
| 分割空格上的文本流,并将非空格字符序列返回为令牌。 |
| 将整个文本字段视为单一令牌。 |
| 使用 Snowball Porter 过滤器窃取英语词. |
| 默认情况下,生成大小为 3 分的 ngram 令牌。 |
|
将文本字段分成比 |
| 将文本的所有字母转换为小写字符,文本不会被令牌化(规范化程序)。 |
这些分析器定义基于 Apache Lucene。有关令牌工具、过滤器和 CharFilters 的更多信息,请参阅 Apache Lucene 文档。
其他资源
3.4.2. 创建自定义分析器定义
创建自定义分析器定义,并将它们添加到您的 Data Grid Server 安装中。
先决条件
如果 Data Grid Server 正在运行,则停止它。
Data Grid Server 仅在启动时加载类。
流程
-
实施
ProgrammaticSearchMappingProvider
API。 在 JAR 中打包您的实现,在以下文件中带有完全限定类(FQN):
META-INF/services/org.infinispan.query.spi.ProgrammaticSearchMappingProvider
-
将 JAR 文件复制到 Data Grid Server 安装的
server/lib
目录中。 - 启动 Data Grid Server。
ProgrammaticSearchMappingProvider
示例
import org.apache.lucene.analysis.core.LowerCaseFilterFactory; import org.apache.lucene.analysis.core.StopFilterFactory; import org.apache.lucene.analysis.standard.StandardFilterFactory; import org.apache.lucene.analysis.standard.StandardTokenizerFactory; import org.hibernate.search.cfg.SearchMapping; import org.infinispan.Cache; import org.infinispan.query.spi.ProgrammaticSearchMappingProvider; public final class MyAnalyzerProvider implements ProgrammaticSearchMappingProvider { @Override public void defineMappings(Cache cache, SearchMapping searchMapping) { searchMapping .analyzerDef("standard-with-stop", StandardTokenizerFactory.class) .filter(StandardFilterFactory.class) .filter(LowerCaseFilterFactory.class) .filter(StopFilterFactory.class); } }