在运行时在休眠搜索中选择分析器



我正在使用 Lucene 的 Hibernate 搜索,并希望能够根据配置文件中提供的过滤器名称(获取,例如,这个(添加 AnalyzerDef,在应用程序启动时加载。

现在我有这样的代码

@AnalyzerDefs({
@AnalyzerDef(name = "phraseAnalyzer",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = ClassicFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class)
}),
})
@MappedSuperclass
public abstract class MyObject {

我看了文档,它没有突然出现在我该怎么做。

我怀疑这个问题可能有关。

在 Hibernate Search 5.11 中(从 5.6 或 5.7 开始,IIRC(,您可以使用LuceneAnalysisDefinitionProvider以编程方式定义分析器。

实现接口:

public class CustomAnalysisDefinitionProvider implements LuceneAnalysisDefinitionProvider {
@Override
public void register(LuceneAnalyzerDefinitionRegistryBuilder builder) {
builder.analyzer( "myAnalyzer" )
.tokenizer( KeywordTokenizerFactory.class )
.tokenFilter( ClassicFilterFactory.class )
.tokenFilter( LowerCaseFilterFactory.class )
.tokenFilter( StopFilterFactory.class )
// You can pass parameters like this
.param( "mapping", "org/hibernate/search/test/analyzer/stoplist.properties" )
.param( "ignoreCase", "true" );
// You can define multiple analyzers
builder.analyzer( "otherAnalyzer" )
.tokenizer( ... ) ...
}
}

然后告诉Hibernate Search使用它:

# In properties.java
hibernate.search.lucene.analysis_definition_provider = com.mycompany.CustomAnalysisDefinitionProvider;

register的实现中,您可以自由地做任何您想做的事情,因此您可以签出系统属性甚至加载配置文件。 如果您的实现集有限,那么还可以在启动 JVM 时通过系统属性设置hibernate.search.lucene.analysis_definition_provider直接覆盖定义提供程序。

有关详细信息,请参阅 https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#section-programmatic-analyzer-definition。

在 Hibernate Search6中,API 有点不同,但它们遵循相同的核心原则:https://docs.jboss.org/hibernate/search/6.0/reference/en-US/html_single/#backend-lucene-analysis,你甚至可以将 Spring/CDI bean 注入分析配置器(你不能在 Search 5 中这样做,或者至少 Hibernate Search 不会帮助你做到这一点(。

最新更新