Я использую 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)