S2 → Блог → 2010 → 02 → 11

Поиск

11 февраля 2010 года, 16:11

Трудно спорить с тем, что поиск на сайтах — вещь нужная и полезная. Однако сейчас в S2 поиска нет. Я собираюсь рассказать, почему.

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

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

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

Из самых общих соображений поиск можно сделать следующими способами:

  1. LIKE или strpos.
  2. Fulltext-индексы базы данных.
  3. Создание собственных поисковых индексов.
  4. Сторонние поисковые движки.
  5. Сторонние сервисы.

Первым способом практически невозможно учитывать выделенные нами четыре составляющих релевантности. Второй способ хорош, но, к сожалению, только для английского языка. Fulltext-индексы в MySQL не учитывают русскую морфологию.

Третьим способом, при помощи своего индекса, можно сделать практически всё, что угодно. Но этот способ наиболее сложен. Здесь недостаточно просто запрограммировать функциональность. Нужно продумать и учесть масштабируемость решения как по количеству страниц, так и по посещаемости. В общем, этот случай — один из тех, когда 20% функциональности требуют 80% затрат времени :)

Здесь легко встать на путь изобретения велосипедов. Ведь уже есть поисковые движки, бесплатные и не очень, которые умеют быстро индексировать поля баз данных и быстро искать по ним (четвертый способ). К сожалению, во многих случаях на серверы хостинга нельзя устанавливать дополнительное программное обеспечение. Да и делать на S2 сайты, которым требуются подобные поисковые движки, скорее всего никто не будет.

К счастью, есть еще один способ, в котором минимальные затраты приносят ощутимый результат. На сайте достаточно расположить форму поиска Гугла, примерно так, как это сделано в документации Apache. Действительно, как бы мы ни старались, вряд ли у нас получится поиск лучше, чем у Яндекса или Гугла. Обычно я пользуюсь Гуглом, когда ищу что-либо на конкретных сайтах, даже если на них есть собственный поиск.

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

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

Добавлено: Я всё-таки разработал расширение поиска.

Ключевые слова: функциональность

Комментарии

#1. 11 февраля 2010 года, 18:22. пишет:
А я не согласен, поэтому в моём движке стоит простейший LIKE. Про морфологию я читал и стеммер есть, то руки ещё не дошли. Дело не в том что-бы «даже» отсортировать по релевантности. Надо «хотя-бы» найти точное совпадение. Пользователь не такой уж и дурак — может ввести и часть слова если надо что-то найти. А ты стремишься как в apple если что и делать то сразу идеально.
#2. 11 февраля 2010 года, 18:40. пишет:
Умный пользователь, скорее, наберет в Гугле свой запрос и «site:abcd.ru» :)

Я не то, чтобы стремлюсь к идеальности. Я, скорее, хочу быть до конца честным. А правда состоит в том, что как бы я ни старался сделать поиск, всё равно лучше Яндекса и Гугла не получится. А смысл тогда вообще что-нибудь делать, если можно разместить на сайте форму поиска Гугла?
#3. 12 февраля 2010 года, 17:21. пишет:
Найти то может и найдёт, но он не покажет так как ты мог бы показать. И это могут быть скрытые вещи. Например у меня на сайте встраиваемые видео имеют заголовок, по которому их можно в поиске найти. Но на публичной части они нигде не показываются.

Так что своё оно всегда лучше.
#4. 24 марта 2010 года, 17:01. zzz пишет:
Скажите, пожалуйста, какой максимальный размер поста поддерживает Ваша CMS? Т.е. например, в вордпрессе мне удается запихать в один пост/страницу ~450 Кб текста максимум, а в идеале надо, чтобы туда влезало мегабайт-два.
#5. 24 марта 2010 года, 17:47. пишет:
Что-то я не задумывался над вопросом хранения больших текстов :)

В текущей версии максимальная длина зависит от базы данных. Если используется MySQL, то тексты хранятся в полях типа TEXT, вмещающих 64 килобайта. Но это легко изменить. Когда движок уже установлен, можно поменять тип TEXT на LONGTEXT (ограничение в несколько гигабайт) в программе администрирования базы данных.

В следующих версиях я заменю TEXT на LONGTEXT в установочном скрипте. Если нужно, могу сейчас исправить и выложить текущую разрабатываемую версию для скачивания.
#6. 25 марта 2010 года, 11:49. zzz пишет:
Выложите, если это не очень сложно.

Большие тексты мне, например, нужны для публикации книг. В вордпрессе приходится их разбивать на куски по 450Кб.
#7. 25 марта 2010 года, 12:01. пишет:
#8. 25 марта 2010 года, 16:34. zz пишет:
Спасибо, попробую!
#9. 20 апреля 2010 года, 21:42. Иван Do пишет:
Попробовал поставить. Нравится!
Не совсем все интуитивно, но очень приятно.

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

Удачи в разработке!
#10. 1 декабря 2010 года, 03:47. Тормоз пишет:
Поиск действительно — очень непростая задача. Особенно если речь идёт о CMS на PHP и в контексте поиска русских текстов. Без костылей он получится регистрозависимым, что совсем никуда не годится. Эх.

В тему, я по любому сайту ищу через Google простым вводом в адресной строке gc [искомая фраза]. Это очень удобно. Как такое сделать написал один из моих читателей, спасибо ему — http://brokenbrake.biz/2009/09/06/fast_search#c005869