1. Что
Привычный поиск, вроде Google, работает сугубо в прошлом. То есть любые результаты, которые вы можете увидеть - это то, что уже когда-то произошло. Кроме того, есть ещё дополнительные временные издержки на индексирование: дни или даже недели. Неплохо для исторических справок, но всегда слишком поздно для важных новостей.
![](https://habrastorage.org/getpro/habr/upload_files/e0d/471/392/e0d4713925ecf322fc14e6643ccfe013.jpg)
Есть и другой путь - перспективный поиск. Суть его в том, чтобы получить результат в будущем. Лучше всего подходит для наблюдения за СМИ и соцсцетями, поиска работы и других типов выгодных предложений.
2. Зачем
Я хочу получать новости, касающиеся моих интересов быстро, как только они появляются. Это могут быть какие-то научные открытия, срочные новости или подходящие предложения. Идея в том, что я не одинок в этом и есть другие люди с таким же желанием.
2.1. Обычный Поиск
Чтобы ознакомится с типичным сообщением, человеку обычно требуется время в диапазоне секунд или минут. Поэтому желательно, чтобы задержка доставки сообщений не превышала 1 секунду или 1 минуту в худшем случае. Это довольно далеко от того, что предлагают привычные поисковые системы (в лучшем случае часы).
![](https://habrastorage.org/getpro/habr/upload_files/c14/10d/61a/c1410d61a4a116d840a0613dc4bf32cc.png)
Более того, необходимо снова и снова повторять поиск, чтобы получить новые результаты. А это пустая трата времени. Повтор поиска всё равно не даёт гарантии, что вы что-то найдёте. Вместо этого, я хочу отправить свой поисковый запрос один раз и просто ждать, пока что-нибудь появится "само". Таким образом, реализация должна уведомлять (push) о результате тогда и только тогда, когда он появится. Без "холостых" и отвлекающих уведомлений.
2.2. Ленты Новостей
Как насчет агрегаторов и RSS-читалок? Клиентские приложения для чтения лент автоматически запрашивают обновления и могут уведомлять. Однако это не является поиском, так как не позволяет фильтровать сообщения. Единственный доступный способ фильтрации - ограничить набор источников, которым вы позволите вас отвлекать. Но тогда вы оказываетесь в ограниченном пузыре, теряя потенциально важные новости из всего остального мира. И все ещё нет никакой гарантии, что выбранный источник не начнёт присылать что-нибудь непотребное. Фильтрация на стороне клиента здесь не поможет. Просто потому что ваш мобильный телефон не выдержит потока сообщений со всего интернета, который необходимо профильтровать. Таким образом, ленты новостей - это всегда либо ограниченный пузырь, либо необходимость отвлекаться и прокручивать тонны спама. Третьего не дано.
Следовательно, эффективный перспективный поиск должен определять всех заинтересованных получателей по каждому входящему сообщению. После этого сообщение должно быть доставлено (push) каждому найденному получателю. Для уведомления уже существуют различные системы мгновенных сообщений. Поэтому я художник я так вижу реализацию как интеграцию с существующей системой.
2.3. Существующие Решения
Лет 14 назад у Google был "Real-Time Search", напоминающий перспективный поиск. Однако он просуществовал недолго. Также у Google есть сервис "Alerts", однако он основан на ретроспективном поиске, имеет большие задержки результатов и вообще, похоже, что не совсем работает. Таким образом, существующие решения мне неизвестны.
3. Как
Основываясь на требованиях, изложенных выше, я реализовал сервис перспективного поиска "Awakari". Он бесплатный, поэтому я призываю вас попробовать в надежде получить отзывы.
![](https://habrastorage.org/getpro/habr/upload_files/069/575/12b/06957512b24ffb1bbd1537918ddc1217.png)
Когда вы посетите сайт awakari.com, то первое, что вы увидите - это поле для поискового запроса. Используйте это для тестового поиска по ключевым словам без регистрации и смс. Такой поиск будет ограничен по времени 1-м часом. Когда этого станет недостаточно, нужно будет войти.
На данный момент вход возможен с помощью аккаунта в Телеграм. Интеграция с Телеграм выбрана по той причине, что она решает сразу две задачи: идентификация пользователей и доставка сообщений. Сам по себе Авакари не использует никаких персональных данных пользователя, это нужно только чтобы различать пользователей. Я думаю, что я могу это доказать, так как эта часть системы является open source. В будущем доставка также может быть в формате RSS, если на это будет спрос. Также возможны и другие варианты.
После входа вы можете:
создавать и использовать до 10 одновременных поисковых запросов
публиковать до 100 сообщений в день
добавлять собственные источники сообщений в общую коллекцию.
Источники, которые вы добавите будут расходовать ваш ежедневный запас сообщений. Вы можете запросить увеличение этого запаса либо перевод источника на собственный выделенный "баланс". Так как сервис бесплатный, донаты тоже приветствуются. Это поможет выдерживать нагрузку и содержать этот колхоз сервис в будущем.
3.1. Источники
На момент написания статьи добавлено около 500 различных источников сообщений, котороые вместе производят около 40 тысяч сообщений в день.
![Страница списка источников типа "ленты новостей" Страница списка источников типа "ленты новостей"](https://habrastorage.org/getpro/habr/upload_files/2e2/04d/2bc/2e204d2bcb029eb38b0c1267536934b6.png)
Авакари поддерживает различные типы источников:
Ленты новостей:
Семантическая разметка schema.org: JSON-LD или Microdata
Прочая семантическая разметка: HTML5, Microformats.
Публичные каналы Телеграм
Fediverse (ActivityPub): Mastodon, Hubzilla, Friendica (остальное ещё не тестировано).
Сайты, изменения в которых проверяются ежедневно.
Сообщения отправленные пользователями из PWA или Телеграма.
Для лент новостей Авакари также поддерживает протокол WebSub. Если источник его не поддерживает, Авакари периодически запрашивает обновления и собирает статистику частоты обновления, которую потом использует для автоматического планирования запросов. Для Fediverse- и Телеграм-источников сообщения всегда приходят в режиме реального времени (push).
3.2. Текстовый Поиск
Авакари извлекает текст сообщений и выполняет текстовый поиск всех подходящих запросов. При этом используется стемминг для приведения слов в разных формах к одной форме. Сейчас стемминг поддерживается для английского языка, но в будущем это можно будет расширить и на другие. Опция точного совпадения текста также доступна.
Рекомендуется использовать слова длиной более 3-х символов. Когда вы указываете несколько слов в запросе, поиск будет находить всё, что содержит любое из слов. То есть запрос "смешной котик" будет находить все сообщения со словом "смешной" или "котик" или "смешной котик". Здесь есть различие по сравнению с тем, как работает обычный поиск.
3.3. Структурный Поиск
Следующая важная особенность - структурный поиск по атрибутам метаданных сообщений. Сообщения содержат полезные атрибуты, такие как:
автор
источник
категории
координаты
цена
язык
и многие другие. Вы можете использовать это в продвинутых запросах для дополнительной фильтрации. В текстовых условиях поиска имя атрибута можно не указывать, тогда поиск будет происходить по значениям всех атрибутов.
![Интерфейс подсказывает, какие имена атрибутов встречаются у сообщений. Интерфейс подсказывает, какие имена атрибутов встречаются у сообщений.](https://habrastorage.org/getpro/habr/upload_files/f22/e64/efa/f22e64efa6ecfffa14d48559718a7e2a.png)
Обратите внимание на переключатель "Not" на изображении выше - он позволяет делать условие исключающим, что полезно если вы хотите что-либо исключить из результатов поиска. Исключающие условия не могут быть использованы в одиночку, а только в группе с другими неисключающими условиями.
3.4. Численный Поиск
Так как некоторые атрибуты содержат численные значения, есть и численные условия. Вы можете выбрать атрибут цены, указать оператор ("<", "=", "≥", ...) и значение, например 42. Численные условия требуют обязательного указания имени атрибута.
![Пример группы условий, содержащей также численное условие. Пример группы условий, содержащей также численное условие.](https://habrastorage.org/getpro/habr/upload_files/775/bd0/3ca/775bd03cadd44c26811849153a706d45.png)
3.5. Группы Условий
Наконец, условия можно объединять в группы с указанием логики: "And", "Or" или "Xor". Вложенные условия могут также быть группами.
Вместе все эти особенности позволяют гибко фильтровать сообщения. Экспериментируйте с различными комбинациями условий. Если получаемые результаты не соответствуют ожиданиям, всегда можно просто изменить условия запроса.
3.6. Чтение Результатов
После того, как вы создали запрос, к вам в Телеграм постучится @AwakariBot и начнет присылать результаты. Если у вас несколько разных запросов, то рекомендуется использовать отдельную группу для каждого запроса, чтобы результаты не смешивались. Чтобы это сделать, создайте группу, добавьте в неё @AwakariBot и используйте команду бота /start
. Эта команда всегда выводит список ваших запросов для выбора. У каждого запроса может быть также пиктограмма, которая указывает, привязан ли данный запрос к текущему чату или другому. Таким образом, вы можете привязывать запросы к разным чатам.
![Доставленное сообщение содержит также атрибуты метаданных, например "source", что можно использовать для уточнения запросов. Доставленное сообщение содержит также атрибуты метаданных, например "source", что можно использовать для уточнения запросов.](https://habrastorage.org/getpro/habr/upload_files/884/6e7/f36/8846e7f36f76b31ff07656ca81d0fa96.jpg)
Главная функция бота - доставка пиццы результатов поиска. Также бот может быть использован, чтобы опубликовать сообщение в Авакари прямо из Телеграм или для создания простого текстового запроса. Если вы - админ публичного канала и хотите, чтобы посты также публиковались в Авакари, добавляйте бота в канал (убирая все админские права у него).
На сегодня на этом всё, спасибо за внимание.