Бэкенд для автозаполнения для полнотекстового поиска - PullRequest
0 голосов
/ 16 ноября 2011

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 16 ноября 2011

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

0 голосов
/ 16 ноября 2011

Я бы использовал mysql MATCH () ПРОТИВ () (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
...