在 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
。
在 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 不会帮助你这样做)。
我正在将 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
。
在 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 不会帮助你这样做)。