Lucene предоставляет ReverseStringFilter , который позволяет выполнять поиск по подстановочным знакам впереди, например * user. Он работает путем индексации всех терминов в обратном порядке.
Но я думаю, что нет способа сделать что-то похожее на «LIKE% user%».
Проблема с запросами LIKE в том, что они дороги с точки зрения времени, затрачиваемого на выполнение. Вы можете настроить QueryParser, чтобы разрешить использование подстановочных знаков в начале:
QueryParser.setAllowLeadingWildcard (true)
И это позволит вам выполнять такие поисковые запросы, как:
* user *
Но это займет много времени время выполнять. Иногда, когда люди говорят, что им нужен запрос LIKE, на самом деле им нужен нечеткий запрос . Это позволит вам выполнить следующий поиск:
user ~
Что будет соответствовать терминам users
и fuser
. Вы можете указать расстояние редактирования между термином в вашем запросе и терминами, которые вы хотите сопоставить, используя значение с плавающей запятой от 0 до 1. Например, пользователь ~ 0,8
будет соответствовать большему количеству терминов, чем пользователь ~ 0,5
.
Я предлагаю вам также взглянуть на запрос регулярных выражений , который поддерживает синтаксис регулярных выражений для поиска в Lucene. Это может быть ближе к тому, что вам действительно нужно. Возможно что-то вроде:
. * User. *
Начиная с Lucene 2.1 вы можете использовать
QueryParser.setAllowLeadingWildcard(true);
, но это может снизить производительность. В LuceneFAQ есть дополнительная информация по этому поводу.
Если подумать, то неудивительно, что поддержка подстановочных знаков в lucene (обычно) ограничена подстановочным знаком в конце шаблона слова.
Системы поиска ключевых слов работают путем создания обратного индекса всех слов в корпусе, который сортируется в порядке слов. Когда вы выполняете обычный поиск без подстановочных знаков, система использует тот факт, что записи индекса отсортированы, чтобы найти запись или записи для вашего слова за O(logN)
шагов, где N
- количество слов или записей. Для шаблона слова с суффиксным подстановочным знаком происходит то же самое, что и для поиска первого совпадающего слова, а остальные совпадения находятся путем сканирования записей до тех пор, пока фиксированная часть шаблона не перестанет совпадать.
Однако для шаблона слова с префиксом и суффиксом подстановочного знака, механизм должен просмотреть все записи в индексе. Это было бы O(N)
... если бы движок не создал целый стек вторичных индексов для поиска буквальных подстрок слов. (А это сделает индексирование намного дороже). А для более сложных шаблонов (например, регексов) проблема будет еще хуже для поисковой системы.