Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save anonymous/6f7b3aba4a9a9345b1066679d15db596 to your computer and use it in GitHub Desktop.
Save anonymous/6f7b3aba4a9a9345b1066679d15db596 to your computer and use it in GitHub Desktop.
Как делать поиск по сайту по словам

Как делать поиск по сайту по словам - Как найти слово на веб-странице (сайте)


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



Как сделать поиск по сайту
Своя поисковая система на сайте
Как найти слово на веб-странице (сайте)
Как сделать поиск по сайту
Как найти слово на веб-странице (сайте)
Как сделать поиск по сайту













Только зарегистрированные пользователи могут участвовать в опросе. Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. Яницкий Вадим Павлович axilirator. Наверное, многие когда-нибудь задумывались, как сделать поиск на сайте? Безусловно, для крупных сайтов с большим количеством контента поиск является просто незаменимой вещью. В большинстве случаев пользователь, впервые посетив Ваш сайт в поисках чего-либо важного, не станет разбираться в навигационных панелях, выпадающих меню и прочих элементах навигации, а в спешке попытается найти что-нибудь похожее на поисковую строку. И если такой роскоши на сайте не окажется, либо он не справится с поисковым запросом, то посетитель просто закроет вкладку. Но статья не о значении поиска для сайта и не о психологии посетителей. Я расскажу, как реализовать небольшой алгоритм полнотекстового поиска, который, надеюсь, избавит начинающих разработчиков от головной боли. У читателя может возникнуть вопрос: Да, у крупных поисковиков есть API, есть такие клевые проекты, как Sphinx и Apache Solr. Но у каждого из этих решений есть свои преимущества и недостатки. Пользуясь услугами поисковиков, типа Google и Яндекс, Вы получите множество плюшек, таких как мощный морфологический анализ, исправление опечаток и ошибок в запросе, распознавание неверной раскладки клавиатуры, однако без ложки дегтя тут не обойдется. Во первых, такой поиск не интегрируется в структуру сайта — он внешний, и Вы не сможете указать ему, какие данные наиболее важны, а какие не очень. Во вторых, содержимое сайта индексируется только с определенным интервалом, который зависит от выбранного поисковика, так что если на сайте что-нибудь обновится, придется дожидаться момента, когда эти изменения попадут в индекс и станут доступными в поиске. У Sphinx и Apache Solr дела с интеграцией и индексированием гораздо лучше, но не каждый хостинг позволит из запустить. Ничто не мешает написать поисковый механизм самостоятельно. Предполагается, что сайт работает на PHP в связке с каким-нибудь сервером баз данных, например MySQL. Давайте сначала определимся, что требуется от поиска на сайте? Поиск с учетом языковой морфологии. Не зависимо от падежа, окончания и других прелестей великого и могучего языка поиск должен находить то, что нужно пользователю. Одним из способов достижения данной цели является приведение каждого слова поискового запроса и слов содержимого сайта к базовой форме. Возможность указать контекст поиска. То есть, возможность самостоятельно выбрать контент сайта, в пределах которого будет работать поисковый алгоритм, а также определить значимость для каждого из пределов. Предполагается, что поисковый запрос чаще всего будет содержать название искомой продукции, поэтому поиск по названиям товара будет иметь наивысший приоритет. В качестве следующего приоритета можно выбрать поиск по свойствам товаров, затем поиск по описанию. Сервер принимает каждое соединение, управление потоком передается интерпретатору PHP. При каждом запросе заново инициализируется поисковый движок, заново перерывается содержимое сайта… Сложно сказать, сколько времени и ресурсов потребуется, чтобы обработать все эти запросы. Именно для того, чтобы не делать одну и ту же работу по сто раз, была придумана технология индексирования. Индексирование выполняется только при изменении или добавлении содержимого сайта, а поиск выполняется уже по индексу, а не по содержимому. Ранжирование результатов поиска — это сортировка результатов поиска, выполняемая на основе оценки значимости найденных данных. Данное слово содержится в двух статьях: Вероятнее всего, первая статья будет иметь большее значение для инициатора поиска. Также каждой разновидности содержимого сайта при индексировании задается определенный коэффициент, который будет влиять на его позиции в поисковой выдаче. Теперь пару слов о том, что нам предстоит реализовать: В конце статьи будет показан пример реализации поиска на примере простого интернет-магазина. Тем, кому лень все это изучать и просто нужен готовый поисковик, можно смело забирать движок из репозитория GitHub FireWind. Принцип работы Со стороны бэкенда поиск работает так: Подготовка Задача поставлена, теперь можно перейти к делу. Все, что Вам нужно — это знание основ PHP и умение обращаться с MySQL. Наш проект будет состоять из ядра, где будут собраны все жизненно необходимые функции, а также модуля морфологического анализа и обработки текста. Для начала создадим корневую папку проекта firewind, а в ней создадим файл core. На этом подготовительная часть заканчивается, пора двигаться дальше. Научить машину понимать его, да и любой другой язык, — довольно непростая задача. Наиболее успешны в этом плане поисковые компании, типа Google и Яндекс, которые постоянно улучшают свои алгоритмы и держат их в секрете. Придется нам сделать что-то свое, попроще. К счастью, колесо изобретать не придется — все уже сделано за нас. Встречайте, phpMorphy — морфологический анализатор, поддерживающий русский, английский и немецкий языки. Более подробную информацию можно получить тут , однако нас интересуют только две его возможности: Нужна библиотека и словарь для нее. Все это добро можно найти тут. Скачиваем последние версии в корневую папку проекта и распаковываем: Библиотека готова к использованию. Для этого создадим еще один файл morphyus. Метод lemmatize возвращает массив лемм слова, либо false, если таковых не нашлось. Механизм ранжирования на уровне морфологии Давайте остановимся на такой единице языка, как предложение. Чаще всего подлежащее выражается существительным, а сказуемое глаголом. Второстепенные члены в основном употребляются для уточнения смысла основы. В разных предложениях одни и те же части речи порой имеют совершенно разное значение, и наиболее точно оценить это значение в контексте текста сегодня может только человек. Однако программно оценить значение какого-либо слова все-таки можно, хоть и не так точно. При этом алгоритм ранжирования должен опираться на так называемый профиль текста, который определяется его автором. Профиль представляет из себя ассоциативный массив, ключами которого являются части речи, а значениями соответственно ранг или вес каждой из них. Пример профиля я покажу в заключении, а пока попробуем перевести эти размышления на язык PHP, добавив еще один метод к классу morphyus: Но что же все-таки происходит при индексировании? Если по порядку, то: Согласно профилю, из текста отбрасываются незначимые части речи. Значимые оцениваются по пятибальной шкале, с помощью метода weigh. Для каждого сова выполняется поиск лемм, иначе говоря базовых форм. Рассчитывается количество повторений каждого слова и суммарный ранг. Все данные записываются в объект и в виде JSON записываются в базу данных. В результате получается объект следующего формата: Ранг каждого слова, кстати, расчитывается по формуле: Наиболее подходящим местом для них будет база данных. Если индексируется содержимое файлов, то можно создать отдельную таблицу в базе данных, которая будет содержать индекс название каждого файла, а для содержимого, которое уже хранится в базе, можно добавить еще одно поле типа в структуру таблиц. Такой подход позволит разделять типы содержимого при поиске, например, названия и описание статей в случае блога. Можно использовать JSON и хранить его в полях типа LONGTEXT, можно BSON или CBOR, используя тип данных LONGBLOB. Два последних формата позволяют представлять данные в более компактном виде, чем первый. Benchmark Давайте проверим, что у нас получилось. Intel Core iU 2. Реализация поиска Остался последний и самый главный метод, метод поиска. В качестве первого аргумента метод принимает индекс поискового запроса, в качестве второго — индекс содержимого, в котором выполняется поиск. В результате выполнения возвращается суммарный ранг, рассчитанный на основе ранга найденных слов, либо 0, если ничего не нашлось. Это позволит сортировать поисковую выдачу. Поисковый движок готов к использованию. Но есть одно но… На самом деле это не джин-волшебник, и просто закинув его на свой сайт Вы не получите ничего. Его нужно интегрировать, причем этот процесс во многом зависит от архитектуры Вашего сайта. Рассмотрим этот процесс на примере небольшого интернет магазина. Реализация поиска на примере интернет-магазина Допустим, информация о продаваемой продукции хранится в таблице production: И все это будут храниться в формате JSON. Вот пример функции добавления нового продукта: А теперь обработчик поисковых запросов: В результате выводятся найденные продукты магазина. Заключение В статье был описан один из вариантов реализации поиска для сайта. Это самая первая его версия, поэтому буду только рад узнать Ваши замечания, мнения и пожелания. Присоединяйтесь к моему проекту на Github: В планах добавить туда еще кучу всяких возможностей, вроде кэширования поисковых запросов, подсказок при вводе поискового запроса и алгоритма побуквенного сравнения, который поможет бороться с опечатками. Всем спасибо за внимание, ну и с днем информационной безопасности! Какой поиск для сайта предпочитаете Вы? Программирование 2,9k авторов , 6,5k публикаций. Системное программирование авторов , публикации. Тестирование IT-систем авторов , 1,1k публикаций. CSS авторов , 1,2k публикаций. JavaScript 1,9k авторов , 4k публикаций. Совершенный код авторов , публикации. Разработка веб-сайтов 4,1k авторов , 9,6k публикаций. IT-стандарты авторов , публикаций. Семантика авторов , публикаций. Разработка игр 1,2k авторов , 2,9k публикаций. Добавить в закладки Яницкий Вадим Павлович axilirator карма. Если честно, из статьи не совсем понятно — зачем собственно реализовывать с нуля все фичи поиска, а не воспользоваться хотя бы теми же Sphinx, Solr или другими? Это и проще, и быстрее работает, и имеет больше полезных фич. Дело в том, что не каждый shared-хостинг позволяет запустить Sphinx или Apache Solar. По-моему если вам нужен поиск с морфологией — можно и купить VDS, цены соразмерны с хостингом. Да госпади, какая разница, платить за шаред за 4 бакса или за VDS за 5? На самом деле писать новый поисковый движок не всегда бессмысленная затея. Например, вроде бы whoosh на питоне написан по такой же причине — не было хорошей pure-python версии. Сейчас же это полноценный и достаточно легко расширяемый движок с хорошей производительностью, пусть в чём-то и уступает гигантам вроде Solr или Elasticsearch. Зато его можно использовать в любом месте, где есть интерпретатор питона, то есть практически везде, без установки монстра-java. Да и для расширения функциональности нужно знать только питон. Вы бы только эту причину почётче указали в статье, а то действительно после прочтения она не совсем ясна. Да при чём тут язык. Петрович, например, частную задачу решает на многих языках. Ну например у меня ни на ноуте, ни на VPS java сейчас не установлена — питон же есть всегда, в любом адекватном дистрибутиве. Как минимум распространённость — уже весомый фактор, если выбирать библиотеку для поиска особенно если не веб-приложение, а предполагается запуск программы у пользователей. Также скорее всего в java-движках больше накладные расходы по памяти по опыту использования других программ на яве , что может быть важно в случае небольших коллекций. Да и более лёгкая расширяемость если знать питон тоже важна. А у меня на ноуте, маке и VPS java есть, а питона нет. Ваша выборка из себя самого не репрезентативна, вы это понимаете? Главное же — в любом дистрибутиве линукса питон есть сразу, а вот java намного реже встречается. И конечно я никак отрицаю того, что по функциональности и скорости на больших объёмах данных движки на java наверное впереди не зря же их разрабатывают дольше и большими командами: Нужно выбирать инструмент под задачу. Да, я про это и говорю — а java обычно нет: Питон привёл просто в качестве примера. Переходить на более медленный и не гибкий инструмент только потому, что он написан на native-языке — плохой вариант. Как академическая тренировка в разработке ПО — это замечательно. Но если речь про бизнес-задачу, не понятно, почему не был использован тот же Sphinx. У студентов сессия нынче и вылеты за неуспеваемость , вот они тут и копипастят что найдут на просторах. Сейчас такая волна начнётся, этот пост ещё мелочь, первая ласточка: Я согласен с raskumandrin, данное решение не годится для бизнеса, но для небольшого сайта на недорогом хостинге вполне в самый раз. Не обязательно писать все с нуля — никто не запрещает взять готовый движок из репозитория и воспользоваться им. В статье я рассказал принципы работы данного движка, а именно путь его создания с нуля. В статье я рассказал принципы работы данного движка То есть переписали документацию и примеры из неё. Ну, для начала, это тоже неплохо — многие и этого не делают: Вы внимательно прочитали мой ответ? А, то есть докментцию к морфи, и примеры, вы не читали, написали свои? Вас может удивить, но документация и примеры phpMorphy показывают, как выполнять морфологический анализ с помощью данной библиотеки, но не полнотекстовый поиск по сайту. У многих поисковиков есть поиск по сайту. Я сделал ссылки на них. Некоторые сбрасывают настройки после первого запроса. Сайт не большой и контент меняется не часто. А в чём прикол-то? Написать свою очередную обёртку к пхп-морфи? Что-то я не понял, какое-то странное индексирование — всё равно нужно прочитать все записи из базы и с каждым отдельно проверять. Нужно все отындексированные слова со всего массива исходных текстов поместить в отдельную таблицу, содержащую слово и список айди тех текстов, из которых вы их индексировали. И потом одним запросом найти все тексты, содержащие хотя бы одно из искомых слов, и их пересечением найти нужные тексты. Хотя, если в базе с пяток текстов, то можно и LIKE-ом обойтись. А так — половинчатое решение. Как я понял вы выложили код на github что бы, все смогли использовать его как библиотеку. И в связи с этим возникает два вопроса: Почему не используется автозагрузка? И из этого вопрос по названиям классов, почему не PSR-0, а лучше PSR-4? Можно даже composer пакет сделать и вынести phpmorphy отдельно 2 Смотрим код, отвечаем на свой же вопрос. Я так понимаю что автор это добро больше как пример выкладывал. Совсем недавно я чуть причёсывал код с текстами и маркдаунил ридмишки. Да, код на GitHub является небольшой библиотекой, которую дорабатываю в свободное время. Цель — pure-PHP библиотека для поиска и индексирования. Как и советовал Fesor, теперь это composer-пакет с автозагрузкой классов по стандарту PSR Тесты в процессе разработки…. Неплохое решение для небольших сайтов, сделать тесты на скорость и релевантность, и будет следующая статья. Насчет TF-IDF, спасибо, в свободное время модифицирую алгоритм ранжирования. В планах добавить туда еще кучу всяких возможностей, Вопрос: Или все-таки будет еще развиваться? Не то, что бы заглох, скорее поставлен на паузу. Сейчас занимаюсь несколькими другими проектами, по завершении которых постараюсь вернуться к этому. Метки лучше разделять запятой. Сейчас Вчера Неделя ядерный CPU, а я не могу сдвинуть курсор 9,6k Первая российская материнская плата массового сегмента 23,5k Интересные публикации Хабрахабр Geektimes. Проблема непрерывной защиты веб-приложений. Взгляд со стороны исследователей и эксплуатантов. Исследование устойчивости национальных сегментов сети. Cолнце и ветер стали самыми дешевыми источниками энергии GT. W3C всё-таки одобрил стандарт DRM для HTML5 GT. Как я боролся с комарами. Личный опыт и тесты на себе GT. Neuralink — Будущее, которое сложно себе представить. Вы будете его частью GT. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.


Характеристика пластиковых панелей пвх
Классификация договоров правовые критерии и значение
Какие вопросы задают при поступлении на работу
Звуковые карты с поддержкой asio
Джерси штат на карте
Фото стихи о любви
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment