Hibernate Search ,更改默认分析器

Chr*_*lli 0 full-text-search hibernate-search

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

<property name="hibernate.search.analyzer">Class of Analyzer </property>
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何创建分析器的类以在属性中传递它?特别是我想使用“EdgeNGram”,我试图通过 EngedNgram 的 tokenizer 工厂,但它不起作用。

<property name="hibernate.search.analyzer">EdgeNGramTokenizerFactory.class</property>
Run Code Online (Sandbox Code Playgroud)

您能否向我展示我可以在该属性中通过的课程的示例?谢谢

yro*_*ere 5

编辑:Hibernate Search 6+ 用户,以下内容大多与您无关。请阅读文档的这一部分

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

编辑:在 Hibernate Search 6 中,此建议(默认情况下使用关键字分析器)变得不太相关,因为关键字字段全文字段明确分开。尽管如此,这对于 Hibernate Search 5 来说还是一个很好的建议。

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

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

您可以做的是使用通过注释分析定义提供程序定义命名分析器的名称。这些定义使用“现成的”分析组件并将它们组装成成熟的分析器,这更容易做到。@AnalyzerDef

因此,例如,您可以定义此类,它不是分析器类,而是提供分析器定义的类:

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的 中定义以下属性persistence.xml

<property name="hibernate.search.lucene.analysis_definition_provider">com.acme.search.CustomAnalyzerProvider</property>
<property name="hibernate.search.analyzer">myAnalyzer</property>
Run Code Online (Sandbox Code Playgroud)

你应该可以走了。

编辑:如果您使用 Elasticsearch 集成,那么 1) 使用自定义 Lucene 分析器类将永远无法工作,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" );
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的文件中定义以下属性persistence.xml请注意,这些属性与我使用 Lucene 的示例不同):

<property name="hibernate.search.elasticsearch.analysis_definition_provider">com.acme.search.CustomAnalyzerProvider</property>
<property name="hibernate.search.analyzer">myAnalyzer</property>
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,文档可能会有所帮助