Hibernate Search, изменяет анализатор по умолчанию - PullRequest
0 голосов
/ 29 октября 2018

Я хочу использовать собственный анализатор, например, по умолчанию. Выполняя поиск в документации по поиску в 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 голосов
/ 29 октября 2018

Во-первых, позвольте мне предупредить вас, что анализатор по умолчанию, как правило, должен быть универсальным, который может быть не очень хорошим, но достаточно хорошим для большинства областей. Поскольку к вашему приложению добавляются новые требования, вы вряд ли сможете везде использовать один и тот же анализатор, и в конечном итоге вам придется использовать специальные анализаторы, по крайней мере, в некоторых из ваших полей индекса. Вот почему я лично предпочитаю использовать org.apache.lucene.analysis.core.KeywordAnalyzer по умолчанию и указывать анализатор там, где он мне нужен.

Теперь вас предупредили: использование 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 );
    }
}

Затем определите следующие свойства в вашем 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>

Если вам нужна дополнительная информация, документация может помочь .

...