将 @AnalyzerDef 分析器定义移动到一个单独的 class

Move @AnalyzerDef Analyzer definition into a separated class

我正在关注 THIS link 上的文档,我想将分析器定义移动到单独的 class。

这是我要移动的代码块,以免将其绑定到特定实体。

@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; ....

基本上我想将所有这些定义到一个单独的 class 中,并且只将 @Analyzer(definition = "customanalyzer") 添加到我的实体 class.

有什么想法吗?非常感谢

现在您唯一的选择是将定义移动到 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 注释,table 不会在数据库中创建,但 @AnalyzerDef 注释将被正确使用。唯一的缺点是 "analyzers_definition" 索引将在您的 Lucene/ElasticSearch/whatever 存储中创建。但这看起来有点问题。