将@AnalyzerDef分析器定义移动到单独的类中

问题描述 投票:0回答:2

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

有什么想法吗?非常感谢

hibernate hibernate-search
2个回答
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中也没有发布。


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

© www.soinside.com 2019 - 2024. All rights reserved.