休眠搜索,更改默认的分析器

时间:2018-10-29 13:56:47

标签: full-text-search hibernate-search

我想使用默认的自定义分析器。在Hibernate搜索的文档中进行在线搜索时,我发现可以在Hibernate配置中对其进行更改。特别是具有“ hibernate.search.analyzer”属性。然后我做了这个属性

<property name="hibernate.search.analyzer">Class of Analyzer </property>

我的问题是:如何创建分析器的类以在属性处传递它? 在特殊情况下,我想使用“ EdgeNGram”,我试图通过EngedNgram的令牌生成器工厂,但是它不起作用。

<property name="hibernate.search.analyzer">EdgeNGramTokenizerFactory.class</property>

您能告诉我一个可以通过此属性传递的类的示例吗?谢谢

1 个答案:

答案 0 :(得分:3)

首先,让我警告您,默认分析器通常应为通用分析器,虽然它可能不大,但对于大多数领域来说已经足够了。随着新需求添加到您的应用程序中,您几乎不可能在任何地方都使用相同的分析器,并且最终将不得不至少在某些索引字段中使用特定的分析器。这就是为什么我个人更喜欢使用org.apache.lucene.analysis.core.KeywordAnalyzer作为默认值,并在需要的地方指定一个分析器。

现在,已经警告您:将EdgeNGramTokenizerFactory用作默认分析器可能不是一个好主意。如果您仍然想这样做,请继续阅读...

默认分析器不必是类。它可以是一个类的完全限定名称,但是在这里您需要一个自定义分析器,并且编写自己的分析器类可能很复杂,因此,如果您不习惯Lucene,就不推荐这样做。

相反,您可以使用使用named analyzeran @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