Поиск на сайте своими руками

Наверное, многие когда-нибудь задумывались, как сделать поиск на сайте? Безусловно, для крупных сайтов с большим количеством контента поиск является просто незаменимой вещью. В большинстве случаев пользователь, впервые посетив Ваш сайт в поисках чего-либо важного, не станет разбираться в навигационных панелях, выпадающих меню и прочих элементах навигации, а в спешке попытается найти что-нибудь похожее на поисковую строку. И если такой роскоши на сайте не окажется, либо он не справится с поисковым запросом, то посетитель просто закроет вкладку. Но статья не о значении поиска для сайта и не о психологии посетителей. Я расскажу, как реализовать небольшой алгоритм полнотекстового поиска, который, надеюсь, избавит начинающих разработчиков от головной боли.
У читателя может возникнуть вопрос: зачем писать все с нуля, если все уже давно написано? Да, у крупных поисковиков есть API, есть такие клевые проекты, как Sphinx и Apache Solr. Но у каждого из этих решений есть свои преимущества и недостатки. Пользуясь услугами поисковиков, типа Google и Яндекс, Вы получите множество плюшек, таких как мощный морфологический анализ, исправление опечаток и ошибок в запросе, распознавание неверной раскладки клавиатуры, однако без ложки дегтя тут не обойдется. Во первых, такой поиск не интегрируется в структуру сайта — он внешний, и Вы не сможете указать ему, какие данные наиболее важны, а какие не очень. Во вторых, содержимое сайта индексируется только с определенным интервалом, который зависит от выбранного поисковика, так что если на сайте что-нибудь обновится, придется дожидаться момента, когда эти изменения попадут в индекс и станут доступными в поиске. У Sphinx и Apache Solr дела с интеграцией и индексированием гораздо лучше, но не каждый хостинг позволит из запустить.
Ничто не мешает написать поисковый механизм самостоятельно. Предполагается, что сайт работает на PHP в связке с каким-нибудь сервером баз данных, например MySQL. Давайте сначала определимся, что требуется от поиска на сайте?
- Поиск с учетом языковой морфологии. Независимо от падежа, окончания и
других прелестей великого и могучего языка поиск должен находить то, что нужно
пользователю. Другими словами, «яблок», «яблока», «яблоки» — это формы одного и того
же слова «яблоко», что нужно учитывать в поисковом алгоритме. Одним из способов
достижения данной цели является приведение каждого слова поискового запроса и слов
содержимого сайта к базовой форме. - Возможность указать контекст поиска. То есть, возможность самостоятельно выбрать
контент сайта, в пределах которого будет работать поисковый алгоритм, а также определить
значимость для каждого из пределов. Например, рассмотрим интернет-магазин. Предполагается,
что поисковый запрос чаще всего будет содержать название искомой продукции, поэтому поиск по
названиям товара будет иметь наивысший приоритет. В качестве следующего приоритета можно
выбрать поиск по свойствам товаров, затем поиск по описанию. - Индексирование содержимого сайта. Представьте ситуацию: одновременно около 30 человек
выполняют поисковые запросы. Сервер принимает каждое соединение, управление потоком
передается интерпретатору PHP. При каждом запросе заново инициализируется поисковый
движок, заново перерывается содержимое сайта… Сложно сказать, сколько времени и
ресурсов потребуется, чтобы обработать все эти запросы. Именно для того, чтобы не
делать одну и ту же работу по сто раз, была придумана технология индексирования.
Индексирование выполняется только при изменении или добавлении содержимого сайта,
а поиск выполняется уже по индексу, а не по содержимому. - Механизм ранжирования. Ранжирование результатов поиска — это сортировка результатов поиска, выполняемая на основе оценки значимости найденных данных. Например, в каком-нибудь блоге выполняется поисковый запрос «космос». Данное слово содержится в двух статьях: в первой 16 раз, во второй — 5 раз. Вероятнее всего, первая статья будет иметь большее значение для инициатора поиска. Также каждой разновидности содержимого сайта при индексировании задается определенный коэффициент, который будет влиять на его позиции в поисковой выдаче.
- морфологический анализатор,
- алгоритм ранжирования,
- алгоритм индексирования,
- алгоритм поиска.
В конце статьи будет показан пример реализации поиска на примере простого интернет-магазина. Тем, кому лень все это изучать и просто нужен готовый поисковик, можно смело забирать движок из репозитория GitHub FireWind.
Принцип работы
- содержимое сайта индексируется,
- пользователь присылает запрос,
- из запроса исключаются служебные части речи,
- получившаяся строка разбивается на массив слов, переведенных в базовую форму,
- поиск каждого слова полученного массива осуществляется в индексе,
- результаты поиска ранжируются, сортируются и отдаются пользователю.
Подготовка
Задача поставлена, теперь можно перейти к делу. Я использую Linux в качестве рабочей ОС, однако постараюсь не использовать ее экзотических возможностей, чтобы любители Windows смогли «собрать» поисковый движок по аналогии. Все, что Вам нужно — это знание основ PHP и умение обращаться с MySQL. Поехали!
Наш проект будет состоять из ядра, где будут собраны все жизненно необходимые функции, а также модуля морфологического анализа и обработки текста. Для начала создадим корневую папку проекта firewind, а в ней создадим файл core.php — он и будет ядром.
Теперь вооружаемся своим любимым текстовым редактором и подготавливаем каркас:
Тут мы создали основной класс, который можно будет использовать на Ваших сайтах. На этом подготовительная часть заканчивается, пора двигаться дальше.
Морфологический анализатор
Русский язык — довольно сложная штука, которая радует своим разнообразием и шокирует иностранцев конструкциями, типа «да нет, наверное». Научить машину понимать его, да и любой другой язык, — довольно непростая задача. Наиболее успешны в этом плане поисковые компании, типа Google и Яндекс, которые постоянно улучшают свои алгоритмы и держат их в секрете. Придется нам сделать что-то свое, попроще. К счастью, колесо изобретать не придется — все уже сделано за нас. Встречайте, phpMorphy — морфологический анализатор, поддерживающий русский, английский и немецкий языки. Более подробную информацию можно получить тут, однако нас интересуют только две его возможности: лемматизация, то есть получение базовой формы слова, и получение грамматической информации о слове (род, число, падеж, часть речи и т.д.).
Нужна библиотека и словарь для нее. Все это добро можно найти тут. Библиотека находится в одноименной папке «phpmorphy», словари расположены в «phpmorphy-dictionaries». Скачиваем последние версии в корневую папку проекта и распаковываем:
Отлично! Библиотека готова к использованию. Пришло время написать «оболочку», которая абстрагирует работу с phpMorphy. Для этого создадим еще один файл morphyus.php в корневой директории:
Пока реализовано только два метода. get_words разбивает текст на массив слов, фильтруя при этом HTML-теги и сущности типа « ». Метод lemmatize возвращает массив лемм слова, либо false, если таковых не нашлось.
Механизм ранжирования на уровне морфологии
Давайте остановимся на такой единице языка, как предложение. Наиболее важной частью предложения является основа в виде подлежащего и/или сказуемого. Чаще всего подлежащее выражается существительным, а сказуемое глаголом. Второстепенные члены в основном употребляются для уточнения смысла основы. В разных предложениях одни и те же части речи порой имеют совершенно разное значение, и наиболее точно оценить это значение в контексте текста сегодня может только человек. Однако программно оценить значение какого-либо слова все-таки можно, хоть и не так точно. При этом алгоритм ранжирования должен опираться на так называемый профиль текста, который определяется его автором. Профиль представляет из себя ассоциативный массив, ключами которого являются части речи, а значениями соответственно ранг (или вес) каждой из них. Пример профиля я покажу в заключении, а пока попробуем перевести эти размышления на язык PHP, добавив еще один метод к классу morphyus:
Индексирование содержимого сайта

Как уже говорилось выше, индексирование заметно ускоряет выполнение поискового запроса, так как поисковому движку не нужно обрабатывать контент каждый раз заново — поиск выполняется по индексу. Но что же все-таки происходит при индексировании? Если по порядку, то:
- Сначала из текста формируется массив слов, и делается это с помощью метода get_words.
- Согласно профилю, из текста отбрасываются незначимые части речи.
- Значимые оцениваются по пятибальной шкале, с помощью метода weigh.
- Для каждого сова выполняется поиск лемм, иначе говоря базовых форм.
- Рассчитывается количество повторений каждого слова и суммарный ранг.
- Все данные записываются в объект и в виде JSON записываются в базу данных.
В результате получается объект следующего формата:
Пишем инициализатор и первый метод ядра поискового движка:
Теперь при добавлении или изменении данных в таблицах достаточно просто вызвать данную функцию, чтобы проиндексировать их, но это не обязательно: индексирование может быть и отложенным. Первым аргументом метода make_index является исходный текст, вторым — коэффициент значимости индексируемых данных. Ранг каждого слова, кстати, расчитывается по формуле:
Хранение индексированных данных
Очевидно, что индекс нужно где-нибудь хранить, да еще и привязать к исходным данным. Наиболее подходящим местом для них будет база данных. Если индексируется содержимое файлов, то можно создать отдельную таблицу в базе данных, которая будет содержать индекс название каждого файла, а для содержимого, которое уже хранится в базе, можно добавить еще одно поле типа в структуру таблиц. Такой подход позволит разделять типы содержимого при поиске, например, названия и описание статей в случае блога.
Нерешенным остался лишь вопрос формата индексированного содержимого, ведь make_index возвращает объект, и так просто в базу данных или файл его не запишешь. Можно использовать JSON и хранить его в полях типа LONGTEXT, можно BSON или CBOR, используя тип данных LONGBLOB. Два последних формата позволяют представлять данные в более компактном виде, чем первый.
Как говорится, «хозяин — барин», так-что решать, где и как все будет храниться, Вам.
Benchmark
Давайте проверим, что у нас получилось. Я взял текст своей любимой статьи «Темная материя интернета», а именно содержимое узла #content html_format и сохранил его в отдельный файл.
На моей машине с конфигурацией:
CPU: Intel Core i7-4510U @ 2.00GHz, 4M Cache
RAM: 2×4096 Mb
OS: Ubuntu 14.04.1 LTS, x64
PHP: 5.5.9-1ubuntu4.5
Индексирование заняло около секунды:
Думаю, вполне неплохой результат.
Реализация поиска
Остался последний и самый главный метод, метод поиска. В качестве первого аргумента метод принимает индекс поискового запроса, в качестве второго — индекс содержимого, в котором выполняется поиск. В результате выполнения возвращается суммарный ранг, рассчитанный на основе ранга найденных слов, либо 0, если ничего не нашлось. Это позволит сортировать поисковую выдачу.
Все! Поисковый движок готов к использованию. Но есть одно но… На самом деле это не джин-волшебник, и просто закинув его на свой сайт Вы не получите ничего. Его нужно интегрировать, причем этот процесс во многом зависит от архитектуры Вашего сайта. Рассмотрим этот процесс на примере небольшого интернет магазина.
Реализация поиска на примере интернет-магазина
Допустим, информация о продаваемой продукции хранится в таблице production:
А описание в таблице description:
Поле production.keywords будет содержать индекс ключевых слов продукта, description.index будет содержать индексированное описание. И все это будут храниться в формате JSON.
Вот пример функции добавления нового продукта:
Здесь поисковый механизм был интегрирован в функцию добавления нового продукта магазина. А теперь обработчик поисковых запросов:
Данный сценарий принимает поисковый запрос в виде GET-параметра query и выполняет поиск. В результате выводятся найденные продукты магазина.
Как сделать поиск по сайту
Давайте начнем с самого распространенного варианта. Мы с вами рассмотрим способ, как сделать поиск по сайту html. Для начала следует отметить, что выглядит такая графа достаточно привычно для любого интернет пользователя. Вы можете увидеть его на изображении ниже.
Как всем известно, простой сайт на html пишется посредством кодов. И когда возникает вопрос того, как сделать поиск по сайту в html, то ответ, конечно же, прост. Необходимо написать код. Но как правильно его выстроить, чтобы получить самый простой вариант поиска? Для этого вы можете воспользоваться нашей визуальной подсказкой, которую мы разместили ниже. Просто напишите данный кодовый набор в формате HTML.
Таким образом, вы сможете создать самый простой вариант поиска по вашему сайту.
Форма поиска с подсветкой

Стоит отметить, что строка поиска не обязательно должна иметь стандартный вид. Вы вполне можете сделать ее, к примеру, с подсветкой. Для этого стоит просто введите код, который мы разместили ниже, на вашем сайте в тег между <боди>форма поиска</боди>. Внешний вид такого поиска выглядит, как серая полоса поиска, которая исчезает при введении запроса. Такая форма поиска обязательно понравиться посетителям вашего сайта.
Простая но красивая форма поиска
Резиновая форма поиска

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

Мы с вами уже рассмотрели основные формы поиска, но наверняка большинство из вас предпочли бы более, эстетический вариант. Как же его сделать? Конечно же, посредством html-кода, как и предыдущие варианты. Он наиболее длинный из всех, вот почему мы решили не останавливаться на данном вопросе, а просто разместить, изображение такого поиска, в качестве ознакомительного фрагмента.
Как искать слово на странице в браузере

Порой при просмотре какой-либо веб-страницы нужно отыскать определённое слово или фразу. Все популярные браузеры оснащены функцией, которая производит поиск в тексте и выделяет совпадения. Этот урок покажет Вам, как вызвать панель поиска и как ею пользоваться.
Как проводить поиск по интернет-странице
Следующая инструкция поможет быстро открыть поиск с помощью горячих клавиш в известных браузерах, среди которых Opera, Google Chrome, Internet Explorer, Mozilla Firefox.
С помощью клавиш клавиатуры

- Переходим на страницу нужного нам сайта и нажимаем одновременно две кнопки «Ctrl+F» (в Mac OS – «Сmd+F»), другой вариант – нажать «F3».
- Появится небольшое окошко, которое находится вверху либо внизу страницы. В нём есть поле для ввода, навигация (кнопки назад и вперёд) и кнопка, которая закрывает панель.
Вот так с помощью нескольких клавиш можно с лёгкостью найти на веб-странице интересующий текст, при этом не читая всю информацию со страницы.
Еще статьи по данной теме:
Помогла ли Вам статья?
что сделать чтобы эта панель не выскакивала автоматически когда я жму f3? не могу прибавить звук
К сожалению, никак. Изменять или полностью убирать стандартные сочетания клавиш, установленные в браузере, не получится.
так можно осуществлять поиск в пределах страницы. А как искать по документу который представлен на нескольких страницах и нет возможности их скачать?
Если на сайте нет внутреннего расширенного поиска, остается только последовательно переходить на каждую страницу и искать нужное слово.
Нужно изменить настройки, чтобы текст можно было искать по факту набора, без нажатия на F3 и другие сочетания. Есть решения?
Здравствуйте, Octavian. Такой возможности в браузерах нет, есть только стандартный поиск, к которому нужно обращаться повторно (F3 или CTRL+F) после каждого обращения к содержимому страницы.
Как сделать строгий поиск ?
(чтобы совпадал регистр букв + их количество, ввел например слово «дом» и нашел только «дом», другие слова Дом, дома, домашний и тд не берутся)
Здравствуйте, Андрей. Настолько точного поиска, как Вы описали, в браузерах нет. Все что можно сделать — искать точные совпадения, для чего предусмотрен соответствующий чекбокс под поисковой строкой. Но такой поиск все равно не будет учитывать регистр, и уж точно не будет видеть разницу между целым словом или аналогичным куском другого слова.
Единственное, что наверняка сработает (правда, только в некоторых случаях) — это добавление в строке поиска пробела до и после искомого слова (ну или только с одной стороны), тогда однокоренные и прочие похожие слова точно не будут найдены. Однако не будут найдены и слова из Вашего примера — например, «дом» в кавычках или дом, с запятой.
Поиск ключевых слов и информации на странице в браузере
Каждый день человек сталкивается с большими объемами новой информации. В интернете существуют миллионы веб-страниц, на которых можно найти необходимые данные. По этой причине тратится много времени на то, чтобы отыскать необходимый абзац или несколько ключевых слов в огромном количестве выдаваемого браузерами текстом. Человеку сложно быстро сориентироваться в огромных текстах, размещенных на разных сайтах. Острая необходимость быстро найти информацию возникает в профессиональной деятельности бухгалтеров, юристов, редакторов и писателей.
Но что если на поиск необходимой информации совершенно нет времени, а найти какое-либо слово нужно как можно скорее? В этом случае нужно включать функцию поиска по странице, встроенную практически во всех компьютерные программы для работы с текстом. Основными из этих программ являются текстовые редакторы и браузеры для выхода в интернет. В каждом из них есть определенные горячие клавиши, которые позволяют быстро отыскать все вхождения словосочетания или целого предложения.
Быстрый поиск необходимых слов
Для быстрого поиска ключевого слова или фразы в браузере или текстовом документе можно использовать функцию «поиск на странице». Горячие клавиши помогают искать нужные абзацы и облегчают работу с поисковыми системами, позволяют быстро редактировать текст.
При использовании любого браузера — Гугл Хром, Яндекс Браузер, Мозилла, Сафари — можно пользоваться горячими клавишами, для чего нужно сделать такой шаг: в поисковой системе или текстовом документе необходимо нажать комбинацию клавиш Ctrl + F. При использовании планшетов, компьютеров и телефонов компании Apple подходит сочетание клавиш Cmd + F. Это действие откроет окно для ввода слов, необходимых для поиска.
Строка поиска в разных браузерах может находиться в таких местах:
- в Опере — верхний левый угол;
- в Мозилле — нижний левый угол;
- в Гугл Хром — верхний правый угол;
- в Internet Explorer — верхний левый угол;
- в Яндекс Браузере — верхний правый угол.
В открывшейся поисковой строке пишут слово или фразу, которую нужно найти. После ввода все вхождения в тексте на странице необходимой фразы выделяются определенным цветом — голубым, оранжевым, красным или зеленым — в зависимости от типа браузера. Если в тексте нет искомого слова, то в поисковой строке будет стоять цифра ноль, а сама панель станет красного цвета. В открывшейся строке пишется число точных вхождений фразы во всем тексте.
Дополнительно на поисковой панели будут доступны кнопки, с помощью которых можно перемещаться по тексту вниз и вверх в том случае, если соответствий с искомым словом несколько. Закрывается поисковая панель с помощью красного крестика, расположенного на ней, или клавиши Esc.

Поиск в текстовом редакторе
При просмотре документов используются текстовые редакторы, в которых также нужно искать ключевые слова. Найти необходимую фразу на страницах в редакторе текста Microsoft Office Word можно таким же образом:
- В открытом текстовом документе необходимо нажать сочетание клавиш Ctrl + F. Некоторые программы позволяют открыть поисковую строку с помощью клавиши F3. Появится строка или окно, в котором нужно вести искомую фразу.
- После ввода нажимается кнопка «Найти», появится меню, в котором необходимо выбрать пункт «Основной документ».
- В тексте цветом выделится фраза, которую искали. Если выделяется несколько аналогичных фраз, то необходимо пользоваться кнопкой «Найти далее» для просмотра всего документа. В поисковой строке будет стоять количество искомых слов в тексте.
- Текстовый документ закрывается крестиком или кнопкой «Закрыть» на панели поиска.
Больший выбор возможностей для поиска нужных слов в текстовом документе Word можно найти с помощью кнопки «Больше». Она позволяет искать слова с учетом регистра, суффиксов, приставок. Особенно удобно использовать эту опцию, когда нужно найти слова иностранного происхождения или профессионального сленга.

Возможности поисковой панели
Если включить строку поиска в браузере, то появляется возможность отыскать не только слово или фразу, но и цифры, код, любой символ или словосочетание. В поисковую панель текст вписывается с помощью клавиатуры или вставляются ссылки, скопированные из буфера обмена.
Чтобы сделать поиск по странице в браузере Опера, нужно нажать клавишу «/», и искомое предложение или словосочетание на странице выделится цветом. Если при этом курсор мыши находится в каком-либо поле, то функция поиска не будет работать.
Функция поиска в браузерах — лучший способ быстро найти необходимую информацию по ключевым словам или фразам. Ею удобно пользоваться при ограниченном времени выхода в интернет или просмотре большого количества документов.
Видео
Это видео поможет вам научиться быстро находить необходимую информацию в интернете.