Помогите с написанием поискового скрипта

Shadow

Guest
Помогите с написанием поискового скрипта

Господа, помогите с созданием поискового скрипта. Постараюсь поточнее изложить проблему.

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

Готовые скрипты мне не нужны, а нужна идея решения сложившейся задачи.

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

Раньше скрипт работал так: из БД извлекались все записи подходящие под запрос, дальше подсчитывалась релевантность каждой записи. Я воспользовался очень простым механизмом - подсчитывалось количество вхождений слов запроса в текст документа. В соответствии с этим признаком документы сортировались по убыванию релевантности и выводились все результаты поиска на одну страницу. Все это делалось средствами php.

Теперь я хочу сделать, чтобы выводилось, скажем, 20 записей на страницу. Казалось бы, вставляем в запрос LIMIT - и дело в шляпе, но вот как сделать чтобы записи, извлекаемые из MySQL, сортировались в порядке убыли релевантности? Я излазил весь мануал по MySQL, но функции, аналогичной str_count() из php, не нашел. Попробовал воспользоваться системой определения релевантности при полнотекстовом поиске: MATCH(`text`) AGAINST('test'), но меня это не устраивает, потому что, например, MATCH(`text`) AGAINST('php') всегда равно 0, т. к. слово php слишком короткое, а на сайте у меня целый раздел по php и, естественно, записи из него должны занять первые места.

Подытожим все вышесказанное. Мне нужно сделать так, что бы релевантность записей определялась средствами MySQL при их выборки из БД. Как это сделать? Или может кто-то предложит какой-либо другой алгоритм поиска. Повторюсь, готовых скриптов мне не нужно, нужна только идея.
 

Demiurg

Guest
почему бы не воспользоваться готовыми решениями ?
 

Shadow

Guest
Можно, конечно, поискать готовые скрипты... Но я предпочитаю все-таки делать что-то свое. Меньше трудностей с настройкой и пр.

Ну а потом, в общем-то, просто даже интересно решение данной задачи.
 

Demiurg

Guest
то есть ты предпочитаешь потратить пол года на написание свего недельной настройке чужого?
Твою же задачу понять тяжело, если я правильно понял, ты осуществляешь в реальном времени, так ?
 

Shadow

Guest
Ну почему же полгода... У меня загвоздка только в этом вопросе. С реализацией остального проблем нет.

А задача такая (в двух словах): определить релевантность записи средствами MySQL. Если это возможно, конечно.

Если нет - придется, наверное, "ковыряться" в чужих скриптах.
 

lucas

Guest
полнотекстовый поиск не очень хорошо работает с русскоязычными материалами
Поподробней, пожалуйста.

Я бы предложил хранить совместно со статьями в HTML (если от этого избавиться нельзя) их индекса -- текста статьи, обработанного stripslashes, из которого удалены слова меньше четырех символов, знаки препинания и оишние пробелы. И уже по нему проводить полнотекстовый поиск.
 

Shadow

Guest
Автор оригинала: lucas
Поподробней, пожалуйста.
Возможно я и не прав, в этом вопросе. Но насколько я знаю MATCH(`text`) AGAINST('поисковые системы'), напимер, будет искать слова 'поисковые' и 'системы' в поле `text`, но если в поле `text` будет 'поисковая', 'система' - совпадений нет. А при использовании регулярных выражений можно отделить приставки и окончания от слов поиска и решить эту проблему.
Вот.

А за предложенное решение - большое спасибо!
 

fisher

накатила суть
"ключевое слово" - словарный (реверсивный) индекс. бери многосерч. если хочешь делать сам - помогут его исходники или dataparksearch. по реализации - материалов мало, кое-что есть тут, что-то на икспойнте (поиск->"поиск на сайте"). или приходи на конференцию - расскажем. или подожди материалов.

а также
http://www.phpclub.ru/talk/showthread.php?s=&threadid=50397&highlight=%EF%EE%E8%F1%EA
http://www.phpclub.ru/talk/showthread.php?s=&threadid=40529&highlight=%EF%EE%E8%F1%EA
http://www.phpclub.ru/talk/showthread.php?s=&threadid=25676&highlight=%EF%EE%E8%F1%EA
 

zahhar

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

Shadow

Guest
Хех... как я понимаю без поллитры здесь не разберешься....

Я тут уже не первый день ищу статьи о алгоритмах поиска, с учетом релевантности и постраничным выводом, индексирования и пр. но пока сплошное НИЧЕГО.

Никто ссылочек не подкинет? Хотя бы на чистую теорию поиска в бд с учетом релевантности.
 
Сверху