Как сделать поиск по сайту
Перейти к содержимому

Как сделать поиск по сайту

  • автор:

Как сделать поиск по сайту?

В некоторых случаях найти определенную информацию на сайте помогает поиск по сайту. В uKit предлагается два виджета поиска по сайту: Поиск Яндекс и Поиск Google.

Примечание:

Перед размещением виджетов поиска не забудьте добавить ваш сайт в Яндекс.Вебмастер и Google Search Console.

Поиск Яндекс

1. Разместите виджет «Поиск Яндекс» в нужном месте страницы вашего сайта

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

3. Далее, выполняйте все шаги, следуя инструкциям. На пятом шаге скопируйте ID поиска из предложенного кода и вставьте его в поле «ID поиска»:

Или скопируйте ID из адресной строки:

4. Вставьте полученный ID в поле для привязки поиска:

Поиск Google

1. Разместите виджет «Поиск Google» в нужном месте страницы вашего сайта

2. Перейдите на страницу создания поиска, нажмите «Добавить сайты и вставьте адрес вашего сайта в поле «Сайты, на которых выполняется поиск:»

3. Нажмите кнопку «Создать» и на появившейся странице кликните на кнопку «Панель управления»:

4. В разделе «Детали» скопируйте идентификатор Вашей поисковой системы:

5. Вставьте полученный ID в поле для привязки поиска:

Важно:

Поиск по сайту осуществляется только по проиндексированным страницам, которые были добавлены в поисковые системы. Новые страницы могут какое-то время отсутствовать в поиске по сайту.

Попробуйте прямо сейчас!

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

Наверное, многие когда-нибудь задумывались, как сделать поиск на сайте? Безусловно, для крупных сайтов с большим количеством контента поиск является просто незаменимой вещью. В большинстве случаев пользователь, впервые посетив Ваш сайт в поисках чего-либо важного, не станет разбираться в навигационных панелях, выпадающих меню и прочих элементах навигации, а в спешке попытается найти что-нибудь похожее на поисковую строку. И если такой роскоши на сайте не окажется, либо он не справится с поисковым запросом, то посетитель просто закроет вкладку. Но статья не о значении поиска для сайта и не о психологии посетителей. Я расскажу, как реализовать небольшой алгоритм полнотекстового поиска, который, надеюсь, избавит начинающих разработчиков от головной боли.

У читателя может возникнуть вопрос: зачем писать все с нуля, если все уже давно написано? Да, у крупных поисковиков есть API, есть такие клевые проекты, как Sphinx и Apache Solr. Но у каждого из этих решений есть свои преимущества и недостатки. Пользуясь услугами поисковиков, типа Google и Яндекс, Вы получите множество плюшек, таких как мощный морфологический анализ, исправление опечаток и ошибок в запросе, распознавание неверной раскладки клавиатуры, однако без ложки дегтя тут не обойдется. Во первых, такой поиск не интегрируется в структуру сайта — он внешний, и Вы не сможете указать ему, какие данные наиболее важны, а какие не очень. Во вторых, содержимое сайта индексируется только с определенным интервалом, который зависит от выбранного поисковика, так что если на сайте что-нибудь обновится, придется дожидаться момента, когда эти изменения попадут в индекс и станут доступными в поиске. У Sphinx и Apache Solr дела с интеграцией и индексированием гораздо лучше, но не каждый хостинг позволит из запустить.

Ничто не мешает написать поисковый механизм самостоятельно. Предполагается, что сайт работает на PHP в связке с каким-нибудь сервером баз данных, например MySQL. Давайте сначала определимся, что требуется от поиска на сайте?

  • Поиск с учетом языковой морфологии. Независимо от падежа, окончания и
    других прелестей великого и могучего языка поиск должен находить то, что нужно
    пользователю. Другими словами, «яблок», «яблока», «яблоки» — это формы одного и того
    же слова «яблоко», что нужно учитывать в поисковом алгоритме. Одним из способов
    достижения данной цели является приведение каждого слова поискового запроса и слов
    содержимого сайта к базовой форме.
  • Возможность указать контекст поиска. То есть, возможность самостоятельно выбрать
    контент сайта, в пределах которого будет работать поисковый алгоритм, а также определить
    значимость для каждого из пределов. Например, рассмотрим интернет-магазин. Предполагается,
    что поисковый запрос чаще всего будет содержать название искомой продукции, поэтому поиск по
    названиям товара будет иметь наивысший приоритет. В качестве следующего приоритета можно
    выбрать поиск по свойствам товаров, затем поиск по описанию.
  • Индексирование содержимого сайта. Представьте ситуацию: одновременно около 30 человек
    выполняют поисковые запросы. Сервер принимает каждое соединение, управление потоком
    передается интерпретатору PHP. При каждом запросе заново инициализируется поисковый
    движок, заново перерывается содержимое сайта… Сложно сказать, сколько времени и
    ресурсов потребуется, чтобы обработать все эти запросы. Именно для того, чтобы не
    делать одну и ту же работу по сто раз, была придумана технология индексирования.
    Индексирование выполняется только при изменении или добавлении содержимого сайта,
    а поиск выполняется уже по индексу, а не по содержимому.
  • Механизм ранжирования. Ранжирование результатов поиска — это сортировка результатов поиска, выполняемая на основе оценки значимости найденных данных. Например, в каком-нибудь блоге выполняется поисковый запрос «космос». Данное слово содержится в двух статьях: в первой 16 раз, во второй — 5 раз. Вероятнее всего, первая статья будет иметь большее значение для инициатора поиска. Также каждой разновидности содержимого сайта при индексировании задается определенный коэффициент, который будет влиять на его позиции в поисковой выдаче.
  • морфологический анализатор,
  • алгоритм ранжирования,
  • алгоритм индексирования,
  • алгоритм поиска.

В конце статьи будет показан пример реализации поиска на примере простого интернет-магазина. Тем, кому лень все это изучать и просто нужен готовый поисковик, можно смело забирать движок из репозитория GitHub FireWind.

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

Задача поставлена, теперь можно перейти к делу. Я использую Linux в качестве рабочей ОС, однако постараюсь не использовать ее экзотических возможностей, чтобы любители Windows смогли «собрать» поисковый движок по аналогии. Все, что Вам нужно — это знание основ PHP и умение обращаться с MySQL. Поехали!

Наш проект будет состоять из ядра, где будут собраны все жизненно необходимые функции, а также модуля морфологического анализа и обработки текста. Для начала создадим корневую папку проекта firewind, а в ней создадим файл core.php — он и будет ядром.

$ mkdir firewind $ cd firewind $ touch core.php 

Теперь вооружаемся своим любимым текстовым редактором и подготавливаем каркас:

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

Морфологический анализатор

Русский язык — довольно сложная штука, которая радует своим разнообразием и шокирует иностранцев конструкциями, типа «да нет, наверное». Научить машину понимать его, да и любой другой язык, — довольно непростая задача. Наиболее успешны в этом плане поисковые компании, типа Google и Яндекс, которые постоянно улучшают свои алгоритмы и держат их в секрете. Придется нам сделать что-то свое, попроще. К счастью, колесо изобретать не придется — все уже сделано за нас. Встречайте, phpMorphy — морфологический анализатор, поддерживающий русский, английский и немецкий языки. Более подробную информацию можно получить тут, однако нас интересуют только две его возможности: лемматизация, то есть получение базовой формы слова, и получение грамматической информации о слове (род, число, падеж, часть речи и т.д.).

Нужна библиотека и словарь для нее. Все это добро можно найти тут. Библиотека находится в одноименной папке «phpmorphy», словари расположены в «phpmorphy-dictionaries». Скачиваем последние версии в корневую папку проекта и распаковываем:

# Распаковываем библиотеку $ unzip phpmorphy-0.3.7.zip $ mv phpmorphy-0.3.7 phpmorphy # Распаковываем словарь в phpmorphy/dicts $ unzip morphy-0.3.x-ru_RU-withjo-utf-8.zip -d phpmorphy/dicts/ # Удаляем исходные архивы $ rm phpmorphy-0.3.7.zip morphy-0.3.x-ru_RU-withjo-utf-8.zip 

Отлично! Библиотека готова к использованию. Пришло время написать «оболочку», которая абстрагирует работу с phpMorphy. Для этого создадим еще один файл morphyus.php в корневой директории:

phpmorphy = new phpMorphy( $directory, $language, $options ); > /** * Разбивает текст на массив слов * * @param content Исходный текст для выделения слов * @param filter Активирует фильтрацию HTML-тегов и сущностей * @return Результирующий массив */ public function get_words( $content, $filter=true ) < // Фильтрация HTML-тегов и HTML-сущностей // if ( $filter ) < $content = strip_tags( $content ); $content = preg_replace( $this->regexp_entity, ' ', $content ); > // Перевод в верхний регистр // $content = mb_strtoupper( $content, 'UTF-8' ); // Замена ё на е // $content = str_ireplace( 'Ё', 'Е', $content ); // Выделение слов из контекста // preg_match_all( $this->regexp_word, $content, $words_src ); return $words_src[ 1 ]; > /** * Находит леммы слова * * @param word Исходное слово * @param Массив возможных лемм слова, либо false */ public function lemmatize( $word ) < // Получение базовой формы слова // $lemmas = $this->phpmorphy->lemmatize( $word ); return $lemmas; > > ?> 

Пока реализовано только два метода. get_words разбивает текст на массив слов, фильтруя при этом HTML-теги и сущности типа » «. Метод lemmatize возвращает массив лемм слова, либо false, если таковых не нашлось.

Механизм ранжирования на уровне морфологии

Давайте остановимся на такой единице языка, как предложение. Наиболее важной частью предложения является основа в виде подлежащего и/или сказуемого. Чаще всего подлежащее выражается существительным, а сказуемое глаголом. Второстепенные члены в основном употребляются для уточнения смысла основы. В разных предложениях одни и те же части речи порой имеют совершенно разное значение, и наиболее точно оценить это значение в контексте текста сегодня может только человек. Однако программно оценить значение какого-либо слова все-таки можно, хоть и не так точно. При этом алгоритм ранжирования должен опираться на так называемый профиль текста, который определяется его автором. Профиль представляет из себя ассоциативный массив, ключами которого являются части речи, а значениями соответственно ранг (или вес) каждой из них. Пример профиля я покажу в заключении, а пока попробуем перевести эти размышления на язык PHP, добавив еще один метод к классу morphyus:

 word Исходное слово * @param profile Профиль текста * @return Оценка значимости от 0 до 5 */ public function weigh( $word, $profile=false ) < // Попытка определения части речи // $partsOfSpeech = $this->phpmorphy->getPartOfSpeech( $word ); // Профиль по умолчанию // if ( !$profile ) < $profile = [ // Служебные части речи // 'ПРЕДЛ' =>0, 'СОЮЗ' => 0, 'МЕЖД' => 0, 'ВВОДН' => 0, 'ЧАСТ' => 0, 'МС' => 0, // Наиболее значимые части речи // 'С' => 5, 'Г' => 5, 'П' => 3, 'Н' => 3, // Остальные части речи // 'DEFAULT' => 1 ]; > // Если не удалось определить возможные части речи // if ( !$partsOfSpeech ) < return $profile[ 'DEFAULT' ]; >// Определение ранга // for ( $i = 0; $i < count( $partsOfSpeech ); $i++ ) < if ( isset( $profile[ $partsOfSpeech[ $i ] ] ) ) < $range[] = $profile[ $partsOfSpeech[ $i ] ]; >else < $range[] = $profile[ 'DEFAULT' ]; >> return max( $range ); > > ?> 
Индексирование содержимого сайта

Как уже говорилось выше, индексирование заметно ускоряет выполнение поискового запроса, так как поисковому движку не нужно обрабатывать контент каждый раз заново — поиск выполняется по индексу. Но что же все-таки происходит при индексировании? Если по порядку, то:

  • Сначала из текста формируется массив слов, и делается это с помощью метода get_words.
  • Согласно профилю, из текста отбрасываются незначимые части речи.
  • Значимые оцениваются по пятибальной шкале, с помощью метода weigh.
  • Для каждого сова выполняется поиск лемм, иначе говоря базовых форм.
  • Рассчитывается количество повторений каждого слова и суммарный ранг.
  • Все данные записываются в объект и в виде JSON записываются в базу данных.

В результате получается объект следующего формата:

< "range" : "", "words" : [ // Одно из слов // < "source" : "", "range" : "", "count" : "", "weight" : "", "basic" : [ // Варианты лемм слова // ] > ] > 

Пишем инициализатор и первый метод ядра поискового движка:

morphyus = new morphyus; > /** * Выполняет индексирование текста * * @param content Текст для индексирования * @param [range] Коэффициент значимости индексируемых данных * @return Результат индексирования */ public function make_index( $content, $range=1 ) < $index = new stdClass; $index->range = $range; $index->words = []; // Выделение слов из текста // $words = $this->morphyus->get_words( $content ); foreach ( $words as $word ) < // Оценка значимости слова // $weight = $this->morphyus->weigh( $word ); if ( $weight > 0 ) < // Количество слов в индексе // $length = count( $index->words ); // Проверка существования исходного слова в индексе // for ( $i = 0; $i < $length; $i++ ) < if ( $index->words[ $i ]->source === $word ) < // Исходное слово уже есть в индексе // $index->words[ $i ]->count++; $index->words[ $i ]->range = $range * $index->words[ $i ]->count * $index->words[ $i ]->weight; // Обработка следующего слова // continue 2; > > // Если исходного слова еще нет в индексе // $lemma = $this->morphyus->lemmatize( $word ); if ( $lemma ) < // Проверка наличия лемм в индексе // for ( $i = 0; $i < $length; $i++ ) < // Если у сравниваемого слова есть леммы // if ( $index->words[ $i ]->basic ) < $difference = count( array_diff( $lemma, $index->words[ $i ]->basic ) ); // Если сравниваемое слово имеет менее двух отличных лемм // if ( $difference === 0 ) < $index->words[ $i ]->count++; $index->words[ $i ]->range = $range * $index->words[ $i ]->count * $index->words[ $i ]->weight; // Обработка следующего слова // continue 2; > > > > // Если в индексе нет ни лемм, ни исходного слова, // // значит пора добавить его // $node = new stdClass; $node->source = $word; $node->count = 1; $node->range = $range * $weight; $node->weight = $weight; $node->basic = $lemma; $index->words[] = $node; > > return $index; > > ?> 

Теперь при добавлении или изменении данных в таблицах достаточно просто вызвать данную функцию, чтобы проиндексировать их, но это не обязательно: индексирование может быть и отложенным. Первым аргументом метода make_index является исходный текст, вторым — коэффициент значимости индексируемых данных. Ранг каждого слова, кстати, расчитывается по формуле:

 * * ; // В коде это выглядит так: // $index->words[ $i ]->range = $range * $index->words[ $i ]->count * $index->words[ $i ]->weight; ?> 
Хранение индексированных данных

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

Нерешенным остался лишь вопрос формата индексированного содержимого, ведь make_index возвращает объект, и так просто в базу данных или файл его не запишешь. Можно использовать JSON и хранить его в полях типа LONGTEXT, можно BSON или CBOR, используя тип данных LONGBLOB. Два последних формата позволяют представлять данные в более компактном виде, чем первый.

Как говорится, «хозяин — барин», так-что решать, где и как все будет храниться, Вам.

Benchmark

Давайте проверим, что у нас получилось. Я взял текст своей любимой статьи «Темная материя интернета», а именно содержимое узла #content html_format и сохранил его в отдельный файл.

make_index( $source ); // Засекаем время конца // $finish_time = microtime( true ); echo "Indexing finished: $finish_time\n"; // Результаты // $total_time = $finish_time - $begin_time; echo "Total time: $total_time\n"; ?> 

На моей машине с конфигурацией:
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

Индексирование заняло около секунды:

$ php benchmark.php Indexing started: 1417343592.3094 Indexing finished: 1417343593.5604 Total time: 1.2510349750519 

Думаю, вполне неплохой результат.

Реализация поиска

Остался последний и самый главный метод, метод поиска. В качестве первого аргумента метод принимает индекс поискового запроса, в качестве второго — индекс содержимого, в котором выполняется поиск. В результате выполнения возвращается суммарный ранг, рассчитанный на основе ранга найденных слов, либо 0, если ничего не нашлось. Это позволит сортировать поисковую выдачу.

 target Искомые данные * @param source Данные, в которых выполняется поиск * @return Суммарный ранг на основе найденных данных */ public function search( $target, $index ) < $total_range = 0; // Перебор слов запроса // foreach ( $target->words as $target_word ) < // Перебор слов индекса // foreach ( $index->words as $index_word ) < if ( $index_word->source === $target_word->source ) < $total_range += $index_word->range; > else if ( $index_word->basic && $target_word->basic ) < // Если у искомого и индексированного слов есть леммы // $index_count = count( $index_word ->basic ); $target_count = count( $target_word ->basic ); for ( $i = 0; $i < $target_count; $i++ ) < for ( $j = 0; $j < $index_count; $j++ ) < if ( $index_word->basic[ $j ] === $target_word->basic[ $i ] ) < $total_range += $index_word->range; continue 2; > > > > > > return $total_range; > > ?> 

Все! Поисковый движок готов к использованию. Но есть одно но… На самом деле это не джин-волшебник, и просто закинув его на свой сайт Вы не получите ничего. Его нужно интегрировать, причем этот процесс во многом зависит от архитектуры Вашего сайта. Рассмотрим этот процесс на примере небольшого интернет магазина.

Реализация поиска на примере интернет-магазина

Допустим, информация о продаваемой продукции хранится в таблице production:

CREATE TABLE `production` ( `uid` INT NOT NULL AUTO_INCREMENT, -- Уникальный идентификатор `name` VARCHAR(45) NOT NULL, -- Название продукта `manufacturer` VARCHAR(45) NOT NULL, -- Производитель `price` INT NOT NULL, -- Стоимость продукта `keywords` TEXT NULL, -- Индекс ключевых слов PRIMARY KEY ( `uid` ) ); SHOW COLUMNS FROM `production`; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+-------+ | uid | int(11) | NO | PRI | NULL | | | name | varchar(45) | NO | | NULL | | | manufacturer | varchar(45) | NO | | NULL | | | price | int(11) | NO | | NULL | | | keywords | text | YES | | NULL | | +--------------+-------------+------+-----+---------+-------+ 

А описание в таблице description:

CREATE TABLE `description` ( `uid` INT NOT NULL AUTO_INCREMENT, -- Уникальный идентификатор `fid` INT NOT NULL, -- Внешний ключ для привязки описания к продукту `description` LONGTEXT NOT NULL, -- Само описание `index` TEXT NULL, -- Индексированное описание PRIMARY KEY ( `uid` ) ); SHOW COLUMNS FROM `description`; +-------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------+------+-----+---------+-------+ | uid | int(11) | NO | PRI | NULL | | | fid | int(11) | NO | | NULL | | | description | longtext | NO | | NULL | | | index | text | YES | | NULL | | +-------------+----------+------+-----+---------+-------+ 

Поле production.keywords будет содержать индекс ключевых слов продукта, description.index будет содержать индексированное описание. И все это будут храниться в формате JSON.

Вот пример функции добавления нового продукта:

connect_error ) < die( 'Cannot connect to database.' ); >$connection->set_charset( 'UTF8' ); function add_product( $name, $manufacturer, $price, $description, $keywords ) < global $firewind, $connection; // Индексирование описания продукта // $description_index = $firewind->make_index( $description ); $description_index = json_encode( $description_index ); // Индексирование ключевых слов // $keywords_index = $firewind->make_index( $keywords, 2 ); $keywords_index = json_encode( $keywords_index ); // Подготовка запросов // $production_query = $connection->prepare( "INSERT INTO `production` ( `name`, `manufacturer`, `price`, `keywords` ) VALUES ( ?, ?, ?, ? )" ); $description_query = $connection->prepare( "INSERT INTO `description` ( `fid`, `description`, `index` ) VALUES ( LAST_INSERT_ID(), ?, ? )" ); if ( !$production_query || !$description_query ) < die( "Cannot prepare requests!\n" ); >if ( // Биндинг параметров // $production_query -> bind_param( 'ssis', $name, $manufacturer, $price, $keywords_index ) && $description_query -> bind_param( 'ss', $description, $description_index ) && // Выполнение запросов // $production_query -> execute() && $description_query -> execute() ) < // Если запросы выполнились успешно // echo( "Product successfully added!\n" ); // Завершение запросов // $production_query ->close(); $description_query -> close(); return true; > else < die( "An error occurred while executing query. \n" ); >> ?> 

Здесь поисковый механизм был интегрирован в функцию добавления нового продукта магазина. А теперь обработчик поисковых запросов:

connect_error ) < die( 'Cannot connect to database.' ); >$connection->set_charset( 'UTF8' ); // Поисковый запрос // $query = isset( $_GET[ 'query' ] ) ? trim( $_GET[ 'query' ] ) : false; if ( $query ) < // Обработка поискового запроса // $query_index = $firewind->make_index( $query ); // Получение данных // $production = $connection->query(" SELECT p.`uid`, p.`name`, p.`keywords`, d.`index` FROM `production` p, `description` d WHERE p.`uid` = d.`uid` "); if ( !$production ) < die( "Cannot get production info.\n" ); >// Выполнение поиска // while ( $product = $production->fetch_assoc() ) < // Распаковка индекса // $keywords = json_decode( $product[ 'keywords' ] ); $index = json_decode( $product[ 'index' ] ); $range = $firewind->search( $query_index, $keywords ); $range += $firewind->search( $query_index, $index ); if ( $range > 0 ) < $result[ $product[ 'uid' ] ] = $range; >> // Если что-нибудь нашлось // if ( isset( $result ) ) < // Сортировка по убыванию // arsort( $result ); // Вывод результатов // $i = 1; foreach ( $result as $uid =>$range ) < printf( "#%d. Found product with id %d and range %d.\n", $i++, $uid, $range ); >> else < echo( "Sorry, no results found.\n" ); >> else < echo( "Query cannot be empty. Try again.\n" ); >?> 

Данный сценарий принимает поисковый запрос в виде GET-параметра query и выполняет поиск. В результате выводятся найденные продукты магазина.

Заключение

В статье был описан один из вариантов реализации поиска для сайта. Это самая первая его версия, поэтому буду только рад узнать Ваши замечания, мнения и пожелания. Присоединяйтесь к моему проекту на Github: https://github.com/axilirator/firewind. В планах добавить туда еще кучу всяких возможностей, вроде кэширования поисковых запросов, подсказок при вводе поискового запроса и алгоритма побуквенного сравнения, который поможет бороться с опечатками.

Всем спасибо за внимание, ну и с днем информационной безопасности!

Правильное проектирование поиска на сайте: что нужно учесть, чтобы поиск работал на конверсию

В этой статье поговорим о проектировании поиска. Всегда ли он нужен? Как он должен работать? По каким разделам происходит поиск на сайте? Как будет выводиться результат? А будет ли предварительная выдача результата? Все эти вопросы должен задать себе UX-дизайнер при разработке Информационной архитектуры, Use Case, и продумать все функциональные моменты ещё до того, как начнёт рисовать.

Правильное проектирование поиска на сайте: что нужно учесть, чтобы поиск работал на конверсию
Оглавление

  • Каким должен быть поиск на сайте
  • Аналитика поиска
  • Фичи по реализации поиска
  • Разбор конкретного примера — сайт Ленинградского мебельного завода
  • Итоги

Главная задача, которую должен решать поиск — помочь пользователю найти нужную информацию, поэтому от его реализации зависит конверсия сайта. На больших сайтах 60% пользователей начинают взаимодействие с продуктом через поиск и, находя информацию, совершают покупку в 1,8 раз чаще. А получая провал в результатах поиска — 80% пользователей покидают сайт, так и не узнав, что информация на сайте есть на определенной странице.

Каким должен быть поиск на сайте

Однозначного ответа на этот вопрос нет, все зависит от ниши, для которой проектируется данный функционал. В нише медицины ищут врачей и, возможно, в поиске стоит возле врача сделать кнопку «Записаться», ведь именно для этой цели пользователь ищет специалиста. В интернет-магазине может выводиться поиск товаров и возможность не только перейти на страницу продукции, но и сразу отправить «В корзину».

Самая важная задача поиска — помочь пользователю быстро найти информацию и совершить целевое действие. Представьте большой корпоративный сайт из 30 или более страниц. Человеку будет сложно пройти все разделы и страницы, более того, он этого просто делать не будет, потому что лень =) Все привыкли к удобству, что все легко и просто. Грамотно спроектированная работа поиска помогает:

● Просто и быстро найти информацию;
● Сократить путь пользователя по воронке продаж и повысить конверсию;
● Повысить удобство при использовании сервиса / сайта, а значит, увеличить лояльность клиентов.

Как сделать поиск по сайту: полезные советы и рекомендации

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

Зачем нужен поиск по сайту и его преимущества

Поиск по сайту необходим для того, чтобы посетители могли быстро находить нужную информацию. Основные преимущества поиска по сайту:

  • Удобство для пользователей. Посетители могут сразу найти интересующий их контент, не тратя время на ручной поиск.
  • Повышение конверсии сайта. Удобный поиск способствует продажам, так как пользователи быстрее находят нужный товар или услугу.
  • Улучшение юзабилити. Поиск делает сайт более удобным в использовании.
  • Оптимизация навигации. Позволяет сократить глубину вложенности разделов, упростить структуру.

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

Виды поиска по сайту

Существует несколько основных видов реализации поиска по сайту:

  1. Полнотекстовый поиск. Производится по всему тексту сайта, позволяет искать по любым словам и фразам.
  2. Поиск по метаданным. Выдает результаты на основе заголовков, описаний, ключевых слов.
  3. Фасетный поиск. Позволяет уточнять запрос с помощью фильтров и параметров.
  4. Поиск по AJAX. Результаты выводятся мгновенно, без перезагрузки страницы.

Наиболее распространен полнотекстовый поиск, так как он дает самые релевантные и точные результаты. Фасетный поиск часто используется на крупных интернет-магазинах.

Как сделать поиск по сайту:

Интеграция сторонних систем поиска

Для реализации поиска по сайту можно использовать готовые решения от поисковых систем:

  • Подключение «Яндекс.Поиска». Позволяет быстро добавить на сайт поиск от Яндекса, настроить дизайн.
  • Использование Google Custom Search. Google предоставляет поиск для сайтов, но этот сервис является платным.
  • Другие сервисы: Elasticsearch, Algolia, Sphinx и т.д. Позволяют гибко настраивать поиск, но требуют разработки.

Интеграция готовых решений — самый быстрый способ реализовать поиск с минимальными усилиями.

Реализация поиска на WordPress

Для создания поиска на WordPress существует несколько вариантов:

  1. Плагины для поиска. Например, AJAX Search Lite, Search Everything.
  2. Настройка встроенного поиска WordPress. Можно расширить его возможности.
  3. Дополнительные модули для расширенного поиска. SearchWP, Relevanssi.

Лучше всего сочетать плагин с дополнительным модулем. Это позволит получить максимум возможностей для поиска по сайту.

Как сделать поиск по сайту:

Поиск для сайтов на 1С-Битрикс

1С-Битрикс предоставляет специальные модули для организации поиска:

  • Модули компоненты поиска. Реализуют базовый поиск по сайту.
  • Интеграция с Яндекс и Google. Позволяет подключить внешние системы.
  • Доработка настроек. Можно расширить возможности поиска с помощью настроек и событий.

Грамотное сочетание встроенных модулей и внешних систем — оптимальный путь для создания поиска по сайту на 1С-Битрикс.

Разработка поиска на чистом HTML/CSS

Чтобы реализовать поиск по сайту на чистом HTML/CSS, потребуется:

  1. Структура и верстка формы. Создать HTML-разметку поля для запроса и кнопки поиска.
  2. Отправка и обработка запроса. При submit формы отправлять данные для обработки скриптом.
  3. Вывод результатов. Сформировать страницу с результатами поиска.

Потребуется написание скрипта на языке программирования (PHP, Python, JavaScript) для обработки запросов пользователя и вывода результатов.

Особенности SEO-оптимизации поиска

Чтобы поиск по сайту работал максимально эффективно, необходимо провести его SEO-оптимизацию:

  • Подбор релевантных запросов. Проанализировать семантику сайта и составить список запросов, по которым пользователи ищут нужный контент.
  • Индексация страниц для поиска. Убедиться, что все важные страницы проиндексированы и доступны для поисковых систем.
  • Повышение юзабилити результатов. Сделать так, чтобы пользователю было удобно работать с результатами поиска.

Грамотная SEO-оптимизация позволит сделать поиск по сайту максимально релевантным и эффективным.

Ошибки в настройке поиска по сайту

Существует несколько типичных ошибок, которые встречаются при настройке поиска по сайту:

  • Нерелевантные результаты поиска. Это говорит о проблемах с индексацией или алгоритмом.
  • Отсутствие подсказок и коррекции опечаток. Усложняет поиск для пользователей.
  • Медленная загрузка результатов. Влияет на юзабилити поиска, нужно оптимизировать скорость.
  • Плохая сортировка результатов. Важно выводить самые релевантные результаты первыми.
  • Отсутствие фильтров и facet-навигации. Затрудняет уточнение результатов поиска.

Чтобы избежать этих ошибок, нужно тщательно тестировать поиск и корректировать его настройки.

Тестирование и отладка поиска по сайту

После настройки поиска необходимо провести его тестирование и отладку:

  1. Проверка работы поиска по ключевым запросам. Насколько релевантны результаты?
  2. Тестирование на типичных опечатках и ошибках. Предлагаются ли подсказки?
  3. Оценка скорости выдачи результатов поиска. Нет ли заметных задержек?
  4. Анализ сортировки результатов. Первыми идут самые релевантные?
  5. Проверка фильтров и фасетов. Удобно ли уточнять запрос?

Тестирование поможет найти слабые места в поиске по сайту и скорректировать настройки для улучшения его работы.

Альтернативы поиску по сайту

Помимо традиционного поиска по сайту, существуют и альтернативные варианты навигации:

  • Карта сайта. Показывает структуру и связи разделов сайта.
  • Теги и метки. Позволяют группировать контент по темам.
  • Встроенные подсказки и рекомендации. Предлагают релевантный контент.
  • Фильтры и фасетная навигация. Дают возможность уточнить запрос.

Эти альтернативные способы навигации хорошо дополняют традиционный поиск по сайту.

Тенденции в развитии поиска по сайтам

К основным трендам в развитии поиска по сайтам можно отнести:

  • Рост популярности интеллектуальных алгоритмов. Использование нейронных сетей и машинного обучения.
  • Развитие голосового поиска. Возможность искать информацию голосом.
  • Визуализация результатов поиска. Выдача картинок, видео, инфографики.
  • Персонализация результатов под пользователя. Показ контента, основанный на предпочтениях.
  • Мультиязычный поиск. Возможность искать информацию на разных языках.

Учет этих тенденций позволит сделать поиск по сайту еще более удобным и функциональным.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *