将@AnalyzerDef Analyzer定义移动到单独的类中

时间:2017-05-23 10:24:06

标签: hibernate hibernate-search

我正在关注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")添加到我的实体类中。

有什么想法吗?非常感谢

2 个答案:

答案 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”索引。但这看起来有点问题。