在 Hibernate Search 中选择运行时的分析器

Choosing an analyzer at runtime in Hibernate Search

我正在将 Hibernate Search 与 Lucene 一起使用,并希望能够添加基于配置文件中提供的过滤器名称(获取,例如 this)的 AnalyzerDef,当应用程序启动。

现在我有这样的代码

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

我看了 the docs 并没有想到我会怎么做。

我怀疑 可能相关。

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