Standalone-модуль поиска нужен далеко не всем сайтам. Если на сайте пять страниц — поиск не нужен. Если сайт обновляется раз в месяц или все обновления отражаются на титульной странице — можно обойтись внешним поиском по сайту от Гугла или Яндекса. Но некоторые задачи внешний поиск решить не сможет. Эта статья о том, какие функции может выполнять встроенный модуль поиска. И часть из этих функций не имеют прямого отношения к процессу поиска.
Большие поисковики предоставляют нам возможность пользоваться их многолетними наработками в области релевантности, вычисления поискового спама, морфологии и прочего ранжирования. Но есть задачи, с которыми внешний поисковик не в состоянии справиться в силу своей «внешности».
Вы добавили на сайт статью — и она уже сразу в индексе и доступна для поиска. Вы удалили матерный комментарий — и его уже никто не найдет. Если на вашем сайте установлена форма поиска через глобальный поисковик, вам придется ждать переиндексации подчас неделями. Если встроенный поисковый модуль позволяет переиндексировать фрагмент сайта по событию «добавление», «изменение» или «удаление», счет пойдет на минуты или даже секунды.
Название нашего продукта часто пишут по-русски как «неткэт», «неткат», «неткет». Яндексу в голову не придет, что по таким запросам нужно показать страницы, где написано NetCat (кроме запроса «неткат», его Яндекс распознал). Что уж говорить про случаи типа «CMS — цмс, цмска, сиэмэс». А встроенному поиску мы можем явно задавать подобные синонимы.
Написание текстов «для Яндекса» имеет кардинальные отличия от написания текстов для людей. В первом случае нам нужно, чтобы из миллиона страниц «на эту тему» Яндекс выше всех показал страницу на нашем сайте. Во втором — чтобы человек, УЖЕ пришедший на сайт, быстро нашел нужную ему страницу и купил наш продукт. Поэтому, если человек ищет на нашем сайте «розовый слоник», нам нужно показать ему не длинную статью с идеально выверенным количеством данных словосочетаний, а страницу с парой фоток и кнопкой «купить». Имея возможность задать веса тэгов и отдельных блоков веб-страниц (например, по атрибуту class) для внутреннего поисковика, мы можем подготовить контент таким образом, чтобы процесс «ввел запрос — купил» занял у пользователя минимум времени.
В файле robots.txt мы можем написать инструкцию Disallow, которая запретит внешним поисковикам индексировать некоторые части сайта. Как показали летние скандалы с попаданием приватной информации в поисковики, это не всегда помогает. Но даже если не брать это в расчет, синтаксис disallow очень примитивен, и было бы куда лучше указать запрещенные области регулярным выражением. Пример: страница sloniki.html?action=add, предназначенная для добавления администратором контента на соответствующую страницу, вполне может попасть в индекс, пусть даже там будет только заголовок «Розовые слоники» и форма авторизации. Но зачем нам замусоривать результаты поиска?
Все знакомы с выпадающим списком, который Яндекс или Гугл показывает нам по мере ввода запроса. Но эта подсказка — лишь список наиболее популярных запросов. Внутренний же поиск может подгружать не только популярные запросы, но и заголовки страниц (то есть названия документов), подходящие под вводимый запрос. Начав вводить «розовы», мы увидим список содержимых тэга title, где содержится этот фрагмент; нажав на нужный нам «Розовые слоники», мы сразу попадем на искомую страницу вместо результатов поиска.
Если наш сайт большой, его полная переиндексация может отнять много времени и ресурсов. Но если раздел «Форум» нужно переиндексировать каждый чаc, «Новости» каждый день, а «О компании» вообще никогда, было бы здорово так и делать. Внутренний поиск вполне может позволить себе разные расписания для разных разделов. Конечно, в sitemap мы можем управлять частотой переидексации при помощи атрибута changefreq, но... Вряд ли Яндекс с Гуглом воспримут наше пожелание как инструкцию к действию.
А также:
Модуль поиска между делом может выполнять не только свои прямые обязанности, но и другие общественно-полезные задачи. Вот несколько примеров.
Кто тщательнее всех составит полный список страниц сайта для внешних поисковиков, как не локальный поисковый робот? При этом, на уровне структуры сайта мы можем задать параметры changefreq и priority, для разных разделов разные.
Способов поиска внутренних ссылок на несуществующие страницы как минимум два. Первый — написать обработчик ошибки 404, который будет отправлять письмо с адресом страницы и реферера (или добавлять сообщение в базу сайта) каждый раз, когда кто-то зайдет на такую страницу. Второй — поручить это поисковому роботу. Это явно более правильный способ.
Если поисковый движок собирает статистику по запросам и их результатам, эти данные могут очень сильно нам помочь. Во-первых, мы можем увидеть запросы, по которым пользователи ничего не находят, и добавить соответствующие страницы. Во-вторых, увидев часто встречающиеся опечатки, мы сможем добавить их в словарь синонимов. В-третьих, если какую-то страницу ищут слишком часто, значит, ее сложно найти без поиска; возможно, стоит вынести ее в меню. Ну и так далее.
Кстати, отдельный пункт — статистика по запросам конкретных зарегистрированных пользователей. Только не подумайте, что я призываю вас за ними следить :)
Все эти навороты хороши только в том случае, если поиск действительно удобен, ищет то, что надо, и им легко и просто пользоваться. Поэтому наш поисковый модуль должен уметь то, что умеют большие поисковики. Так же хорошо, как они. Ну или почти так же.
Многие локальные поисковики для работы со словоформами обходятся стеммингом. Этот термин обозначает отбрасывание окончания слова в попытке найти его корень и как следствие — словоформы. Берем слово «розовый», применяем стемминг, получаем «розов», и теперь все слова, начинающиеся на этот «корень», считаем словоформами. Так мы по запросу «розовый» найдем «розовых», «розовые» и пр. Но стемминг дает слишком большую погрешность и не подходит, к примеру, для изолированных глаголов («идти — пошел — дойти»). Наиболее точный поиск словоформ дают морфологические словари. Для текстов бытовой или деловой тематики они не такие большие (NetCat использует бесплатный словарь от aot.ru, русский и английский словари вместе занимают всего 15 мегабайт, что не так много для современных хостингов; можно использовать другие словари; также можно добавлять словари других языков).
Кстати, пользуясь случаем, хочу сказать огромное спасибо автору библиотеки морфоанализа phpMorphy, которая оказалась очень полезной для наших задач.
Бороться с опечатками можно двумя способами. Первый — находить наиболее похожее слово, как делает тот же Яндекс, второй — использовать нечеткий поиск.
А вот исправление раскладки клавиатуры — это гораздо проще.
Следующие возможности мы не стали включать в наш модуль поиска по причине их экзотичности или слишком высокой трудоемкости, хотя для некоторых случаев они могут быть полезны.
Европейские языки (в т.ч. русский) имеют направление написания слева направо (left-to-right, LTR). Но арабская вязь пишется в обратном направлении. Если ваш проект ориентирован на эту языковую аудиторию, готовьтесь написать (или подключить готовый) стеммер. А иероглифы — вообще отдельный случай, там одним стеммером не обойтись.
Системы разграничения прав в интернет-проектах встречаются разные, в том числе вполне параноидальные (об этом я хочу написать отдельную статью). Пример сложного варианта: издательские системы. Журналист может иметь права на добавление статьи (в определенные разделы!) и ее коррекцию, пока она не откорректирована редактором. Редактор имеет право на просмотр, коррекцию и включение-выключение всех материалов в рамках своей тематики. Главный редактор не имеет права корректировать заказные статьи без одобрения коммерческого отдела. С точки зрения параноидальной системы разграничения прав идеальный поисковый модуль индексировал бы весь контент, размещенный на проекте, а при поиске проверял бы права пользователя и выводил бы только доступные ему материалы. И при этом позволял бы делать фильтр по статусу документа.
Анализируя проиндексированную страницу текста, можно с некоторой долей погрешности определить ее тематику. Полезные эффекты от такой фичи: автоматическая каталогизация материалов и построение облака тэгов, анализ интересов сообщества или отдельных его членов (для UGС-проектов), построение списков связанных материалов (видели блоки «см. также»?). Наиболее же часто такой анализ используется для таргетирования контекстной рекламы.
Сюда же: кэширование результатов поиска, поиск по картинкам, индексация страниц, генерируемых по заполнению форм или ajax-ом, поиск дублей страниц.
Еще одно интересное применение поисковой машины пришло мне в голову в процессе написание этой статьи. Оно подходит, к примеру, для коллективных блогов и СМИ. Анализируя тексты разных авторов, мы можем строить их рейтинги по разным параметрам. Первое, что приходит в голову: словарный запас. Кроме того: рейтинг авторов-холериков (кто чаще остальных использует восклицательные знаки), любителей пространных рассуждений (кто любит знаки вопроса), по словам-паразитам и т.д. Может, предложить Хабраадминистрации сделать что-то подобное? :) Правда, коммерческое обоснование такой игрушки я пока не придумал.
... для начала нужно ответить на вопрос, а нужен ли он, не стоит ли использовать уже имеющиеся решения: Яндекс.Сервер, Sphinx и пр. Главное преимущество собственного поисковика: возможность тесной интеграции с другими модулями CMS, используемой на сайте. Речь не только о встраивании интерфейса управления в админку, а об интеграции с системой разграничения прав, управления структурой, пользователями и пр. (об этом я уже писал).
Что касается технологий, то гибких и мощных платформ хватает. В поисковом модуле NetCat по умолчанию используется Zend_Search_Lucene. У этого решения есть недостатки, например, сравнительно низкая скорость работы. В нашем случае это оправдано тем, что сайт под NetCat должен работать на любом стандартном UNIX-хостинге без необходимости установки дополнительных компонентов, а Zend_Search_Lucene не требуется ничего, кроме PHP. Справедливости ради надо заметить, что мы сделали модуль расширяемым, то есть заменять можно не только словари, но и программные компоненты: если проект достаточно крупный, а сервер выделенный, можно заменять компоненты, отвечающие за хранение и извлечение информации, индексацию, приведение к базовой форме и пр. Например, использовать тот же Sphinx или Solr (а если надо, то и Яндекс.XML).
Если же вы разрабатываете не универсальную CMS, а конкретный крупный проект, выбрать и настроить оптимальную платформу не проблема. Гораздо важнее понять, как использовать ее возможности максимально эффективно.
Все скриншоты в статье сделаны на нашем сайте и в его системе администрирования.
Оригинал статьи: http://habrahabr.ru/company/netcat/blog/136492/
Данная статья рассматривает поиск на отдельной взятой CMS. В общем, все очень правильно написано. Мы являемся партнерами данной CMS, поэтому это нас не может не радовать. Хотелось бы больше таких разборов различных функционалов в сравнении. Так как это помогает наглядно объяснять клиентам выбора той или иной технологии. И ее необходимость.
Если на сайт приходят посетители, то поиск на сайте нужен. На любом сайте, даже если на нем 3 страницы. И вот почему.
Функция поиска «предоставить информацию по запросу» является второстепенной или стандартной.
Основная функция, на мой взгляд — маркетинговая — дать владельцам сайтов информацию о том, что ищут посетители (или ЦА, или потенциальные клиенты — называть можно как угодно) и использовать эту информацию в своих корытных целях)).
Например, на одном из сайтов наших клиентов (сеть медицинских клиник) есть форма поиска. Когда мы начали собирать статистику, что же ищут пользователи, то выяснили, что самым популярным запросом является запрос «цены» (4% всех пользователей). Сам раздел был спрятан глубоко и никак не отображался в меню. Если пользователи ищут цены — нужно их предоставить, и было принято решение сделать раздел «сквозным», что способствовало снижению показателя отказов.
Второй пример: интернет-магазин бытовой техники. При анализе статистики поиска по сайту выяснилось, что 2% посетителей ищут холодильники, которые просто отсутствовали в ассортименте. Данная статистика способствовала принятию решения ввести в ассортимент холодильники и увеличить продажи.
Поэтому, поиск на нужен на любом сайте, чтобы выполнять свою основную функцию — маркетинговую!
Интересный обзор функций поиска NetCat. Написано подробно. Я бы сказал, что даже более подробно, чем подразумевала тема. Именно поэтому у меня возникли вопросы по деталям, например по исправлению опечаток. Но это отдельная тема.
Все перечисленное бывает очень необходимо на крупных проектах. Спасибо.
Интересная статья с точки зрения технической реализации поиска. Дмитрий начинает повествование с актуального вопроса, что поиск нужен не каждому сайту, и, я добавлю, что не каждому веб-ресурсу нужен такой насыщенный поиск, как здесь описан.
Очень не хватает информации о том, какой именно поиск нужен различным типам ресурсов. Интернет магазину, например, при формировании собственного поиска больше стоит обратить внимание, как пользователи запрашивают тот или иной товар в интернете. Для информационного портала, соответственно важны другие компоненты поиска.
И основной вопрос — стоимость работ по написанию такого функционального поиска. Становится сразу понятно, что большинству проектов на стадии стартапа, насыщенный поиск не столь важен. И речь встает о приоритетах возможностей поиска, что из предложенного важнее и в какой
последовательности запускать различные описанные технологии поиска. Без чего средний сайт сможет прожить, а что будет считаться дурным тоном...
Проведите конкурс среди участников CMS Magazine
Узнайте цены и сроки уже завтра. Это бесплатно и займет ≈5 минут.
Творческий директор в Onlyweb
Подавляющее большинство сайтов не велико, и поиск им вообще не требуется. Отлично, когда даже на крупном ресурсе пользователю нет необходимости прибегать к поиску и он справляется средствами навигации.
Согласен, в силу своей универсальности решения от Яндекса и Гугла не всегда работают идеально. Но я уверен, что внешний поиск закрывает потребности минимум 90 процентов сайтов.
А для больших и сложных сайтов (например, государственных) поиск является очень важной и нужной штукой.
Заниматься поиском на сайте стоит очень серьёзно и аккуратно, учитывая тематику и специфику ресурса. Но функционал большинства CMS предоставляет эту возможность в полной мере. Не думаю, что кто-то при выборе системы управления сайтом принимает решение, уделяя большое внимание реализации модуля поиска.