Как сделать собственный поисковик
CSE или как за 5 минут сделать собственный поисковик, работающий на технологии Google
Вместо предисловия: обращаю Ваше внимание, что это сможет сделать и ребенок 😉
Компания Google всегда радовала пользователей изобилием качественных сервисов и услуг. Если уж Google что-то предлагает – значит это нужно. Думаю к этому уже все привыкли.
Я хочу рассказать Вам о сервисе под названием CSE — Custom Search Engine. Но дает Вам возможность буквально за считанные минуты создать свою собственную специализированную поисковую систему.
Цель сервиса такая же, как и основная цель Google – наиболее быстро предоставить пользователю нужную ему информацию. И на этот раз способ достижения этой цели буквально гениален и, как и все гениальное, — чрезвычайно прост 🙂
Google предполагает, что каждый пользователь в Интернете обладает определенным набором знаний и профессиональных навычек в интересующей его (пользователя) области. Он (пользователь) уже не раз искал информацию об этом в интернете, перебирал множество результатов в выдаче поисковиков и знает многие качественные ресурсы именно по этой тематике. Так почему бы не дать ему возможность организовать поиск по этим (качественным) ресурсам?!
Именно это предлагает сделать сервис CSE.
Вы создаете поисковую систему, работающую по технологии Google. Это как поиск по Вашему сайту, только он (поиск) осуществляется по всем сайтам, которые Вы включили в свой список. Таким образом интернет-общественность получает полноценный поисковик, но поисковик этот не выдает в результатах запроса сайты, не имеющие к запросу никакого отношения или некачественные (по Вашему мнению) сайты, или дорвеи.
Написано, конечно, немного заумно… Для наглядности приведу два примера:
• Progler.ru — Поисковая система для программиста (http://progler.ru)
Progler.Ru осуществляет поиск по сайтам посвященным программированию, что позволяет более конкретно и быстро отвечать на запросы.
• DNSE.RU – Поисковая система для домейнера (Domain Name
Осуществляет поиск по самым известным доменным ресурсам (форумы, блоги, новости, официальные сайты) (http://dnse.ru/). Это мой собственный. А вот английская версия: dncheetah.com
Напоследок скажу, что работают такие поисковики отменно. Быстро и качественно, не выдавая в результаты лишнего.
Ну и тем, кто решил создать свою поисковую систему. Сделать это (а точнее — оформить) двумя способами:
1. С выдачей результатов в Google (пример: www.google.ru/coop/cse?cx=008870169635117920385%3Agrw1u_tlpii&hl=ru)
2. С выдачей результатов на страницу Вашего сайта.
Оба варианта предполагают возможность установки формы для запроса на Вашем сайте.
Вот вроде бы и все, что я хотел рассказать.
Предварительно зарегистрируйте себе почтовый ящик на gmail.com, войдите с его помощью в свой аккаунт и для старта идите сюда: www.google.ru/coop/cse/overview?hl=ru
Затем заполните несколько простых полей (название, описание, ключевые слова и, самое главное, — список сайтов для поиска) – ВСЕ!, поисковик готов! Если Вы еще и обладаете минимальными знаниями html – нет ничего проще перенести этот поисковик на Ваш собственный домен, или вставить форму запроса в свой сайт!
Если будут вопросы – не стесняясь задавайте их тут: idnf.ru/showthread.php?t=904 (регистрироваться не обязательно).
Всем успехов в начинаниях!
Поисковые технологии или в чем загвоздка написать свой поисковик
Когда-то давно взбрела мне в голову идея: написать свой собственный поисковик. Было это очень давно, тогда я еще учился в ВУЗе, мало чего знал про технологии разработки больших проектов, зато отлично владел парой десятков языков программирования и протоколов, да и сайтов своих к тому времени было понаделано много.
Ну есть у меня тяга к монструозным проектам, да…
В то время про то, как они работают было известно мало. Статьи на английском и очень скудные. Некоторые мои знакомые, которые были тогда в курсе моих поисков, на основе нарытых и мной и ими документов и идей, в том числе тех, которые родились в процессе наших споров, сейчас делают неплохие курсы, придумывают новые технологии поиска, в общем, эта тема дала развитие довольно интересным работам. Эти работы привели в том числе к новым разработкам разных крупных компаний, в том числе Google, но я лично прямого отношения к этому не имею.
На данный момент у меня есть собственный, обучающийся поисковик от и до, со многими нюансами – подсчетом PR, сбором статистик-тематик, обучающейся функцией ранжирования, ноу хау в виде отрезания несущественного контента страницы типа меню и рекламы. Скорость индексации примерно полмиллиона страниц в сутки. Все это крутится на двух моих домашних серверах, и в данный момент я занимаюсь масштабированием системы на примерно 5 свободных серверов, к которым у меня есть доступ.
Здесь я в первый раз, публично, опишу то, что было сделано лично мной. Думаю, многим будет интересно как же работают Яндекс, Google и почти все мне известные поисковики изнутри.
Есть много задач при построении таких систем, которые почти нереально решить в общем случае, однако с помощью некоторых ухищрений, придумок и хорошего понимания как работает железячная часть Вашего компьютера можно серьезно упростить. Как пример – пересчет PR, который в случае нескольких десятков миллионов страниц уже невозможно поместить в самой большой оперативной памяти, особенно если Вы, как и я, жадны до информации, и хотите кроме 1 цифры хранить еще много полезностей. Другая задача – хранение и обновление индекса, как минимум двумерной базы данных, в которой конкретному слову сопоставляется список документов, на которых оно встречается.
Просто вдумайтесь, Google хранит, по одной из оценок, более 500 миллиардов страниц в индексе. Если бы каждое слово встречалось на 1 странице только 1 раз, и на хранение этого надо было 1 байт – что невозможно, т.к. надо хранить хотя бы id страницы – уже от 4 байт, так вот тогда объем индекса бы был 500гб. В реальности одно слово встречается на странице в среднем до 10 раз, объем информации на вхождение редко когда меньше 30-50 байт, весь индекс увеличивается в тысячи раз… Ну и как прикажите это хранить? А обновлять?
Ну вот, как это все устроено и работает, я буду рассказывать планомерно, так же как и про то как считать PR быстро и инкрементально, про то как хранить миллионы и миллиарды текстов страниц, их адреса и быстро искать по адресам, как организованы разные части моей базы данных, как инкрементально обновлять индекс на много сотен гигов, ну и наверное расскажу как сделать обучающийся алгоритм ранжирования.
На сегодня объем только индекса, по которому происходит поиск — 57Gb, увеличивается каждый день примерно на 1Gb. Объем сжатых текстов – 25Gb, ну и я храню кучу другой полезной инфы, объем которой очень трудно посчитать из-за ее обилия.
От поисковика на сайте до собственной поисковой системы
В этой статье хочу обсудить с Вами такую проблему как поиск на сайте и предложить свой вариант ее решения. В сети огромное множество сайтов, которые оснащены отвратительным поиском, еще больше сайтов вообще без этой функции. Даже вошло в привычку не искать на сайте, а вбивать в поисковик «запрос site:domain.com» или просто «запрос domain». Почему такой важной вещи, как поиск, уделяется так мало внимания? Давайте разбираться вместе.
Давным давно, когда можно было увидеть Pege Rank, а вебмастера играли на ТИЦ в карты, я создал свой первый сайт на тему автомобилей. Работая на простой CMS, он висел на дешевом хостинге без возможности установить базу данных. Тогда впервые мне пришла идея претворить свой первый проект в крупный портал с удобным поиском. Как только я поделился этой идеей со своим другом, который в то время успешно занимался разработкой и продвижением сайтов в поисковых системах (ПС), сразу же получил неутешительный фидбэк. Мол, это возможно, и даже одному клиенту он попытался это сделать, однако это настолько сложно, что проще сделать еще несколько сайтов и добавить их в сапу, чем заморачиваться над одним проектом с туманными перспективами монетизации. Что-то подобное я уже слышал от сварщика дяди Васи, когда пришел к нему с просьбой сварить две алюминиевых детали. Он долго рассказывал о специальных электродах, которых у него нет в наличии, аргоне, и что в молодости он с напарником из алюминия смастерил небольшой летательный аппарат, но в моем случае проще отказаться от алюминия и сделать все из обычного железа.
С тех пор прошло много апдейтов ПС, и что же мы видим сейчас? Есть ли простое и быстрое решение, дабы сделать поиск на сайте? Так сказать, появилась ли у дяди Васи аргоновая сварка? Расцвели ли яблони на Марсе? Провел ли Илон Маск тест-драйв новой Tesla Mars? Запустили ли Джеймса Уэбба в космос или до сих пор его тёзка переворачивается в гробу?
Итак, вернемся к нашим баранам. Когда говоришь фразу «поиск на сайте», у ребят, которые в теме, сразу есть готовый ответ Elastic или Sphinx. А когда говоришь «собственная поисковая система», то они отвечают — Elactic Site Search, но это очень дорого! Так, стоп, здесь, пожалуйста, поподробнее! Есть бесплатное решение, а есть такое же, но по высокой цене. Кто покупал Windows у Microsoft в нулевых, когда работали радиорынки?
Как говорится, дьявол кроется в деталях. Elastic и Sphinx- это поисковые движки, которые ищут по базе данных сайта и являются достаточно хорошим решением, если у вас один сайт. Если сайтов большее количество или нет возможности получить доступ к базам данных сайта, или она вообще отсутствует, то это не лучший вариант. Теоретически можно написать краулер, который будет сканировать сайты, сохранять полученную информацию в базу и там уже использовать для поиска Elastic или Sphinx. Но это лишь умозрительно, я, по крайней мере, готовой реализации не встречал.
А что там с платным Elactic Site Search?
А как это вывести в профит?
А ведь так хотелось сделать поисковик, в котором можно было бы искать рецепты с картинками или агрегировать сайты по недвижимости и выводить в серпе адрес, планировку квартиры, телефон продавца/арендодателя или собрать информацию о продаже автомобилей со всех досок объявлений и не только.
Нет! Not! Non! Net! Não! No! Nie! Нi!
Именно столько языков понимает поисковая система Kavunka, автором которой я являюсь. Как и обещал в начале статьи, это мой вариант решения проблемы поиска на сайте и создания маленькой поисковой системы. Прям как маленький свечной заводик, к которому потянется вереница интернет-верующих в силу товаров и услуг. В поисках низких цен и заветных скидок, они создадут, пусть небольшой, но такой вожделенный интернет-трафик. А в период великих праздников, как-то «черная пятница» и «предновогодние скидки», мощности домашнего датацентра будет не хватать и придется отправляться в святая святых — на небеса к Амазон и заказывать дополнительные серверы для покрытия поисковых нужд интернет-поломников. Уж прости меня, дорогой читатель, но без стеба над столь авантюрной идеей это выглядело бы по-детски наивно. Несмотря на то, что в современном мире принято раздувать щеки, демонстрировать важность и революционность своего продукта, даже если это всего лишь приложение «фонарик», я убежден, что самокритика и самоирония принесут больше пользы продукту, нежели безумная любовь к своему творению и болезненная реакция на хейт.
Давайте посмотрим, что там у нас под капотом у Kavunka 2.1
Более 20K строк кода чистокровного Си будут стабильно работать на одном ядре с 1 GB RAM под управлением CentOS 7 и держать в индексе 10 сайтов по 1000 страниц. Если у Вас домашний ПК или сервер с большим объемом оперативной памяти, то легко можно загнать в индекс миллионы страниц. Кеш с индексом одного миллиона будет весить всего 150GB. Вы спросите, почему так мало? Потому что в кэше хранится чистый текст без тегов и javascript — кода.
Как было уже сказано выше, софт распознает 8 языков: ru, en, it, fr, pt, es, pl, uk. В индекс попадут страницы нужного вам языка, а встроенные алгоритмы будут фильтровать страницы с неуникальным контентом и плохим качеством.
В Kavunka 2.1 реализован стемминг, добавлена возможность присоединять к выдаче результаты веб-скрепинга, это позволило сделать выдачу более репрезентативной. Для сканирования javascript сайтов предусмотрен способ получения html-кода с помощью Firefox при использовании Selenium WebDriver.
Более подробнее о веб-скрепинге
Делается сие чудесное действие параллельно с краулингом по заранее созданному шаблону. Для этого в админ-панеле присутствует вкладка TESTER где легко создаются и тестируются регулярные выражения, производятся другие настройки веб-скрепинга.
Можно установить пороговое значение количества полученных полей для добавления страницы в индекс.
Управление поисковой системой и мониторинг процесса сканирования осуществляется с помощью дружественного веб-интерфейса. Администратор ПС максимально избавлен от необходимости работать с консолью.
Особенности и недостатки
Основной особенностью является то, что Kavunka не использует базы данных, индекс и данные хранятся в файлах. Является ли это недостатком? Считаю, что нет! Теперь, справедливости ради, о недостатках:
Где можно увидеть пример и как установить?
В качестве демонстрации я создал агропоисковую систему. Можете посмотреть на результат запроса «саженцы абрикосов» или «клубниииииика»
Для установки поисковой системы нам понадобится CentOS 7 с уже установленными apache и php. Устанавливаем wget:
Скачиваем скрипт, который произведет необходимые настройки и установит софт:
Делаем скрипт kavinstall.sh исполняемым, устанавливаем владельца и приступаем к установке:
Далее величайшее произведение Казимира Малевича будет осквернено следующими надписями:
На первый взгляд кажется все предельно понятным, но позвольте мне дать некоторые рекомендации:
После завершения установки и перезагрузки сервера необходимо в браузере набрать http://[IP-address]/kavunka-admin/
[IP-address] — комбинация натуральных чисел и точек, которые можно узнать, набрав в консоли волшебную последовательность букв:
На этом этапе Вы должны попасть на страницу авторизации (admin:123456). Далее Вас будет ожидать зеленая надпись «Getting License!» требующая ввести License ID и KAY. За всем этим отправляемся сюда, регистрируемся и создаем лицензию в CL Panel. В поле «Server IP» необходимо ввести внешний IP-адрес. Для получения используйте:
Выбираем язык и жмем +New. После этого будет сгенерирована лицензия с определенным ID и KAY. Срок действия лицензии составит 14 дней, если Вы не собираетесь использовать программное обеспечение Kavunka в коммерческих целях, по запросу в сапорт ее можно бесплатно подлить на 180 дней.
Процедура добавления сайтов очень проста. Переходим во вкладку «TASKS», нажимаем длинную синюю кнопку «add+», выбираем «Octopus» и в поле «Start Page» вводим страницу, с которой краулер начнет сканировать сайт. Если Вы не максималист и не хотите сильно нагружать сканируемый сайт, уменьшите число в поле «nit» до 200. Далее опять длинная кнопка «add+», выбираем «Worder», жмем «OK», и последний раз жмем «add+» потом «Kavunka» и «OK». В бордовой таблице «List Table» находим кнопку «Start», жмем, выбираем «Start» потом «OK». Теперь можно откинуться на спинку кресла и наблюдать, как работает поисковая система. После завершения всех процессов, вы можете перейти во вкладку «SEARCH» и попытаться найти интересующую Вас информацию на том сайте, который вы отсканировали.
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.
Поиск на сайте своими руками
Наверное, многие когда-нибудь задумывались, как сделать поиск на сайте? Безусловно, для крупных сайтов с большим количеством контента поиск является просто незаменимой вещью. В большинстве случаев пользователь, впервые посетив Ваш сайт в поисках чего-либо важного, не станет разбираться в навигационных панелях, выпадающих меню и прочих элементах навигации, а в спешке попытается найти что-нибудь похожее на поисковую строку. И если такой роскоши на сайте не окажется, либо он не справится с поисковым запросом, то посетитель просто закроет вкладку. Но статья не о значении поиска для сайта и не о психологии посетителей. Я расскажу, как реализовать небольшой алгоритм полнотекстового поиска, который, надеюсь, избавит начинающих разработчиков от головной боли.
У читателя может возникнуть вопрос: зачем писать все с нуля, если все уже давно написано? Да, у крупных поисковиков есть API, есть такие клевые проекты, как Sphinx и Apache Solr. Но у каждого из этих решений есть свои преимущества и недостатки. Пользуясь услугами поисковиков, типа Google и Яндекс, Вы получите множество плюшек, таких как мощный морфологический анализ, исправление опечаток и ошибок в запросе, распознавание неверной раскладки клавиатуры, однако без ложки дегтя тут не обойдется. Во первых, такой поиск не интегрируется в структуру сайта — он внешний, и Вы не сможете указать ему, какие данные наиболее важны, а какие не очень. Во вторых, содержимое сайта индексируется только с определенным интервалом, который зависит от выбранного поисковика, так что если на сайте что-нибудь обновится, придется дожидаться момента, когда эти изменения попадут в индекс и станут доступными в поиске. У Sphinx и Apache Solr дела с интеграцией и индексированием гораздо лучше, но не каждый хостинг позволит из запустить.
Ничто не мешает написать поисковый механизм самостоятельно. Предполагается, что сайт работает на PHP в связке с каким-нибудь сервером баз данных, например MySQL. Давайте сначала определимся, что требуется от поиска на сайте?
В конце статьи будет показан пример реализации поиска на примере простого интернет-магазина. Тем, кому лень все это изучать и просто нужен готовый поисковик, можно смело забирать движок из репозитория GitHub FireWind.
Принцип работы
Подготовка
Задача поставлена, теперь можно перейти к делу. Я использую Linux в качестве рабочей ОС, однако постараюсь не использовать ее экзотических возможностей, чтобы любители Windows смогли «собрать» поисковый движок по аналогии. Все, что Вам нужно — это знание основ PHP и умение обращаться с MySQL. Поехали!
Наш проект будет состоять из ядра, где будут собраны все жизненно необходимые функции, а также модуля морфологического анализа и обработки текста. Для начала создадим корневую папку проекта firewind, а в ней создадим файл core.php — он и будет ядром.
Теперь вооружаемся своим любимым текстовым редактором и подготавливаем каркас:
Тут мы создали основной класс, который можно будет использовать на Ваших сайтах. На этом подготовительная часть заканчивается, пора двигаться дальше.
Морфологический анализатор
Русский язык — довольно сложная штука, которая радует своим разнообразием и шокирует иностранцев конструкциями, типа «да нет, наверное». Научить машину понимать его, да и любой другой язык, — довольно непростая задача. Наиболее успешны в этом плане поисковые компании, типа Google и Яндекс, которые постоянно улучшают свои алгоритмы и держат их в секрете. Придется нам сделать что-то свое, попроще. К счастью, колесо изобретать не придется — все уже сделано за нас. Встречайте, phpMorphy — морфологический анализатор, поддерживающий русский, английский и немецкий языки. Более подробную информацию можно получить тут, однако нас интересуют только две его возможности: лемматизация, то есть получение базовой формы слова, и получение грамматической информации о слове (род, число, падеж, часть речи и т.д.).
Нужна библиотека и словарь для нее. Все это добро можно найти тут. Библиотека находится в одноименной папке «phpmorphy», словари расположены в «phpmorphy-dictionaries». Скачиваем последние версии в корневую папку проекта и распаковываем:
Отлично! Библиотека готова к использованию. Пришло время написать «оболочку», которая абстрагирует работу с phpMorphy. Для этого создадим еще один файл morphyus.php в корневой директории:
Пока реализовано только два метода. get_words разбивает текст на массив слов, фильтруя при этом HTML-теги и сущности типа » «. Метод lemmatize возвращает массив лемм слова, либо false, если таковых не нашлось.
Механизм ранжирования на уровне морфологии
Давайте остановимся на такой единице языка, как предложение. Наиболее важной частью предложения является основа в виде подлежащего и/или сказуемого. Чаще всего подлежащее выражается существительным, а сказуемое глаголом. Второстепенные члены в основном употребляются для уточнения смысла основы. В разных предложениях одни и те же части речи порой имеют совершенно разное значение, и наиболее точно оценить это значение в контексте текста сегодня может только человек. Однако программно оценить значение какого-либо слова все-таки можно, хоть и не так точно. При этом алгоритм ранжирования должен опираться на так называемый профиль текста, который определяется его автором. Профиль представляет из себя ассоциативный массив, ключами которого являются части речи, а значениями соответственно ранг (или вес) каждой из них. Пример профиля я покажу в заключении, а пока попробуем перевести эти размышления на язык PHP, добавив еще один метод к классу morphyus:
Индексирование содержимого сайта
Как уже говорилось выше, индексирование заметно ускоряет выполнение поискового запроса, так как поисковому движку не нужно обрабатывать контент каждый раз заново — поиск выполняется по индексу. Но что же все-таки происходит при индексировании? Если по порядку, то:
В результате получается объект следующего формата:
Пишем инициализатор и первый метод ядра поискового движка:
Теперь при добавлении или изменении данных в таблицах достаточно просто вызвать данную функцию, чтобы проиндексировать их, но это не обязательно: индексирование может быть и отложенным. Первым аргументом метода 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 и выполняет поиск. В результате выводятся найденные продукты магазина.
Заключение
В статье был описан один из вариантов реализации поиска для сайта. Это самая первая его версия, поэтому буду только рад узнать Ваши замечания, мнения и пожелания. Присоединяйтесь к моему проекту на Github: https://github.com/axilirator/firewind. В планах добавить туда еще кучу всяких возможностей, вроде кэширования поисковых запросов, подсказок при вводе поискового запроса и алгоритма побуквенного сравнения, который поможет бороться с опечатками.
Всем спасибо за внимание, ну и с днем информационной безопасности!
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.