Hibernate эластичная поисковая транслитерация (ICU-трансформация) - PullRequest
0 голосов
/ 30 августа 2018

Я использую hibernate-search и hibernate-search -asticsearch версии 5.10.3.Final. Я хочу применить преобразование ICU на некоторых полях. Вот фильтр в документации на поиск:

https://www.elastic.co/guide/en/elasticsearch/plugins/5.6/analysis-icu-transform.html

Но я не могу найти TokenFilterFactory в версии lucene, которую используют зависимости поиска hibernate. А в TokenFilterDef свойство фабрики обязательно. Кто-нибудь знает, как добиться транслитерации с помощью hibernate-search?

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете использовать аннотации и полагаться на org.hibernate.search.elasticsearch.analyzer.ElasticsearchTokenFilterFactory для создания определения фильтра токенов JSON:

@AnalyzerDef(
    name = "myAnalyzer",
    tokenizer = ...,
    filter = @TokenFilterDef(
        name = "myLatinTransform",
        factory = ElasticsearchTokenFilterFactory.class,
        params = {
            @Parameter(name = "type", value = "'icu_transform'"),
            @Parameter(name = "id", value = "'Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC'")
        }
    )
)

Будьте осторожны: значения параметров интерпретируются как JSON, поэтому строковые значения должны быть заключены в кавычки. Однако для удобства допускаются одинарные кавычки.

См. https://docs.jboss.org/hibernate/search/5.10/reference/en-US/html_single/#_custom_analyzers_using_the_code_analyzerdef_code_annotation

Или вы можете определить анализатор программно и воспользоваться более естественным API:

# In hibernate.properties
hibernate.search.elasticsearch.analysis_definition_provider com.acme.CustomAnalyzerProvider

public class CustomAnalyzerProvider implements ElasticsearchAnalysisDefinitionProvider {
    @Override
    public void register(ElasticsearchAnalysisDefinitionRegistryBuilder builder) {
        builder.analyzer( "myAnalyzer" )
                .withTokenizer( "whitespace" )
                .withTokenFilter( "myLatinTransform" );

        builder.tokenFilter( "myLatinTransform" )
                .type( "icu_transform" )
                .param( "id", "Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC" );
    }
}

См. https://docs.jboss.org/hibernate/search/5.10/reference/en-US/html_single/#_custom_analyzers_using_a_definition_provider

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...