Бэкэнд для автозаполнения при полнотекстовом поиске

Я хочу создать автозаполнение для полнотекстового поиска с помощью AJAX, PHP и MySQL.

Ищу правильный способ реализовать бэкэнд. Пока пользователь печатает, поле ввода должно предлагать ему подсказки. Предложения должны создаваться из текстовых записей в таблице.

Некоторая информация для этих записей: они хранятся в полнотекстовом формате, сгенерированы из PDF по 3-4 страницы каждая. На данный момент там не более 100 заявок, а в ближайшие несколько лет их количество достигнет 2000.

Если пользователь начинает печатать, слово, которое он набирает, должно быть завершено словом, которое хранится в БД, отсортированным по убыванию появления. Следующий шаг - предложить комбинации с другими словами, которые часто встречаются в записях, соответствующих первому слову. Конечно, вы можете сравнить это с автоподсказкой Google.

Я думаю о 3 различных способах реализации этого:

  1. Создайте индекс с помощью cronjob, ведьма подсчитывает вхождения слов и комбинаций за ночь. Пользователь ищет по этому индексу.

  2. Я выполняю поиск в записях в реальном времени с помощью функции «LIKE"% search% "». Затем я ищу слово после этого и группирую их по вхождению.

  3. Я создаю файл журнала для всех пользовательских поисков и ищу хорошие комбинации, как в 1), поэтому поиск становится более интеллектуальным с каждым поисковым действием.

Как лучше всего начать с этого? Поиск должен быть быстрым и эффективным. Есть ли лучшая возможность, о которой я не думал?


person xerxes    schedule 16.11.2011    source источник


Ответы (2)


Я бы использовал mysql MATCH () AGAINST () (http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html), например:

SELECT *
FROM table
WHERE MATCH(column) AGAINST('search')
ORDER BY MATCH(column) AGAINST('search')

Еще одно преимущество заключается в том, что вы можете дополнительно настроить важность искомых слов (при необходимости), например:

MATCH(column) AGAINST('>important <lessimportant') IN BOOLEAN MODE

Или скажите, что некоторые слова из поискового запроса должны быть обязательными, в то время как другие могут отсутствовать в результате, например:

MATCH(column) AGAINST('+required -prohibited') IN BOOLEAN MODE
person matthiasmullie    schedule 16.11.2011
comment
Хорошее решение для полнотекстового поиска, но с этим решением я возвращаю всю запись. Я хочу закончить отдельные слова для автозаполнения. Как мне найти подходящие слова из одних и тех же статей? - person xerxes; 16.11.2011

Думаю, идея №1 самая лучшая. Кстати, не забудьте убрать стоп-слова из автозаполнения (an, the, by, ...).

person user1037285    schedule 16.11.2011