Периодически стал замечать, что не могу найти нужную статью, которую видел раньше.
Вроде бы все просто — по запомнившимся сведениям статью можно легко найти. Но нет. Поиск в Google часто ничего не дает, т.к. я помню только обрывки содержимого, и поисковая выдача содержит много шума.
Актуально это и на работе. Для хранения и обмена полезными ссылками на разные Github проекты, статьи, сервисы раньше мы использовали Skype, но сейчас стали использовать для этих целей Yammer. Оба этих способа имеют свои недостатки. Основной недостаток Skype для обмена ссылками — это сложность поиска по истории. Проблема Yammer — он не индексирует текст статьи, а только сниппет. Ни один из них не имеет возможности автоматической категоризации.
В свободное время я написал приложение, специально заточенное для поиска статей. Его возможности:
- добавление статьи одной кнопкой из браузера
- автоматическая категоризация
- русская и английская морфология
- просмотр текста статьи
- операторы поискового запроса
Зарегистрированному пользователю доступны 3 ленты: все статьи (all), персональная подборка (selected), добавленные статьи (stars). Ссылка на редактирование персональной ленты появится в меню после регистрации. В том же выпадающем списке справа от строки поиска можно задать фильтр по категории.
Основные технологии, используемые для разработки: Ruby on Rails, Sidekiq, Elasticsearch, PosrgeSQL.
Для реализации качественного поиска я использовал плагин морфологии и gem readability, извлекающий важный контент со станицы первоисточника.
Определение категории осуществляется следующим образом. Статьи из категории “веб-разработка” содержат термины: html, html5, css, css3, javascript, js и другие. Соответственно, что бы найти статьи по веб-разработки нужно выполнить запрос со списком этих ключевых слов. В эластике есть 2 подходящих типа запросов: query string и simple query string, я выбрал последний, т.к. он никогда не бросит исключение и отбросит невалидную часть запроса.
javascript* jQuery coffeescript
ajax
bootstrap foundation
backbone* angularjs
css*
less sass scss
adaptive responsive
html* haml DOM
frontend "front-end"
web
"image placeholder"
mozilla firefox chrome opera
codepen
кроссбраузерный
Таким образом можно найти документы, входящие в категорию. Тут возникает обратный вопрос — как найти категории в которые входит тот или иной документ? Elasticsearch позволяет поменять документы и запросы между собой. Категория — это сохраненный запрос и теперь можно спросить какие из категорий подходят для заданной статьи. Это именно тип запроса, и если добавить новую статью или категорию изменения вступят в силу сразу же.
Я долго думал, как просто и удобно реализовать добавление новых категорий. Хочется иметь удобный редактор запросов, возможность модерации, а так же оценить вклад каждого пользователя. Было много разных мыслей, и в итоге я остановился на репозитории на гитхабе. Гитхаб позволяет сделать форк репозитория и редактировать категории онлайн. Для проверки корректности файла категорий есть rspec тест, который автоматически запускается на travis-ci при отправки пулл-реквеста.
Автор: mkuzmin