12 December 2007

Эффективный поиск по сайту. Постановка проблем — поиск решений.

Lumber room
Это перепечатка статьи Ивана Никитина, которая в сентябре была опубликованна на нашем сайте Nomagic.ru. Данная статья содержит только постановку задачи и обсуждению возможных решений. Ссылки на статьи с описанием решения поставленной задачи c помощью LiveSearch API на ASP и PHP можно найти в конце статьи.



У любого современного сайта, на котором присутствуют более 5 – 10 страниц с контентом, должна быть поисковая система. Как бы хорошо мы не планировали навигационную панель, или каталог товаров/разделов сайта, все равно любые наши попытки интуитивно-понятной систематизации, в конечном итоге, будут непонятны 101-му пользователю сайта.

Хотите убедиться что это так? Вот несколько простых задач, попробуйте потратить на их решение несколько минут (все примеры взяты абсолютно случайно из списка лично мне знакомых и посещаемых мною сайтов. Эти примеры ни в коем случае не призваны приуменьшить качество этих ресурсов):
  1. Найдите на сайте http://www.specialist.ru/ (не пользуясь поиском!) 2 (два) курса по Microsoft SharePoint 2007. Запишите, сколько времени вы на это потратили.
  2. Найдите на сайте http://www.sipnet.ru подтверждение того, что шлюз VoIP D-Link DVG-2001S работает с сервисом Sipnet, а также его краткое описание. Запишите, сколько времени вы на это потратили.
  3. На сайте www.megafon.ru найдите годовой отчет по итогам работы за 2006 год в формате Microsoft Word (не пользуясь поиском). Вам это удалось?

Следует ли продолжать? Думаю, вы уже согласны со мной. И точно также рассуждают разработчики сайтов, когда перед ними встает проблема создание поисковой системы. К сожалению, большинство разработчиков недооценивают сложность этого решения и полагают, что поиск можно свести (упрощенно) к SQL запросу:
SELECT * FROM products WHERE
title LIKE ‘%что-то%’
OR description LIKE ‘%что-то%’


Так-то оно может быть и так, только вот ценность такого поиска будет нулевая. Можно, конечно же, усложнить, добавить поиск по словам и их сочетаниям (меня так умиляет фраза, которую иногда встречаешь на сайтах: «Вы можете использовать AND, OR, NOT». Ага! Вы еще пользователю булеву алгебру объясните). Но проблема такого поиска заключается в том, что разработчик полагает, что пользователь будет вводить названия продуктов или заголовки новостей точно так же, как они указаны на сайте, а пользователь вводит просто то, что ему сейчас нужно, совершенно в произвольной форме, и к тому же, он, пользователь, как правило, вводит короткие запросы, состоящие из одного-двух слов. То есть пользователь ищет курсы по SharePoint 2007, он так и напишет «SharePoint 2007», а не «Windows SharePoint Services v3». И в результате мы получаем абсолютно неработающую поисковую систему, потому что подобный поиск или вывалит сотни ссылок в качестве результата, и найти что-то в результате поиска будет невозможным, или не выдаст ничего. Хотите убедиться? Возьмем два мощных ресурса с большими бюджетами на разработку и попробуем протестировать поиск на них:
  1. На сайте www.mts.ru найдите с помощью поиска кредитную форму оплаты разговоров, то есть как это оформить и как за разговоры платить… Какой запрос вы введете? «кредитная форма оплаты». Результат будет примерно таким:
    Результаты поиска по сайту "МТС" - запроса "кредитная форма оплаты"
  2. На сайте www.alfabank.ru найдите информацию об ипотечном кредитовании. Какой запрос вы введете? «Ипотека». Вот результат:
    Результаты поиска по сайту "Альфа-банк" - запроса "Ипотека"

Легко заменить, что оба раза вы получили негативный результат. В первом случае вы не получили ничего, во втором – совершенно ненужную информацию (как вам понравилась ссылка на баннер про ипотеку?). Заметьте, оба раза неудачный поиск может заставить уйти клиента навсегда: я не стану переходить на MCT, так как там нет кредитной формы оплаты разговоров (на самом деле – есть!), и я не стану обращаться в Альфа-банк, так как не смог найти условий ипотечного кредитования (еще раз – это только примеры! Ничего личного!).
Как решить эту задачу?

Реализация эффективного поиска


Во-первых, необходимо осознать, что хороший поиск – это далеко нетривиальная задача. Более того, можно сказать и так: сложность реализации хорошего поиска намного превосходит сложность реализации функционала всего сайта. Поэтому нужно сто раз подумать, прежде чем ставить перед собой такую задачу. Вы готовы взяться написать систему морфологического анализа, оценки релевантности документов, алгоритм ранжирования результатов? И самое главное, сколько человеко-часов и тысяч строк кода вы готовы положить на это?
Но мы, тем не менее, можем решить эту задачу! У нас есть, как минимум, три способа ее решения:
  1. Использование форм поисковых систем
  2. Использование доступных Веб-служб
  3. Использование сторонних решений

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

Использование форм поисковых систем



Это самый дешевый и легко реализуемый способ. Вместо того чтобы писать свой сырой и некачественный код поиска, вы просто встраиваете форму на страницы своего сайта, которая передает запрос поисковой системе. В качестве такой системы мы покажем использование Google, хотя можно использовать любую другую, например, вот формы Яндекса: http://company.yandex.ru/forms/. Но мне больше нравится Google, так как, на мой взгляд, качество поиска у него намного выше, чем у других поисковиков.
Итак, рисуем примерно такую форму:
<form method="get" action="http://www.google.com/search">
<input type="hidden" name="ie"
value="windows-1251" />
<input type="hidden" name="domains"
value="www.specialist.ru" />
<input type="hidden" name="sitesearch"
value="www.specialist.ru" />
<input id="searchBarInput" type="text" name="q"
value="" />
<input id="searchBarSubmit" type="submit"
value="Искать!" />
<div>
<a id="extendedSearchLink" href="http://google.com/">
<span>Powered by <span style="color:blue">G</span>
<span style="color:red">o</span>
<span style="color:olive">o</span>
<span style="color:blue">g</span>
<span style="color:green">l</span>
<span style="color:red">e</span></span></a>
</div>
</form>

Обратите внимание, указание на то, что поиск предоставлен поисковой системой Google обязательно! Вот и все! За счет скрытых полей мы просим Google искать только на указанном сайте. Причем качество поиска будет заведомо выше, чем в приведенных примерах. Давайте убедимся:
Результаты поиска Google по сайту МТС
Первая же ссылка указывает на оформление кредитной формы оплаты на сайте МТС.
Пример с Альфа-банком:
Результаты поиска Google по сайту Альфа-банка
Первый же результат – вся информация об ипотеке Альфа-банка!
Конечно же, при всей простоте этого способа, сразу же в глаза бросается и его недостаток: пользователь переходит с вашего сайта на поисковую систему. Вообще-то, само по себе это не так страшно, ведь все ссылки с поисковика обратно ведут к вам и только к вам, но вот контекстная реклама. Не думаю, что Альфа-банк согласится с подобным предложением использовать похожую схему. :-)
Тем не менее, этот способ можно настоятельно рекомендовать малобюджетным или некоммерческим сайтам, так как качество поиска намного перевешивает негативные стороны в виде контекстной рекламы.

Использование доступных Веб-служб


В этом способе мы попробуем отказаться от вывода чужих рекламных объявлений в результатах поиска. Многие поисковые системы предоставляют сервисы для осуществления автоматического поиска. Это и Яндекс.XML (http://xml.yandex.ru/), и службы Google и другие. Общий смысл заключается в том, что мы предоставляем свою форму поиска, которая передает запрос пользователя на наш сервер, который в свою очередь передает его поисковой системе. Получив результаты, наш сервер выводит их в любом дизайне, в любом виде на наш сайт. Пользователь даже не догадывается, что поиск осуществлялся какой-то внешней системой, так как он видит результаты в дизайне нашего сайта. Правда, у Яндекс.XML какая-то совершенно непонятная лицензионная система (требование параллельно выводить объявления Директа), а Google тихой сапой прикрыл подобный сервис примерно год назад, и сейчас предоставляет такой поиск только в совокупности с объявлениями AdSense, опять же, с контекстной рекламой.

Но и здесь можно найти выход. У Microsoft есть API для работы с поиском Live.com (http://dev.live.com/livesearch/), который (API – это «он»), позволяет реализовать подобную систему. Правда и этот API ограничивает количество запросов в день примерно на 1000 – 3000 запросов, но для средних сайтов этого хватает.

Реализовать такой поиск совершенно несложно, тем более Live Search API предусматривает SOAP вызовы XML Веб-сервиса, а это значит, что эти вызовы можно осуществить из любой платформы, и из любого средства разработки сайтов: PHP, ASP.Net и т.п.

Некоторое время назад мы сделали реализацию такого поиска, когда возникла необходимость создания поиска для сайта Specialit.ru. Увидеть ее в действии можно по адресу: http://search.specialist.ru

Если Вам покажется интересной эта тематика, оставьте, пожалуйста, свои отзывы и пожелания в комментариях к публикации, и в своей следующей статье я приведу подробный пример код реализации поисковой системы на базе Live Search API. Поверьте, там все намного проще, чем кажется на первый взгляд. :-)

Использование сторонних решений


Однако, у способа, использующего доступные Веб-службы, например Live Search API, есть два ощутимых недостатка:
  1. Невозможность оперативно управлять переиндексацией ресурса
  2. Невозможность индексации (и как следствие поиска) в закрытых разделах сайта

Первый недостаток обусловлен тем, что роботы поисковых систем сами устанавливают расписание обновления вашего сайта в индексе, и если, например, ваш сайт не отдает корректный заголовок ответа HTTP Last-Modified (а это болезнь 90% сайтов в Интернете!), то это время может быть значительным. То есть после появления новых материалов на вашем сайте могут пройти дни, а то и недели, прежде чем они появятся в результатах поиска.
Второй недостаток вообще фатален. Робот поисковика никак не сможет получить доступ в закрытые разделы вашего сайта (например, в закрытый форум, где требуется авторизация), и поэтому информация из закрытых разделов никогда не появится в результатах поиска. Можно, конечно же, извернуться и сделать обезличенную публикацию информации из закрытых разделов (например, выводить сообщения закрытого форму без информации о пользователях), но это пройдет далеко не всегда. Например, как быть с поиском в вашей корпоративной почте?
Здесь нам могут помочь сторонние поисковые системы, например, Яндекс.Сервер (http://company.yandex.ru/technology/products/yandex-server.xml) или корпоративный Microsoft Office SharePoint Server (http://office.microsoft.com/ru-ru/sharepointserver/FX100492001049.aspx). Второй мне известен куда лучше, чем сервер от Яндекса, и он обладает достаточно мощной поисковой системой, которую можно использовать, в том числе, и для поиска по вашему сайту.
Возможно, в одной из следующих статей мы также рассмотрим интеграцию Microsoft Office SharePoint Server 2007 с вашим сайтом для построения эффективной поисковой системы.

Ссылки по теме


- Статья про реализацию поиска по сайту с помощью LiveSearch API на ASP.NET
- Статья про реализацию поиска по сайту с помощью LiveSearch API на PHP5
Tags:поиск по сайтупоискLiveSearchwebразработкаphpaspтехно
Hubs: Lumber room
+11
1.3k 14
Comments 15
Popular right now