Hibernate Search - подстановочный знак и пробел - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Hibernate Search с несколькими словами / полями, и он работает, как и ожидалось, пока я не включу подстановочные знаки. Это мой Entity Analyzer:

@AnalyzerDef(name = "autocompleteAnalyzer",
        tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
        filters = {
                // remove accents
                @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
                // lower case
                @TokenFilterDef(factory = LowerCaseFilterFactory.class),
                // Start with same root
                @TokenFilterDef(
                        factory = SnowballPorterFilterFactory.class,
                        params = { @Parameter(name = "language", value = "English") })
        })

И это мой запрос:

    if(criteria.length() > 0) {
        fullTextQuery = queryBuilder
                .keyword()
                // .wildcard() => not in use 
                .onFields("firstName", "lastName", "extraName", "biography")
                .matching(criteria)
                .createQuery();

Сценарий 01
Если я ищу что-то вроде «Джон Смит», я получаю следующий запрос:

+((firstName:john firstName:smith) 
(lastName:john lastName:smith) 
(extraName:john extraName:smith) 
(biography:john biography:smith))

Который находит кого-нибудь по имени Джон или Смит.

Сценарий 02 Если я ищу "John *", потому что я хочу найти кого-либо, чье имя начинается с John (Johnny, Johson), мне нужно включить символы подстановки следующим образом:

fullTextQuery = queryBuilder
   .keyword()
   .wildcard()

Что работает, когда я набираю "John *", возвращая следующий запрос:

+(firstName:john* lastName:john* extraName:john* biography:john*)

Но это больше не работает, когда я набираю что-то вроде «Джон * Смит», потому что не разделяет слова, что, я считаю, связано с опцией подстановочного знака:

+(firstName:john* smith lastName:john* smith extraName:john* smith biography:john* smith)

1 Ответ

1 голос
/ 25 апреля 2019

Запросы по ключевым словам всегда будут соответствовать документам, которые содержат любое из предоставленных ключевых слов. Запросы с подстановочными знаками не применяют анализ. Так что ни один не подходит в вашем случае.

Используйте запрос simpleQueryString и установите для оператора по умолчанию значение «и»:

        fullTextQuery = queryBuilder
                .simpleQueryString()
                .onFields("firstName", "lastName", "extraName", "biography")
                .withAndAsDefaultOperator()
                .matching(criteria)
                .createQuery();

Документация: https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#_simple_query_string_queries

...