Как запросить lucene с “подобным” оператором? [дубликат]

16
задан Freewind 22 July 2010 в 10:33
поделиться

4 ответа

Lucene предоставляет ReverseStringFilter , который позволяет выполнять поиск по подстановочным знакам впереди, например * user. Он работает путем индексации всех терминов в обратном порядке.

Но я думаю, что нет способа сделать что-то похожее на «LIKE% user%».

11
ответ дан 30 November 2019 в 16:57
поделиться

Проблема с запросами LIKE в том, что они дороги с точки зрения времени, затрачиваемого на выполнение. Вы можете настроить QueryParser, чтобы разрешить использование подстановочных знаков в начале:

QueryParser.setAllowLeadingWildcard (true)

И это позволит вам выполнять такие поисковые запросы, как:

* user *

Но это займет много времени время выполнять. Иногда, когда люди говорят, что им нужен запрос LIKE, на самом деле им нужен нечеткий запрос . Это позволит вам выполнить следующий поиск:

user ~

Что будет соответствовать терминам users и fuser . Вы можете указать расстояние редактирования между термином в вашем запросе и терминами, которые вы хотите сопоставить, используя значение с плавающей запятой от 0 до 1. Например, пользователь ~ 0,8 будет соответствовать большему количеству терминов, чем пользователь ~ 0,5 .

Я предлагаю вам также взглянуть на запрос регулярных выражений , который поддерживает синтаксис регулярных выражений для поиска в Lucene. Это может быть ближе к тому, что вам действительно нужно. Возможно что-то вроде:

. * User. *

14
ответ дан 30 November 2019 в 16:57
поделиться

Начиная с Lucene 2.1 вы можете использовать

QueryParser.setAllowLeadingWildcard(true);

, но это может снизить производительность. В LuceneFAQ есть дополнительная информация по этому поводу.

6
ответ дан 30 November 2019 в 16:57
поделиться

Если подумать, то неудивительно, что поддержка подстановочных знаков в lucene (обычно) ограничена подстановочным знаком в конце шаблона слова.

Системы поиска ключевых слов работают путем создания обратного индекса всех слов в корпусе, который сортируется в порядке слов. Когда вы выполняете обычный поиск без подстановочных знаков, система использует тот факт, что записи индекса отсортированы, чтобы найти запись или записи для вашего слова за O(logN) шагов, где N - количество слов или записей. Для шаблона слова с суффиксным подстановочным знаком происходит то же самое, что и для поиска первого совпадающего слова, а остальные совпадения находятся путем сканирования записей до тех пор, пока фиксированная часть шаблона не перестанет совпадать.

Однако для шаблона слова с префиксом и суффиксом подстановочного знака, механизм должен просмотреть все записи в индексе. Это было бы O(N) ... если бы движок не создал целый стек вторичных индексов для поиска буквальных подстрок слов. (А это сделает индексирование намного дороже). А для более сложных шаблонов (например, регексов) проблема будет еще хуже для поисковой системы.

4
ответ дан 30 November 2019 в 16:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: