Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > алгоритм поиска по БД


Автор: AlexxO 8.8.2005, 23:57
Думаю вот сделать нормальный поисковик для сайта, который бы искал не просто по совпадению запроса, а исчо и отдельные слова учитывал (если в запросе более одного слова). Вот как я представляю всю поисковую систему:

Имеется индексатор, который обрабатывает все страницы сайта, убирает при помощи stripslashes все тэги, заменяет где нужно лишние пробелы, табуляцию и т. д. вобщем всё неконтентное убирается... Затем из всего этого выделяются отдельные слова с параметром, обозначающим текущее положение слова в документе (порядковый номер слова или байт с которого начинается первый его символ), это слово складывается в таблицу примерно с такой структурой:

Цитата

id -- id он и в африке id =)
url -- страница (страницы) где оно было найдено
word -- слово
position -- позиция слова


При поиске по двум и более словам мы простым запросом выбираем ряд с каждым словом по отдельности и смотрим на значения параметра position, чем меньше он отличаетя, тем выше выводим этот результат поиска и т. д. Конечно структура таблицы не годится ввиду того что одно слово может быть на нескольких страницах (да и встречаться несколько раз на одной странице) и было бы грамотно ещо одну таблицу завести в которой хранить урлы, но это не столь важно, главное сама идея... =)
Выскажите плиз свою точку зрения по такому алгоритму поиска -- ИМХО скорость и эфективность его работы достаточно высока... Что думаете об этом?

Автор: Song 9.8.2005, 09:02
Надо две таблицы:

Таблица 1:

word_id
word

Таблица 2:
url
word_id
position

Автор: Master 17.8.2005, 10:03
stripslashes убирает экранирование символов, а теги убирает strip_tags

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

Автор: Akina 17.8.2005, 12:54
Имхо просто делаем полнотекстовый индекс и не изобретаем велосипед

Автор: Song 19.8.2005, 09:22
Akina
ты не прав.
Полнотекстовый индекс имеет много ограничений.
Ну хотя бы невозможность поиска по части слова.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)