我正在按THIS链接中的文档,我想将分析器定义移到一个单独的类中。
这是我想移动的代码块,以免将其绑定到特定实体。
@Entity
@Indexed
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
@Parameter(name = "language", value = "English")
})
})
public class Book {
@Field
@Analyzer(definition = "customanalyzer")
private String title;
....
基本上,我希望将所有这些定义到一个单独的类中,并且仅将@Analyzer(definition = "customanalyzer")
添加到我的实体类中。
有什么想法吗?非常感谢
现在,您唯一的选择是将定义移至package-info.java
文件并用以下内容填充:
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
@Parameter(name = "language", value = "English")
})
})
package org.whatever.my.package.is;
请注意,此程序包中必须至少有一个带注释的实体,否则Hibernate Search只会忽略它。
Hibernate Search 5.8将提供一个实验性的专用程序化API,允许以全局方式定义分析器,但是此功能尚未发布(甚至在最新的5.8.Beta2中也没有发布。
Hibernate Search中@AnalyzerDef
的设计确实很差。例如,您不能使用分析器定义提取单独的库,而不能在服务或应用程序中使用它们。如果要定义分析器定义,它们需要引入可索引的实体。
但是,您可以像这样创建一个假实体:
@Entity
@Subselect("select * from analyzers_definition")
@Indexed(index = "analyzers_definition")
@AnalyzerDef(...)
public class AnalyzersDefinition {
@Id protected Long id;
}
由于@Subselect
批注,将不会在数据库中创建表,但是@AnalyzerDef
批注将被正确使用。唯一的缺点是,将在您的Lucene / ElasticSearch /任何存储中创建“ analyzers_definition”索引。但这看起来有点问题。