S2Блог20100211

Поиск

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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