Java 在Hibernate搜索中选择运行时分析器

Java 在Hibernate搜索中选择运行时分析器,java,hibernate,hibernate-search,Java,Hibernate,Hibernate Search,我在Lucene中使用Hibernate搜索,并且希望能够根据在应用程序启动时加载的配置文件中提供的筛选器名称(例如,获取)添加AnalyzerDef 现在我有这样的代码 @AnalyzerDefs({ @AnalyzerDef(name=“phraseAnalyzer”, tokenizer=@TokenizerDef(工厂=关键字TokenizerFactory.class), 过滤器={ @TokenFilterDef(工厂=ClassicFilterFactory.class), @To

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

现在我有这样的代码

@AnalyzerDefs({
@AnalyzerDef(name=“phraseAnalyzer”,
tokenizer=@TokenizerDef(工厂=关键字TokenizerFactory.class),
过滤器={
@TokenFilterDef(工厂=ClassicFilterFactory.class),
@TokenFilterDef(工厂=LowerCaseFilterFactory.class)
}),
})
@映射超类
公共抽象类MyObject{
我看了看,并没有想到我会怎么做

我怀疑可能与此相关。

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

实现接口:

公共类CustomAnalysisDefinitionProvider实现LuceneAnalysisDefinitionProvider{
@凌驾
公共无效寄存器(LuceneAnalyzerDefinitionRegistryBuilder){
生成器分析器(“myAnalyzer”)
.tokenizer(关键字TokenizerFactory.class)
.tokenFilter(ClassicFilterFactory.class)
.tokenFilter(LowerCaseFilterFactory.class)
.tokenFilter(StopFilterFactory.class)
//您可以像这样传递参数
.param(“映射”、“org/hibernate/search/test/analyzer/stoplist.properties”)
.param(“忽略”、“真实”);
//可以定义多个分析器
生成器分析器(“其他分析器”)
.tokenizer(…)。。。
}
}
然后告诉Hibernate Search使用它:

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

register
的实现中,您可以自由地执行任何您想执行的操作,因此您可以检查系统属性,甚至加载配置文件。 如果有一组有限的实现,还可以在启动JVM时通过系统属性设置
hibernate.search.lucene.analysis\u definition\u provider
直接覆盖定义提供程序

有关详细信息,请参阅

在HibernateSearch6中,API有点不同,但它们遵循相同的核心原则:,甚至可以将Spring/CDIBeans注入到分析配置器中(在Search 5中不能这样做,或者至少HibernateSearch不会帮你这么做)。

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

实现接口:

公共类CustomAnalysisDefinitionProvider实现LuceneAnalysisDefinitionProvider{
@凌驾
公共无效寄存器(LuceneAnalyzerDefinitionRegistryBuilder){
生成器分析器(“myAnalyzer”)
.tokenizer(关键字TokenizerFactory.class)
.tokenFilter(ClassicFilterFactory.class)
.tokenFilter(LowerCaseFilterFactory.class)
.tokenFilter(StopFilterFactory.class)
//您可以像这样传递参数
.param(“映射”、“org/hibernate/search/test/analyzer/stoplist.properties”)
.param(“忽略”、“真实”);
//可以定义多个分析器
生成器分析器(“其他分析器”)
.tokenizer(…)。。。
}
}
然后告诉Hibernate Search使用它:

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

register
的实现中,您可以自由地执行任何您想执行的操作,因此您可以检查系统属性,甚至加载配置文件。 如果有一组有限的实现,还可以在启动JVM时通过系统属性设置
hibernate.search.lucene.analysis\u definition\u provider
直接覆盖定义提供程序

有关详细信息,请参阅


在Hibernate Search6中,API有点不同,但它们遵循相同的核心原则:,您甚至可以将Spring/CDI bean注入到分析配置器中(您在Search 5中无法做到这一点,或者至少Hibernate Search不会帮您做到这一点).

如果链接的问题确实相关,则票证声称这在Hibernate Search 6.0中应该是可能的。您可以在Search 6中为analyzer实例命名,但不能使用
analyzer Discriminator
。有办法解决这一问题,但首先:到底需要什么?当您说“在运行时提供”时,您的意思是“启动应用程序时”还是“针对每个HTTP请求”或“针对每个实体实例”?在查询或索引时是否需要更改分析器?启动应用程序时。我想指定筛选器[工厂]或配置文件中的Analyzer。我将更新问题。我假设更改Analyzer后需要重新编制索引?回答如下。是的,在更改Analyzer时需要重新编制索引,无论您如何操作(即使更改了注释,也需要重新编制索引)。如果链接的问题确实相关,则票证声称这在Hibernate Search 6.0中应该是可能的。您可以在Search 6中为analyzer实例命名,但不能使用
analyzer Discriminator
。有办法解决这个问题,但首先:到底需要什么?当您说“在运行时提供”时,您的意思是什么“启动应用程序时”或“针对每个HTTP请求”或“针对每个实体实例”?查询或索引时是否需要更改分析器?启动应用程序时。我希望在配置文件中指定筛选器[工厂]或分析器。我将更新qu