У меня есть анализатор с этой конфигурацией,
searchMapping//
.analyzerDef(BaseEntity.CUSTOM_SEARCH_INDEX_ANALYZER, WhitespaceTokenizerFactory.class)//
.filter(LowerCaseFilterFactory.class)//
.filter(ASCIIFoldingFilterFactory.class)//
.filter(NGramFilterFactory.class).param("minGramSize", "1").param("maxGramSize", "200");
Так настроено поле моего объекта
@Field(analyzer = @Analyzer(definition = CUSTOM_SEARCH_INDEX_ANALYZER))
private String bookName;
Так я создаю поисковый запрос
queryBuilder.keyword().onField(prefixedPath).matching(matchingString).createQuery()
У меня есть сущность со значением bookName = "Gulliver", а другая сущность с bookName = "xGulliver";
Если я попытаюсь выполнить поиск по данным bookName = xG
, тогда получаю обе сущности там, где я ожидаю сущность только с bookName="xGulliver"
; Также посмотрел на запрос, который создается hibernate-search.
Выполнение запроса Lucene '+ (+ (+ (+ (bookName: x bookName: xg bookName: g))))
Выше Lucene запрос подготовлен с использованием BooleanJunction::must
условий Lucene. Я думаю, это означает, что он должен соответствовать всем условиям. Тем не менее, почему это дает мне оба объекта данных. Я не понимаю здесь.
Я также могу переопределить анализатор при запросе, используя KeywordTokenizer вместо NGramFilterFactory, но это похоже на то, что мне нужно переопределить каждое поле перед созданием QueryBuilder, что не выглядит хорошо, потому что тогда мне нужно переопределить все индексные поля, в которых у меня около 100 полей, а некоторые из них являются динамическими c полями, и я создаю индивидуальный запрос для каждого поля.
Есть ли другой способ переопределить анализатор в версии 5.11 или он обрабатывается в каким-то другим способом проще использовать версию hibernate-search 6.x?
Используемые мной версии Hibernate:
hibernate-search -asticsearch, hibernate-search-orm = 5.11 .4.Final