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