{"id":14268,"url":"\/distributions\/14268\/click?bit=1&hash=1e3309842e8b07895e75261917827295839cd5d4d57d48f0ca524f3f535a7946","title":"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c \u0438\u0433\u0440\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e?","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"f71e1caf-7964-5525-98be-104bb436cb54"}

Как я создавал поисковик с нуля: личный опыт

Всем привет. Меня зовут Азат Юлдашев. Я учусь на первом курсе образовательного центра «Алабуга Политех» по специальности «Программирование Python». Хочу поделиться с вами опытом создания поисковика.

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

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

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

Расписав концепт проекта, я приступил к дизайну. Оформление сайта постарался сделать простым и понятным для посетителей. Дизайн всех страниц поисковика создавался в программе Figma. Дизайн мне хотелось сделать в стиле минимализм, чтобы он выглядел аккуратно и красиво. Для этого я начал изучать дизайн схожих сайтов и пришел к выводу, что главная страница должна состоять из строки поиска, названия сайта, переключателя темы и моего тега для подчеркивания авторства. Выполнить сайт решил в монохромных цветах, чтобы он не сильно бросался в глаза. Максимальную ширину ограничил 800 пикселями для того, чтобы на широких мониторах поиск не разъезжался по сторонам и находился в центре. Далее по подобию главной страницы я оформил и остальные. Упор был сделан на то, чтобы это было легко реализовать и анимировать все элементы.

Главная страница поисковика (темная и светлая темы) 

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

Мобильная версия сайта выглядит так

Затем началась самая сложная и ответственная работа по разработке. В процессе разработки возникали сложности и пришлось обучаться по ходу работы. Начал с создания сервера, затем установил библиотеки: для серверной части проекта использовались Django и Django Rest Framework, а для клиентской — React.

Cоздал проект, под которым я подразумеваю создание определенной структуры папок и автоматической установки дополнений необходимых для удобной разработки. Для создания проекта на сервере необходимо ввести команду: python manage. py startproject. А на клиенте: npx create-react-app

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

Далее, так как по задумке на моем сайте поиск осуществлялся по новостям с других сайтов, их нужно было загрузить к себе в базу данных. Для загрузки я узнал url- адреса страниц с новостями и с помощью библиотеки requests загружал их, а затем парсил с помощью библиотеки Beautiful soup 4 и заносил в базу данных через Django ORM.

Теперь осталось реализовать функцию поиска. В качестве поискового движка и базы данных для хранения поисковых индексов использовался Elasticsearch.

Как все это работает: пользователь заходит на сайт и пишет поисковый запрос, React отправляет запрос на сервер, который принимает его и формирует поисковый запрос для ElasticSearch. Далее он возвращает отсортированные результаты поиска от лучших к худшим, а также подсвечивает найденные совпадения. Во время поиска используется проверка похожих слов, в связи с этим не стоит беспокоиться, если вы ошиблись при запросе — в результатах все равно выйдет нужная вам информация.

Так выглядит открытая новость в поисковике
Результаты поиска

Больше всего проблем при разработке доставила настройка всего этого на сервере с использованием Docker, который по факту должен был упростить работу, но только усложнил ее.

К примеру, ElasticSearch никак не хотел запускаться внутри Docker-контейнера на сервере с 1 гб оперативной памяти, для этого пришлось устанавливать переменные окружения для ограничения его потребления. В данном проекте было использовано много крутых технологий, с которыми я еще не работал. Открытием для меня стало использование TypeScript, благодаря которому редактор кода автоматически дополняет код, рекомендую использовать его на всех более менее крупных проектах, так как это сильно ускорит разработку. Также новинкой для меня стало встроенное в браузер распознавание голоса, которое я использовал для голосового ввода.

Поисковик запоминает прошлые запросы для удобства пользователей
Если страница не найдена, то отображается картинка роботом и ошибкой 404 

На финальной стадии сверстанный сайт объединил с сервером и поисковик был готов.

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

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

0
16 комментариев
Написать комментарий...
RoninReilly

На кого рассчитана эта статья?

Ответить
Развернуть ветку
Александр А.

Скачал твой ценный комментарий на память.

Поясняю: молодой человек учится разработке, учится писать тексты на русском языке. У него вроде бы кое-что получается.

Что в таком случае делают приличные люди? Правильно, одобряют.

Ответить
Развернуть ветку
ondefeat

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

Идея «а давайте всякую фигню про разработку фигачить на вц» - хреновая идея. Почему автор на Хабре это не написал, например? Потому что статья такого уровня там не прокатит, наберет минусов по самые помидоры, и скорее всего вообще не выйдет из песочницы. И поэтому Хабр имеет авторитет.

Круто, что парень учится, но учиться он может на своем блоге. Для чего такой статье аудитория ВЦ? Что полезного для вц от этой статьи?

Ответить
Развернуть ветку
Рама

Просто берете, пролистываете на главной и всё. Нет, обязательно надо зайти, свою душноту излить. Эту стрелку и в обратку можно развернуть - не нравится, ищите другие ресурсы без подобного материала, подходящие именно вас.

Парнишка молодец, желаю успехов в развитии!

Ответить
Развернуть ветку
ondefeat

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

По факту, вся суть статьи сводится к "как я сделал курсовую работу на первом курсе".

Почему это должно быть нормально?

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

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

Ответить
Развернуть ветку
Александр А.

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

Статья этого парня вполне приличная, похвалить толкового новичка - так нет же, опять желчь полилась.

P.S. Репутация хабра вполне известная, и минусов у тамошнего коммьюнити предостаточно.

Ответить
Развернуть ветку
ondefeat

При чем тут желчь? Если что-то встречает позитивный отклик, этого становится больше. Вы хотите чтобы такого на VC стало больше? Чем это полезней котиков и мемасиков? Почему вы их тут не ожидаете и если вам это интересно идете в другое место?

Еще раз - парень молодец, но такой статье на VC - не место.

Если кому-то хочется потешить ЧСВ или чтобы его по головке погладили - есть другие ресурсы для новичков. В особо критичных ситуациях - психологи.

Я - не психолог и здесь не подходящий для этого ресурс, о чем я и написал.

Ответить
Развернуть ветку
Александр А.

А знаете что? Я частично с Вами соглашусь.

Скорее всего эта статья вполне профильная для VC - это еще одно продвижение, теперь это "образовательный центр XXX".

Но статья, замаскированная под статью новичка. А дебаты в комментах вполне помогают этому продвижению :)

Мы оба с Вами попались на один крючок, только наживка для нас выглядела по-разному :)

Ответить
Развернуть ветку
Акс Омолов

Почитать подсказать вот основное назначение сей статьи а вы тут свой негатив разливаете ,идите к своим душным пожалуйста))

Ответить
Развернуть ветку
Александр А.

Чувак, я передумал скачивать твой коммент :)

Ответить
Развернуть ветку
Nik Lod

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

Ответить
Развернуть ветку
Sam

Что то мне подсказывает, что студент уже превзошел преподавателя.

Ответить
Развернуть ветку
Labeling
Хочу поделиться с вами опытом создания поисковика... Здесь делался упор на алгоритм поиска.

Ожидание: о, сейчас чувак расскажет как реализовал инвертированный индекс.

Реальность: просто использовал готовое решение.

Ну окей.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Labeling

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

А если цель создать высоклассного программиста, то тут уже pip install не обойтись, он должен уметь писать свое. И написать инвертированный индекс хорошая практика для начала.

Ответить
Развернуть ветку
President of the United States

.... вот так появился не имеющий аналогов поисковик "Спутник" за 25 млрд. рублей

Ответить
Развернуть ветку
13 комментариев
Раскрывать всегда