110

Как устроен поиск в моём Telegram-боте для поиска торрентов

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


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

Что нужно, чтобы найти торрент?


Разумеется, сначала нужен ваш поисковый запрос. Его вы пишите просто как сообщение боту, например, вот так:

Как устроен поиск в моём Telegram-боте для поиска торрентов IT, Telegram, Интернет, Поиск, Программирование, Telegram бот, Бот, Торрент, Блокировка, Роскомнадзор, Rutracker, Длиннопост

Бот получает ваше сообщение и делает с ним несколько вещей. Во-первых, из сообщения удаляются некоторые специальные символы (например, знаки пунктуации и всякие $*^@). Во-вторых, запрос разбивается на отдельные слова.


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

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


База для поиска устроена крайне примитивно: у нас есть keyword - ключевое слово, по которому будем искать соответствие, ну и адрес раздачи, которой этот keyword соответствует. Получается, что построив индекс базы данных по полю keyword, мы сможем быстро находить вхождения этого слова в базе. Сами keyword'ы мы будем брать из названия раздачи, названия раздела, и некоторых файлов из раздачи.

Теперь осталось соединить ваш запрос и базу. Для этого ещё нужно проследить, чтобы наши keyword были такого же вида, как и слова из запроса после предобработки (см. выше). Например, если мы удаляем какие-то спецсимволы из слов поискового запроса, они также должны удаляться из keyword, иначе чуда не произойдёт.


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

Как устроен поиск в моём Telegram-боте для поиска торрентов IT, Telegram, Интернет, Поиск, Программирование, Telegram бот, Бот, Торрент, Блокировка, Роскомнадзор, Rutracker, Длиннопост

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


Немного статистики: всего уникальных ключевых слов в индексе на сегодня содержится 1,144,565 - что не так много.


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



Почему нельзя просто использовать поиск рутрекера?


Можно, и более того: тогда вы точно найдёте то, что искали бы на рутрекере.

Как устроен поиск в моём Telegram-боте для поиска торрентов IT, Telegram, Интернет, Поиск, Программирование, Telegram бот, Бот, Торрент, Блокировка, Роскомнадзор, Rutracker, Длиннопост

К сожалению, плюсы использования поисковой системы рутрекера на этом заканчиваются.


Обратите внимание, что на рутрекере используется приведение к некоторой базовой морфологической форме, поэтому черная = черный, весны = весна. Из-за этого в результатах могут появиться такие странные находки. У нас вы получите на тот же запрос такое:

Как устроен поиск в моём Telegram-боте для поиска торрентов IT, Telegram, Интернет, Поиск, Программирование, Telegram бот, Бот, Торрент, Блокировка, Роскомнадзор, Rutracker, Длиннопост

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

Вторая и ещё более важна причина использовать свой поиск: независимость от состояния форума. Форум может быть отключён для профилактических работ именно тогда, когда вам нужно что-то поискать, либо может быть вообще удалён, не выдержать DDoS и упасть, да много по каким причинам быть недоступен. А сиды и magnet-ссылки работают и без форума, поэтому найти нужное будет возможно даже в условиях недоступности рутрекера. Ну а скачать найденное получится, конечно, только при наличии сидов.


Третья причина не использовать поиск форума заключается в том, что нужно будет отправлять и получать поисковые запросы на форум. Так как у форума нет API для поисковых запросов (напишите, если нашли, у меня не получилось), то придётся написать свою. Но всё станет медленнее, потому что вам придётся что-то отправлять и ждать ответа от другого ресурса в сети. Обратите внимание, насколько быстро вы получаете сообщение от бота! Даже в моменты, когда первый пост обрёл популярность и в первые сутки случится пикабу-эффект, пиковая нагрузка была далеко до предельной.



Откуда база данных для поиска, и как её самому сделать?


Здесь тоже никаких секретов быть не может, просто берём и парсим весь рутрекер =)
Для того, чтобы не положить форум, одна итерация обновления базы и индекса растягивается от пары до шести часов. А, ну ещё можно использовать "базы", выложенные на самом рутрекере (только обновляются они раз в месяц в лучшем случае).

Если хотите потренироваться, а парсингом не хочется заниматься - можно взять их. К слову, будьте готовы, что там вас в качестве базы будет ждать просто 3-х гиговый XML-файл. У нас же это выглядит как-то так (posts это база вообще всех постов рутрекера и не участвует пока что в процессе):

Как устроен поиск в моём Telegram-боте для поиска торрентов IT, Telegram, Интернет, Поиск, Программирование, Telegram бот, Бот, Торрент, Блокировка, Роскомнадзор, Rutracker, Длиннопост

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


Спасибо, что дочитали до этого места! Я очень рад, что людям стал интересен и полезен этот проект. С момента первого поста на пикабу я внёс несколько ощутимых изменений в бота, подсказанных пользователями. Приглашаю всех, кому это актуально, воспользоваться моим ботом:

@rutracker_org_test_bot

P.S.: Да, всё ещё "test".

Как устроен поиск в моём Telegram-боте для поиска торрентов IT, Telegram, Интернет, Поиск, Программирование, Telegram бот, Бот, Торрент, Блокировка, Роскомнадзор, Rutracker, Длиннопост

ИТ-проекты пикабушников

179 постов2.7K подписчиков

Добавить пост

Правила сообщества

0. Запрещены посты вне тематики сообщества

1. Уважайте труд людей, пишите только конструктивную критику,

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

Подробнее