Pull to refresh

Полнотекстовый поиск по сайту — бич современного интернета

Reading time 4 min
Views 27K
Реализация хорошего поиска по сайту — часто сильно недооцененная по сложности задача. Поиск является слабым местом сайтов настолько часто, что когда я вижу строку поиска, у меня сразу же возникает предвзятое ощущение предстоящего фиаско. И чтобы лишний раз не расстраиваться, я сразу переадресую свой вопрос гуглу или яндексу и быстро нахожу то, что требовалось. Что же делать, чтобы как-то улучшить эту ситуацию?

Форма поиска по сайту от Яндекса и Гугла 


Лучше всего это поняли и сделали за нас создатели популярных поисковых систем. И мы можем воспользоваться результатами их трудов, просто установив форму поиска по сайту от Яндекса или Гугла.Это простой путь, но у него есть свои минусы:
  1. В поиске могут быть доступны не все страницы сайта. Поисковая система не гарантирует включения в поиск всех страниц сайта, а кроме того не все страницы могут быть доступны поисковому роботу.
  2. Большая задержка между появлением новых страниц на сайте и их доступностью в поиске.
  3. Нельзя задавать уточнения для поиска. Например, задать поиск только в одном подразделе сайта или по ценовому диапазону товара.
  4. Нельзя идеально встроить результаты поиска в дизайн сайта. Это перечеркивает все плюсы такого поиска для большинства солидных порталов.
Вот неполный перечень проблем, с которыми может столкнуться начинающий поисковод. Поэтому такое решение можно рекомендовать только сайтам, не особо беспокоящимся о своём коммерческом имидже.

Качество поиска 


Для начала нужно понять, из чего вообще складывается понятие качества поиска.  Качество поиска зависит от многих факторов. О многих из них можно прочитать в книге известного поискового оптимизатора кандидата технических наук Игоря Ашманова. (Скажу по секрету, что недавно видел её на torrents.ru). Все факторы условно можно разбить на три категории: полнота, точность и ранжирование. 

Полнота 


Полнота — это количество страниц, по которым выполняется поиск. Существует два подхода к индексированию данных для поиска: «изнутри» и «снаружи».
  1. «Изнутри» — это индексирование исходных данных сайта, обычно хранящихся в БД. Этот способ исключает попадание в результаты поиска «мусорных» страниц, но и связан с риском уменьшения полноты поиска.
  2. «Снаружи» — индексирование поисковым роботом. Этот подход в большинстве случаев гарантирует высокую полноту, но и порождает множество проблем, которые будут описаны в будущих статьях.
Если пользователь видит на сайте поисковую строку без сопроводительного текста, то он ожидает, что, введя запрос «контакты», он попадет на страницу контактов. А если это не так, то это ошибка вебмастера, потому что клиент всегда прав :)

Причина этого чаще всего в том, что на большинстве сайтов реализован поиск только по динамическим данным из-за того, что поисковая программа получает данные из базы данных. Более того, обычно вебмастер (или создатель CMS) решает, какие таблицы в БД самые важные, а какие недостойны внимания. В результате «за бортом» поиска остаются некоторые «малозначимые» динамические данные и все статические страницы.

С другой стороны, если поставить целью обеспечение максимальной полноты поиска, то в результатах может оказаться много «мусорных» и дублирующихся страниц, что тоже негативно сказывается на лояльность пользователей. 

Точность 


Точность поиска — это характеристика соответствия найденных страниц поисковому запросу. В неё входят учет морфологии, снятие омонимии, учет опечаток, поиск по синонимам и др. Например, если пользователь ищет «количество голов Аршавина», то ясно, что головы тут ни при чем, и нужно показывать только информацию про забитые голы. Вот еще один интересный пример омонимии. Но это высший пилотаж, а самое простое, что хочет увидеть пользователь — это поиск по всем возможным словоформам.

Для учета морфологии используются различные алгоритмы: стеммеры, морфологические словари и гибридные алгоритмы. Все они в той или иной степени  несовершенны. Например, слово «есть» может иметь формы «был», «будет», «ем». Простой стеммер этого не поймёт. Морфологический словарь вряд ли предоставит словоформы для слова «упячка». Более сложные гибридные алгоритмы, использующие словарные базы и наборы эвристик, более совершенны, но и они неидеальны.  Сейчас ситуация с учетом морфологии примерно такая:
  1. При поиске по БД только лишь средствами SQL обычно используют стеммер. Это наихудший учет морфологии
  2. Open source поисковые системы, такие как Sphinx, Lucene, Xapian обычно поддерживают установку своего морфологического анализатора, но в качестве встроенного алгоритма для русского языка обычно также используется стеммер. 
  3. Яндекс.СерверFAST, Google Appliance имеют продвинутые гибридные алгоритмы учета морфологии. Вероятно, Яндекс.Сервер и  Google Appliance  имеют наилучший морфологический анализатор для русского языка из существующих, так как они используют тот же алгоритм, что и в веб-поиске. 


Ранжирование


Под ранжированием понимается порядок сортировки найденных документах на странице результатов поиска. Иногда достаточно сортировать результаты по простому критерию, например, по дате модификации, но чаще всего требуется упорядочивание документов в порядке уменьшения близости поискового запроса результату. На ранжировании разработчики крупных поисковых систем сломали много копий, поэтому их продукты дают наилучшие результаты. Ситуация с ранжированием примерно такая:
  1. При использовании поиска средствами SQL доступно ранжирование только по простым критериям, таким как дата. 
  2. Open Source системы (Sphinx, Lucene, др.) имеют встроенные продвинутые алогритмы ранжирования. Обычно это модификации алогритма текстовой релевантности.
  3. Коммерческие продукты (Яндекс.Сервер, FAST, Google Appliance, др.) имеют сложные многофакторные алгоритмы ранжирования, секрет которых хранится в тайне под семью замками так же, как рецепт приготовления Кока-Колы.

Выводы 

  1. Для небольшого некоммерческого сайта подойдет форма поиска Яндекса/Гугла.
  2. Для поиска по разделу сайта, не требующего анализа морфологии запроса, сложного ранжирования и содержащего небольшое количество данных, можно использовать SQL запрос + стеммер.  
  3. Для достаточно большого сайта, содержащего нетривиальные статьи стоит использовать движок с хорошей морфологией и ранжированием:Яндекс.Сервер, FAST, Google Appliance, др. 
  4. Lucene, Sphinx, и др. подойдут, если душа лежит к Open Source и требования к поиску удовлетворяются возможностями движка.

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

  1. «Обзор решений для полнотекстового поиска в веб-проектах: Sphinx, Apache Lucene, Xapian» — статья на http://www.developers.org.ua
  2. «High Performance FullText Search» — сравнение производительности поиска и индексации популярных полнотекстовых Open Source движков при работе с MySQL (PDF 109кб)  
  3. http://poiskovod.ru — оригинал статьи в моем блоге
Tags:
Hubs:
+52
Comments 57
Comments Comments 57

Articles