Недавно я написал пост, в котором поделился своим Telegram-ботом для поиска торрентов с рутрекера. На удивление оказалось, что сотням людей это оказалось нужно и полезно, что вдохновило меня на дальнейшую работу над этим небольшим проектом и поддержку пользователей.
В этой статье я хочу рассказать о некоторых технических деталях реализации, о которых меня неоднократно спрашивали и в комментариях, и в личных сообщениях через /f.
Что нужно, чтобы найти торрент?
Разумеется, сначала нужен ваш поисковый запрос. Его вы пишите просто как сообщение боту, например, вот так:
Бот получает ваше сообщение и делает с ним несколько вещей. Во-первых, из сообщения удаляются некоторые специальные символы (например, знаки пунктуации и всякие $*^@). Во-вторых, запрос разбивается на отдельные слова.
На этом этапе может обнаружиться, что ваш запрос пустой. Тогда вам отправляется сообщение, указывающее на невозможность поиска.
Далее нужно собственно какое-то хранилище знаний о существующих торрентах, где можно этот самый поиск производить. В нашем случае это собственная база данных, содержащая относительно актуальную информацию о состоянии раздач на рутрекере. О том, почему было выбрано именно такое решение, я расскажу ниже. Пока что отметим, что информации о раздачах много, а полезной для нас среди неё маловато. Например, когда пользователь ищет что-то, как правило это часть названия раздачи (этому способствует бушевавшая в своё время на рутрекере модерация раздач, требовавшая строгих правил оформления), название раздела, имя файлов.
База для поиска устроена крайне примитивно: у нас есть keyword - ключевое слово, по которому будем искать соответствие, ну и адрес раздачи, которой этот keyword соответствует. Получается, что построив индекс базы данных по полю keyword, мы сможем быстро находить вхождения этого слова в базе. Сами keyword'ы мы будем брать из названия раздачи, названия раздела, и некоторых файлов из раздачи.
Теперь осталось соединить ваш запрос и базу. Для этого ещё нужно проследить, чтобы наши keyword были такого же вида, как и слова из запроса после предобработки (см. выше). Например, если мы удаляем какие-то спецсимволы из слов поискового запроса, они также должны удаляться из keyword, иначе чуда не произойдёт.
Ну и конечно же, базу желательно взять побыстрее, т.к. всем хочется, чтобы их запросы обрабатывались как можно быстрее. Поэтому выбор был сделан в пользу ClickHouse. Выглядит поиск подходящих под ваш набор ключевых слов топиков примерно вот так:
Помимо самого факта вхождений, здесь проверяется, чтобы все ключевые слова из запроса были найдены для данной раздачи (topic_id). Т.о. если хотя бы одного слова из вашего запроса в индексе не нашлось, такая раздача не будет вам показана.
Немного статистики: всего уникальных ключевых слов в индексе на сегодня содержится 1,144,565 - что не так много.
Описанная выше схема является довольно примитивной для того, чтобы называться полноценной системой поиска, однако она рабочая. Теперь ответы на другие вопросы, которые могли у вас возникнуть, либо уже были заданы в комментариях.
Почему нельзя просто использовать поиск рутрекера?
Можно, и более того: тогда вы точно найдёте то, что искали бы на рутрекере.
К сожалению, плюсы использования поисковой системы рутрекера на этом заканчиваются.
Обратите внимание, что на рутрекере используется приведение к некоторой базовой морфологической форме, поэтому черная = черный, весны = весна. Из-за этого в результатах могут появиться такие странные находки. У нас вы получите на тот же запрос такое:
Здесь же хочется отметить, что в отличие от поисковой системы рутрекера, на мою можно повлиять, оставляя пожелания и комментарии, которые помогут мне в дальнейшем развитии проекта и сделать поиск лучше.
Вторая и ещё более важна причина использовать свой поиск: независимость от состояния форума. Форум может быть отключён для профилактических работ именно тогда, когда вам нужно что-то поискать, либо может быть вообще удалён, не выдержать DDoS и упасть, да много по каким причинам быть недоступен. А сиды и magnet-ссылки работают и без форума, поэтому найти нужное будет возможно даже в условиях недоступности рутрекера. Ну а скачать найденное получится, конечно, только при наличии сидов.
Третья причина не использовать поиск форума заключается в том, что нужно будет отправлять и получать поисковые запросы на форум. Так как у форума нет API для поисковых запросов (напишите, если нашли, у меня не получилось), то придётся написать свою. Но всё станет медленнее, потому что вам придётся что-то отправлять и ждать ответа от другого ресурса в сети. Обратите внимание, насколько быстро вы получаете сообщение от бота! Даже в моменты, когда первый пост обрёл популярность и в первые сутки случится пикабу-эффект, пиковая нагрузка была далеко до предельной.
Откуда база данных для поиска, и как её самому сделать?
Здесь тоже никаких секретов быть не может, просто берём и парсим весь рутрекер =)
Для того, чтобы не положить форум, одна итерация обновления базы и индекса растягивается от пары до шести часов. А, ну ещё можно использовать "базы", выложенные на самом рутрекере (только обновляются они раз в месяц в лучшем случае).
Если хотите потренироваться, а парсингом не хочется заниматься - можно взять их. К слову, будьте готовы, что там вас в качестве базы будет ждать просто 3-х гиговый XML-файл. У нас же это выглядит как-то так (posts это база вообще всех постов рутрекера и не участвует пока что в процессе):
Обратите внимание, что места на жестком диске для подобной реализации вам понадобится менее 1 Гб, что делает проект относительно дешевым для размещения на каком-нибудь хостинге.
Спасибо, что дочитали до этого места! Я очень рад, что людям стал интересен и полезен этот проект. С момента первого поста на пикабу я внёс несколько ощутимых изменений в бота, подсказанных пользователями. Приглашаю всех, кому это актуально, воспользоваться моим ботом:
P.S.: Да, всё ещё "test".
Читать далее...
В этой статье я хочу рассказать о некоторых технических деталях реализации, о которых меня неоднократно спрашивали и в комментариях, и в личных сообщениях через /f.
Что нужно, чтобы найти торрент?
Разумеется, сначала нужен ваш поисковый запрос. Его вы пишите просто как сообщение боту, например, вот так:

Бот получает ваше сообщение и делает с ним несколько вещей. Во-первых, из сообщения удаляются некоторые специальные символы (например, знаки пунктуации и всякие $*^@). Во-вторых, запрос разбивается на отдельные слова.
На этом этапе может обнаружиться, что ваш запрос пустой. Тогда вам отправляется сообщение, указывающее на невозможность поиска.
Далее нужно собственно какое-то хранилище знаний о существующих торрентах, где можно этот самый поиск производить. В нашем случае это собственная база данных, содержащая относительно актуальную информацию о состоянии раздач на рутрекере. О том, почему было выбрано именно такое решение, я расскажу ниже. Пока что отметим, что информации о раздачах много, а полезной для нас среди неё маловато. Например, когда пользователь ищет что-то, как правило это часть названия раздачи (этому способствует бушевавшая в своё время на рутрекере модерация раздач, требовавшая строгих правил оформления), название раздела, имя файлов.
База для поиска устроена крайне примитивно: у нас есть keyword - ключевое слово, по которому будем искать соответствие, ну и адрес раздачи, которой этот keyword соответствует. Получается, что построив индекс базы данных по полю keyword, мы сможем быстро находить вхождения этого слова в базе. Сами keyword'ы мы будем брать из названия раздачи, названия раздела, и некоторых файлов из раздачи.
Теперь осталось соединить ваш запрос и базу. Для этого ещё нужно проследить, чтобы наши keyword были такого же вида, как и слова из запроса после предобработки (см. выше). Например, если мы удаляем какие-то спецсимволы из слов поискового запроса, они также должны удаляться из keyword, иначе чуда не произойдёт.
Ну и конечно же, базу желательно взять побыстрее, т.к. всем хочется, чтобы их запросы обрабатывались как можно быстрее. Поэтому выбор был сделан в пользу ClickHouse. Выглядит поиск подходящих под ваш набор ключевых слов топиков примерно вот так:

Помимо самого факта вхождений, здесь проверяется, чтобы все ключевые слова из запроса были найдены для данной раздачи (topic_id). Т.о. если хотя бы одного слова из вашего запроса в индексе не нашлось, такая раздача не будет вам показана.
Немного статистики: всего уникальных ключевых слов в индексе на сегодня содержится 1,144,565 - что не так много.
Описанная выше схема является довольно примитивной для того, чтобы называться полноценной системой поиска, однако она рабочая. Теперь ответы на другие вопросы, которые могли у вас возникнуть, либо уже были заданы в комментариях.
Почему нельзя просто использовать поиск рутрекера?
Можно, и более того: тогда вы точно найдёте то, что искали бы на рутрекере.

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

Здесь же хочется отметить, что в отличие от поисковой системы рутрекера, на мою можно повлиять, оставляя пожелания и комментарии, которые помогут мне в дальнейшем развитии проекта и сделать поиск лучше.
Вторая и ещё более важна причина использовать свой поиск: независимость от состояния форума. Форум может быть отключён для профилактических работ именно тогда, когда вам нужно что-то поискать, либо может быть вообще удалён, не выдержать DDoS и упасть, да много по каким причинам быть недоступен. А сиды и magnet-ссылки работают и без форума, поэтому найти нужное будет возможно даже в условиях недоступности рутрекера. Ну а скачать найденное получится, конечно, только при наличии сидов.
Третья причина не использовать поиск форума заключается в том, что нужно будет отправлять и получать поисковые запросы на форум. Так как у форума нет API для поисковых запросов (напишите, если нашли, у меня не получилось), то придётся написать свою. Но всё станет медленнее, потому что вам придётся что-то отправлять и ждать ответа от другого ресурса в сети. Обратите внимание, насколько быстро вы получаете сообщение от бота! Даже в моменты, когда первый пост обрёл популярность и в первые сутки случится пикабу-эффект, пиковая нагрузка была далеко до предельной.
Откуда база данных для поиска, и как её самому сделать?
Здесь тоже никаких секретов быть не может, просто берём и парсим весь рутрекер =)
Для того, чтобы не положить форум, одна итерация обновления базы и индекса растягивается от пары до шести часов. А, ну ещё можно использовать "базы", выложенные на самом рутрекере (только обновляются они раз в месяц в лучшем случае).
Если хотите потренироваться, а парсингом не хочется заниматься - можно взять их. К слову, будьте готовы, что там вас в качестве базы будет ждать просто 3-х гиговый XML-файл. У нас же это выглядит как-то так (posts это база вообще всех постов рутрекера и не участвует пока что в процессе):

Обратите внимание, что места на жестком диске для подобной реализации вам понадобится менее 1 Гб, что делает проект относительно дешевым для размещения на каком-нибудь хостинге.
Спасибо, что дочитали до этого места! Я очень рад, что людям стал интересен и полезен этот проект. С момента первого поста на пикабу я внёс несколько ощутимых изменений в бота, подсказанных пользователями. Приглашаю всех, кому это актуально, воспользоваться моим ботом:
P.S.: Да, всё ещё "test".

Читать далее...