我想使用默认的自定义分析器。在Hibernate搜索的文档中进行在线搜索时,我发现可以在Hibernate配置中对其进行更改。特别是具有“ hibernate.search.analyzer”属性。然后我做了这个属性
<property name="hibernate.search.analyzer">Class of Analyzer </property>
我的问题是:如何创建分析器的类以在属性处传递它? 在特殊情况下,我想使用“ EdgeNGram”,我试图通过EngedNgram的令牌生成器工厂,但是它不起作用。
<property name="hibernate.search.analyzer">EdgeNGramTokenizerFactory.class</property>
您能告诉我一个可以通过此属性传递的类的示例吗?谢谢
答案 0 :(得分:3)
首先,让我警告您,默认分析器通常应为通用分析器,虽然它可能不大,但对于大多数领域来说已经足够了。随着新需求添加到您的应用程序中,您几乎不可能在任何地方都使用相同的分析器,并且最终将不得不至少在某些索引字段中使用特定的分析器。这就是为什么我个人更喜欢使用org.apache.lucene.analysis.core.KeywordAnalyzer
作为默认值,并在需要的地方指定一个分析器。
现在,已经警告您:将EdgeNGramTokenizerFactory
用作默认分析器可能不是一个好主意。如果您仍然想这样做,请继续阅读...
默认分析器不必是类。它可以是一个类的完全限定名称,但是在这里您需要一个自定义分析器,并且编写自己的分析器类可能很复杂,因此,如果您不习惯Lucene,就不推荐这样做。
相反,您可以使用使用named analyzer或an @AnalyzerDef
annotation定义的an analysis definition provider的名称。这些定义使用“现成的”分析组件,并将它们组装到成熟的分析器中,这更容易实现。
因此,例如,您可以定义此类,它不是分析器类,而是提供分析器定义的类:
package com.acme.search;
import org.apache.lucene.analysis.core.ASCIIFoldingFilterFactory;
import org.apache.lucene.analysis.core.LowerCaseFilterFactory;
import org.apache.lucene.analysis.ngram.EdgeNGramTokenizerFactory;
import org.hibernate.search.analyzer.definition.LuceneAnalysisDefinitionProvider;
import org.hibernate.search.analyzer.definition.LuceneAnalysisDefinitionRegistryBuilder;
public class CustomAnalyzerProvider implements LuceneAnalysisDefinitionProvider {
@Override
public void register(LuceneAnalyzerDefinitionRegistryBuilder builder) {
builder
.analyzer( "myAnalyzer" )
.tokenizer( EdgeNGramTokenizerFactory.class )
.param( "minGramSize" "1" )
.param( "maxGramSize", "5" )
.tokenFilter( ASCIIFoldingFilterFactory.class )
.tokenFilter( LowerCaseFilterFactory.class );
}
}
然后在您的persistence.xml
中定义以下属性:
<property name="hibernate.search.lucene.analysis_definition_provider">com.acme.search.CustomAnalyzerProvider</property>
<property name="hibernate.search.analyzer">myAnalyzer</property>
你应该很好。
编辑:如果您使用Elasticsearch集成,则1)使用自定义Lucene Analyzer类永远不会起作用,以及2)您需要对已定义的命名分析器执行此操作代替:
定义此类,它不是分析器类,而是提供分析器定义的类:
package com.acme.search;
import org.hibernate.search.elasticsearch.analyzer.definition.ElasticsearchAnalysisDefinitionProvider;
import org.hibernate.search.elasticsearch.analyzer.definition.ElasticsearchAnalysisDefinitionRegistryBuilder;
public class CustomAnalyzerProvider implements ElasticsearchAnalysisDefinitionProvider {
@Override
public void register(initionRegistryBuilder builder) {
builder.analyzer( "myAnalyzer" )
.withTokenizer( "myEdgeNgram" )
.withCharFilters( "asciifolding" )
.withTokenFilters( "lowercase" );
builder.tokenizer( "myEdgeNgram" )
.type( "edge_ngram" )
.param( "min_gram", "1" )
.param( "max_gram", "5" );
}
}
然后在您的persistence.xml
中定义以下属性(请注意,这些属性与我的Lucene示例不同):
<property name="hibernate.search.elasticsearch.analysis_definition_provider">com.acme.search.CustomAnalyzerProvider</property>
<property name="hibernate.search.analyzer">myAnalyzer</property>
我需要更多信息,the documentation might help。