Прикручиваем мощный поисковик Solr к своей RSS-читалке

Apache Solr — свободная поисковая платформа высочайшего качества. Чтобы не тратить время на нахваливание, перечислю конторы, использующие Solr: DuckDuckGo, Adobe, Instagram, Internet Archive, Bloomberg и так далее. Я и подумал, а что если взять всю эту мощь и прикрутить к своей скромной RSS-читалке, о которой я писал ранее? Приделать к велосипеду колеса от Белаза, так сказать...

Apache Solr Logo

Делается это не просто, а очень просто: скачиваем zip-архив, распаковываем и запускаем скрипт. Всё — поисковая платформа готова индексировать и искать. Я устанавливал самую свежую версию — 5.0.0. Взять ее можно тут.

Распаковав, переходим в директорию bin и сразу запускаем:

./solr start

Запускается Jetty — оупенсорсный контейнер сервлетов со встроенным Web-сервером. Если смысл этой строки вы не поняли, то скажу проще: вам не надо поднимать и настраивать Apache, все уже работает. Открываем браузер и переходим по адресу:

http://localhost:8983/solr

Наслаждаемся красивой, но совершенно бесполезной админкой. Даже правильнее сказать вредной. Я несколько раз пытался создать через нее индекс и каждый раз получал сообщение об ошибке. Из-за этого вебгуя я раза 3 откладывал знакомство с этим замечательным программным продуктом.

Приятнейшей особенностью Solr является возможность создавать любое количество индексов и удобно между ними переключаться. Например, в одной базе у вас RSS-ленты, в другой сохраненные web-страницы, в третьей еще что-нибудь. Например, я засунул из любопытства все содержимое раздела. Проиндексировал /. Думал, что Solr умрет в страшных муках, но не тут-то было. Дело в том, что Apache Solr включаем в себя другой прекраснейший проект — Apache Tika. Тика умеет определять тип файла и извлекать метаданные. Таким образом, вы можете добавлять в индекс и plain text, и pdf, и html, и xml, и офисные форматы. Что угодно, лишь бы внутри документа был хоть какой-нибудь текст. Так что, если хотите классный поиск по файлам, выпиливайте из своей ненаглядной Убуки линзы и ставьте Solr. И поиск мгновенный, и алчным коммерсантам запросы не сливает, и дилды из Амазона к результатам поиска по локальному диску не подмешивает.

Итак, создадим отдельный индекс для RSS лент и что-нибудь в него засунем. Закрывайте web-админку и пишите в терминале:

./solr create -c feeds

Отдельная поисковая база в терминологии Solr зовется «core» (ядро). Вас поздравят с созданием ядра feeds и можно переходить к индексации.

Еще одной приятной особенностью Solr является очень гибкий API. Он реализован в виде HTTP-запросов вида http://localhost:8983/solr/[название базы/[команда]. Это позволяет напрямую работать с Solr из любого более-менее приличного языка программирования. Но никто не мешает установить т.н. обертку и повысить комфортность работы. Я использую Ruby, поэтому я использовал обертку RSolr:

gem install rsolr --no-ri --no-rdoc

Теперь давайте возьмем какую-нибудь ленту и запихнем ее в индекс. Для тестов я люблю брать фид http://lenta.ru/rss. Дело в том, что в этой ленте выдается сразу 200 последних новостей, тогда как остальные ленты выдают по 10-20. В качестве идентификатора логично использовать адрес страницы с полной новостью. Итак, тянем ленту и индексируем:

solr = RSolr.connect :url => 'http://localhost:8983/solr/feeds'

rss = RSS::Parser.parse open('http://lenta.ru/rss'), false

for item in rss.items do
solr.add(
:id => item.link,
:title => item.title,
:description => item.description
)
end

solr.commit

Можете зайти в админку и убедиться, что вы действительно добавили 200 документов в поисковый индекс:

Apache Solr

Теперь можно переходить к поиску. Для этого можно подучить язык запросов Solr, а можно и не учить, так как он похож на тот, который мы используем каждый день для запросов через Google и Yandex. Давайте напишем скрипт, который будет брать запрос из командной строки и переадресовывать его Solr, а затем возвращать результат:

q = ARGV[0]
exit if q == nil

solr = RSolr.connect :url => 'http://localhost:8983/solr/feeds'
r = solr.get 'select', :params => {:q => q}

for news in r['response']['docs'] do
puts news['title']
end

Обзовем файл nf.rb, дадим права 0700 и запустим поиск новостей на футбольную (для примера) тематику.

./fn.rb футбол*

Получаем:

Nike запретил Роналду выпускать собственные бутсы
Роналдо объявил о возобновлении карьеры
Сына Бекхэма отчислят из академии «Арсенала»
«Амкар» подписал контракт с защитником сборной Украины
Спортсмены ЦСКА возложили цветы к могиле Неизвестного солдата
В Бразилии полицейская собака укусила футболиста во время матча
Киевскому «Динамо» запретили играть в майках с надписью «Героям слава»

Таким образом, вы можете подписаться на миллион лент и хранить новости в Postgres. Когда вам потребуется узнать, что в мире происходит, вы просто один раз составите профиль по своим интересам и в дальнейшем будете получать лишь то, что вам нужно. Можно с отправкой на email.

Кстати, обратите внимание, что по слову "футбол" найдены заголовки, которые описывают новость на футбольную тему, но самого слова не содержат. Понятно, что Solr нашел "футбол" в :description и никакой магии тут нет. Но что вам мешает провести обратную операцию? То есть, научить программу определять тематику новости. Например, программа встречает заголовок "Роналдо объявил о возобновлении карьеры". К какой категории отнести новость, если смотреть только на ключевые слова? К малополезным категориям "Роналдо" и "карьера"? Вот если бы мы знали, что Роналдо имеет отношение к футболу... Но не пропишешь же для каждой персоны, географического названия, да и вообще для любого слова сеть ассоциаций? Это всю жизнь можно трудиться и то времени не хватит. А теперь представим, что в нашей новостной базе накопилось несколько сотен тысяч новостей. Составляем частотный словарь, который станет словарем категорий. По каждому термину из словаря ищем через Solr заголовки и составляем ассоциативный граф. Очевидно, граф будет ориентированным, а весом ребра будет количество употреблений слова в контексте своей категории. Таким образом, получаем драгоценную базу ассоциаций, причем юзер может пинать балду — наполнять ее будут журналюги.

Разумеется, я привел лишь пример использования Solr. На практике вы можете прикрутить Solr к той читалке, которую используете. Большинство оффлайновых ридеров хранят загруженные новости в базе SQLite3. Вы можете найти этот файл, подключиться к базе и проиндексировать записи. Если вы серьезно занимаетесь новостями, все материалы лучше хранить в Postgres вместе с полными текстами новостей. Тогда поиск еще проще.

Ну и на прощание бонус — новости за день одной картинкой.

Облако слов

Оценка: 
5
Средняя: 5 (6 оценки)

Комментарии

Облако слов составлено по заголовкам новостей 10 самых крупных российских информагентств. Не знаю как на вас, а на меня картинка действует угнетающе. Это не новости, а серость какая-то, вперемежку с пропагандой. В стране ничего позитивного не происходит. А и с какой бы стати происходить? Рубль будет дальше деревенеть или пока на время остановится? Злые пиндосы ищут способы нам подосрать. Хохлы лютуют. Вот и все новости. Полгода уже одно и то же. Я даже заглянул в словарик, может это я чего-нибудь недопонимаю:

НО́ВОСТЬ Женский род. Нечто новое: новое явление, открытие, изобретение, новый сорт товара и т.д.

А вот картинка по средствам массовой информации Пиндостана:

Тоже скучно, но есть особенности. Во-первых, сразу бросается в глаза, что американцам не интересна ни Россия, ни Украина. Во-вторых, меня удивил тег Gemalto. Это новости о взломе сим-карт. В Штатах людей это заботит, у нас нет. Я почему-то считал, что россияне больше задумываются о вопросах приватности, чем американцы. Коммунистическое прошлое с вторжением в частную жизнь должно как-то было повлиять, но не тут-то было. В-третьих, тег new на первом месте должен вселять оптимизм (не в меня, а в американцев). Значит постоянно создается что-то новое, развивается экономика, происходит технологический рост. Тег №1 у нас — Россия. Очень хороший тег, я не спорю. Но не значит ли это, что прогресс в нашей стране решено заменить патриотизмом? Если да, то такая замена может вызвать довольно печальные последствия.

Оценка: 
Средняя: 5 (2 оценки)

В стране ничего позитивного не происходит.

Наоборот! В РФ сколько хорошего за год произошло, что каждый отдельный позитивчик просто не набрал большого число упоминаний.

Во-вторых, меня удивил тег Gemalto. Это новости о взломе сим-карт. В Штатах людей это заботит, у нас нет. Я почему-то считал, что россияне больше задумываются о вопросах приватности, чем американцы.

Вот именно поэтому россиян эта новость и менее всего впечатлила: «Наши телефонные разговоры прослушивают?! Я так и знал. Впрочем, это не телефонный разговор...".

В-третьих, тег new на первом месте должен вселять оптимизм (не в меня, а в американцев). Значит постоянно создается что-то новое, развивается экономика, происходит технологический рост.

Вообще-то это объясняется проще: в англоязычных рекламных текстах слово "new" используется чуть менее чем всегда. Кстати словечки типа "sale"/"sales" и "million" из той же оперы.

Оценка: 
Средняя: 5 (1 оценка)

в англоязычных рекламных текстах слово "new" используется чуть менее чем всегда

Согласен. Точнее, не согласен, а посмотрел контекст. Действительно, 70% употреблений приходится на статьи со скрытой рекламой (открытой нет, ибо новости собирались с лент WSJ, NYT, WP и прочих изданий, которые слишком крупные, чтобы позориться с рекламным шлаком в основной ленте новостей). Вот типичный пример использования "new":

The fingerprint sensor on Samsung's new Galaxy S6 is just as good as the one on the iPhone

С одной стороны, действительно реклама. С другой стороны, обилие новых товаров все же коррелирует с развитием экономики.

Впрочем, я поспешил с выводом о том, что в американских новостях преобладает "new". Оказывается, это не закономерность, а временный эффект. Например, сейчас картина другая:

Возможно, new тоже вылезает тогда, когда настоящих новостей нет.

В РФ сколько хорошего за год произошло

Сам люблю оптимизм, но ничего хорошего не вижу: народ обнищал, из союзников осталась одна Белоруссия, агрессивность внутри страны растет. Нетрудно догадаться, к чему приведет эта «линия тренда». Но если Вы видите что-то позитивное, поделитесь. Порадуюсь вместе с Вами.

Вот именно поэтому россиян эта новость и менее всего впечатлила

Так по этой реакции нащупывается линия допустимого. Почти на 100% уверен, что Gemalto — запланированный слив. Прозондировать общественное настроение. Там возмутились, поэтому на время закручивание гаек будет приостановлено. Здесь всем похер, поэтому можно переходить от прослушки к более серьезным шалостям.

Оценка: 
Пока без оценки

А не могли бы читатели с Украины накидать ссылок на свои крупные СМИ? Очень любопытно было бы посмотреть на картинку по Украине.

Оценка: 
Пока без оценки

Тут довольно ценная инфорация.

www mkyong com solr apache-solr-hello-world-example

В основном авторы с аналогичной инфрмацией либо сами не владеют темой, либо дают на уровне програмиста.

Оценка: 
Пока без оценки

Комментировать

Filtered HTML

  • Use [fn]...[/fn] (or <fn>...</fn>) to insert automatically numbered footnotes.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <strike> <code> <h2> <h3> <h4> <h5> <del> <img>
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.