Почему это не работает, когда я использую фабрику пустого пространства в первой попытке? Я предполагаю, что использование фабрики по сравнению с использованием фактической реализации анализатора отличается?
Запросы с подстановочными знаками и префиксами (те, которые вы используете при добавлении суффикса *
в строку запроса), никогда не применяют анализ. Это означает, что ваш строчный фильтр не применяется к вашему поисковому запросу, но он был применен к вашему проиндексированному тексту, что означает, что он никогда не будет совпадать: AT&*
не соответствует индексированному at&t
.
Использование аннотации @Analyzer
работало только потому, что вы удалили нижний регистр во время индекса. С этим анализатором вы получили индекс AT&T
(в верхнем регистре), а AT&*
соответствует индексируемому AT&T
. Это просто случайно: если вы индексируете At&t
, вы в конечном итоге получите At&t
в индексе и у вас будет та же проблема.
Как сделать мой поиск нечувствительным к регистру, если я использую аннотацию @Analyzer, как во второй попытке?
Как я упоминал выше, аннотация @Analyzer
не является решением, вы фактически ухудшили свой поиск.
Не существует встроенного решения, позволяющего применять запросы с подстановочными знаками и префиксами к анализу, главным образом потому, что анализ может удалить символы шаблона, такие как ?
или *
, и это плохо закончится.
Вы можете восстановить исходный анализатор и выполнить запрос в нижнем регистре самостоятельно, но это только поможет вам: ascii fold и другие функции анализа не будут работать.
Решением, которое я обычно рекомендую, является использование фильтра ребер-нграмм. Идея состоит в том, чтобы индексировать каждый префикс каждого слова, чтобы «Учетная запись AT & T» была проиндексирована как термины a, at, at&, at&t, a, ac, acc, acco, accou, accoun, account
, а поиск по «at &» вернул бы правильные результаты даже без подстановочного знака.
См. этот ответ для более подробного объяснения.
Если вы используете интеграцию ELasticsearch, вам придется полагаться на хак, чтобы заставить анализатор «только для запросов» работать правильно. Смотрите здесь .