#3. Особенности поиска в боте и на сайте

11-03-2024

UPD: справедливо на момент написания, спустя пару лет всё стало немного сложнее.

Ищут пожарные, ищет милиция,
Ищут фотографы в нашей столице,
Ищут давно, но не могут найти
Парня какого-то лет двадцати.

Самуил Маршак


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

Поиск в боте vs поиск на сайте

В отличие от Telegram-бота, на сайте поиск представляет собой упрощенную реализацию, и лишен многих опций, которые вам доступны в боте. Кстати, все возможности бота поиска торрентов описаны в достаточно длинном (но не достаточно подробном) руководстве. Я крайне рекомендую прочитать его полностью (хотя бы оглавление), если вы этого ещё не делали. Так вы будете представлять, какими возможностями на данный момент обладает проект. А ещё ответы на вопросы "почему бы не взять эластик/solr/что-то ещё".

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

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

Так мы приходим к первому отличию от многих поисковых систем, которые нас сегодня окружают:

1. В моем проекте не используются (пока что?) продвинутые системы анализа естественного языка.

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

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

Начнём с того, что теми самыми документами/страницами в нашем случае являются страницы с трекеров, содержащие magnet-ссылки и раздачи с .torrent-файлами. Их мы и будем, что называется, "индексировать": разбивать на слова и помещать в базу данных, где хранятся связи.

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

Теперь понятно, что по запросу скачать гарри поттера в высоком качестве бесплатно может легко не оказаться в нужном документе (страницы с раздачей фильма из серии «Гарри Потер») слов скачать (потому что на трекерах всё, для того, чтобы скачать, это слово не принесло бы информации), бесплатно, а также часть в высоком качестве скорее всего слишком абстрактна. В каком именно качестве? Обычно пишут конкретный формат или битрейт, или иные параметры (HD, mp3, flac и подобное). Таким образом, из-за того, что много слов из-за запроса не подошло к казалось бы подходящей раздаче с названием Гарри Потер и узник Азкабана UHD 4K AVI, она не будет отображаться в результатах поиска.

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

2. Лемматизация — используется (частично).

Однако для сносного поиска ещё недостаточно просто положить все слова «как есть» в индекс. Их по-хорошему надо привести к одному регистру (чтобы не возникало трудностей с разделением/опознанием в запросах Гарри Поттер, гарри поттер или даже ГаРрИ ПоТтЕр. Для нас это всё одно и тоже: гарри поттер (нижний регистр).

Кроме одного регистра, у нас есть разные словоформы. Наверное, неплохо бы учитывать, что аудиокниги и аудиокнига это тоже одно и то же: аудиокнига. Подобные приведения всех слов к нормальной словоформе для индексации называется «лемматизация». И она таки есть в поисковой системе проекта. Но в строго определенном месте.

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

Таким образом было существенно повышено качество поиска и «процент попаданий» (успешных запросов), когда люди ищут к примеру гарри потер сериал.

3. Точность, точные и неточные совпадения.

В той самой базовой модели мы имеем дело с набором слов из документа (страницы), их порядок нам не важен. Так бывает далеко не всегда, и в боте есть способ (написав в начале сообщения /s) заставить искать с учётом порядка слов. На сайте такой опции пока что нет.

Другой смысл этого понятия — сколько слов из запроса подошло к индексу раздачи. Хорошо, если все. Тогда мы считаем, что совпадение с запросом полное. Иначе вы в боте увидите строку «осторожно, неточное совпадение». Это означает, что были найдены только такие раздачи, которые лишь частично подходят к запросу. На сайте вы не увидите такого предупреждения, зато увидите некоторые баги (мы работаем над этим).

4. INVALID HASH, ошибка, ошибка, неверная ссылка

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



Рекомендации по использованию поиска

которые следуют из вышеописанного:

Я постарался не вдаваться в конкретные технические подробности реализации, цель данного материала — дать базовое представление о том, почему всё работает именно так, как работает. Периодически задают вопросы, а почему бы не использовать какую-нибудь систему полнотекстового поиска типа Elasticsearch или Solr, или ещё что-то такое. Отвечаю:

Best regards,
Captain Freedomist.