我正在关注THIS链接上的文档,我想将Analyzer定义移到一个单独的类中。
这是我想要移动的代码块,以便不将其绑定到特定实体。
@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")
添加到我的实体类中。
有什么想法吗?非常感谢
答案 0 :(得分:2)
现在,您唯一的选择是将定义移至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中也没有发布)。
答案 1 :(得分:0)
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”索引。但这看起来有点问题。