Умные закладки на основе Elasticsearch

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

    Актуально это и на работе. Для хранения и обмена полезными ссылками на разные Github проекты, статьи, сервисы раньше мы использовали Skype, но сейчас стали использовать для этих целей Yammer. Оба этих способа имеют свои недостатки. Основной недостаток Skype для обмена ссылками — это сложность поиска по истории. Проблема Yammer — он не индексирует текст статьи, а только сниппет. Ни один из них не имеет возможности автоматической категоризации.

    В свободное время я написал приложение, специально заточенное для поиска статей. Его возможности:
    • добавление статьи одной кнопкой из браузера
    • автоматическая категоризация
    • русская и английская морфология
    • просмотр текста статьи
    • операторы поискового запроса


    Зарегистрированному пользователю доступны 3 ленты: все статьи (all), персональная подборка (selected), добавленные статьи (stars). Ссылка на редактирование персональной ленты появится в меню после регистрации. В том же выпадающем списке справа от строки поиска можно задать фильтр по категории.

    Основные технологии, используемые для разработки: Ruby on Rails, Sidekiq, Elasticsearch, PostgeSQL.

    Для реализации качественного поиска я использовал плагин морфологии и 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 при отправки пулл-реквеста.

    Percolator.io
    Компания

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 12

      0
      Кстати, очень похоже на приложение, которое пишу и я, только это Google Chrome плагин, чтобы сохранять ссылки, но оно тоже с недавнего времени парсит текст и тоже использует gem readability, правда для поиска я думаю буду Solr использовать, потому как Sunspot мне привычне.

      Статьи из категории “веб-разработка” содержат термины: html, html5, css, css3, javascript, js и другие.

      Вопрос, а тэги из разобранного текста статьи вы как находите?
        0
        Эластик позволяет поменять запросы и документы местами. Т.е. можно спросить: какие из сохраненных запросов найдут заданный документ.
        Думаю, официальная документация лучше меня объяснит)
        0
        похоже это действительно «тренд» в данный момент времени, тоже давольно похоже на приложение которое пишу я, и использую для поиска использовать sphinxsearch. А для непосредственно самого приложения AngularJS.

        У меня вопрос такой: а вы теги для кажого юзера персонифицируете?
          0
          Категории общие для всех. Сейчас персонализация — только лента selected. Пользователь указывает какие категории он хочет видеть и какие точно не хочет. Ссылка на форму будет доступна в верхнем меню после регистрации.
          +3
          mkuzmin, MpaK999, qwertmax мож вы объединитесь и напишите достойный сервис?

          Например хотелось бы:
          — Фильтровать статьи по тегам, категориям, языку и другим параметрам одновременно и для этого фильтра создавался бы rss канал.
          — С популярных сайтов, типа хабра, к статьям бы не мешало добавить рейтинг (на основе звездочек и просмотров), чтобы можно было в фильтрах отсеивать статьи по этому параметру
          — Хотелось бы чтобы комментарии к статьям тоже выгружались
          — Если статью обновили или к статье добавились комментарии, то сервис это должен отслеживать.
            0
            обновил сове ТЗ, огромное спасибо за фидбэк.
              +2
              Ну вот ещё основные эпики:
              — В идеале хотелось бы сервис, который мог бы по требованию предоставлять выжимку статей по заданным критериям
              — Базу статей наполняют пользователи, добавляя их в закладки через приложение в браузере.
              — У статей должен быть рейтинг (на основе количества добавлений в закладки, количество просмотров и с популярных сайтов это рейтинг, количество комментариев, количество добавлений в избранное и количество просмотров — всё это должно формировать рейтинг статьи)
              — Браузерное приложение при установке, могло бы копировать существующие закладки в облако.
              — Сервис должен угадывать предпочтения, например, «О, вы интересуетесь политикой и событиями на международной арене, не хотели бы вы посмотреть рекомендованные вам статьи на тему экономических последствий в связи с прошедшими событиями» или «Мы знаем, что вам нравится AngularJS и мы приготовили для вас подборку классных статей про UI/UX»
              — Пользователь должен не только хранить свои закладки на этом сервисе, а формировать свою экосистему получения новой информации на основе своих предпочтений.
                +1
                спасибо за ответ, я буду иметь это ввиду

                rss: достаточно простая фича и я думаю скоро ее добавить
                фильтрация по языку: на самом деле я уже сейчас знаю вероятные языки статей, просто не сделал фильтр, т.к. сервис пока буду продвигать только в рунете

                по поводу рейтинга:
                на самом деле уже сейчас используется рейтинг wot)
                он нужен что бы отсечь в публичных лентах нежелателный контент(порно, вирусы и т.п.)
            +3
            Я для этого использую evernote
              +1
              в evernote есть возможность читать закладки других пользователей и формировать персональную ленту?
                +2
                Есть совместные блокноты и rss, дальше пляшем как хотим
              0
              Проскакивал уже похожий сервис на хабре raindrop.io

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое