Прикручиваем мощный поисковик Solr к своей RSS-читалке
Apache Solr — свободная поисковая платформа высочайшего качества. Чтобы не тратить время на нахваливание, перечислю конторы, использующие Solr: DuckDuckGo, Adobe, Instagram, Internet Archive, Bloomberg и так далее. Я и подумал, а что если взять всю эту мощь и прикрутить к своей скромной RSS-читалке, о которой я писал ранее? Приделать к велосипеду колеса от Белаза, так сказать...
Делается это не просто, а очень просто: скачиваем 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 документов в поисковый индекс:
Теперь можно переходить к поиску. Для этого можно подучить язык запросов 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 вместе с полными текстами новостей. Тогда поиск еще проще.
Ну и на прощание бонус — новости за день одной картинкой.
Комментарии
pomodor
25 февраля, 2015 - 22:08
Облако слов составлено по заголовкам новостей 10 самых крупных российских информагентств. Не знаю как на вас, а на меня картинка действует угнетающе. Это не новости, а серость какая-то, вперемежку с пропагандой. В стране ничего позитивного не происходит. А и с какой бы стати происходить? Рубль будет дальше деревенеть или пока на время остановится? Злые пиндосы ищут способы нам подосрать. Хохлы лютуют. Вот и все новости. Полгода уже одно и то же. Я даже заглянул в словарик, может это я чего-нибудь недопонимаю:
А вот картинка по средствам массовой информации Пиндостана:
Тоже скучно, но есть особенности. Во-первых, сразу бросается в глаза, что американцам не интересна ни Россия, ни Украина. Во-вторых, меня удивил тег Gemalto. Это новости о взломе сим-карт. В Штатах людей это заботит, у нас нет. Я почему-то считал, что россияне больше задумываются о вопросах приватности, чем американцы. Коммунистическое прошлое с вторжением в частную жизнь должно как-то было повлиять, но не тут-то было. В-третьих, тег new на первом месте должен вселять оптимизм (не в меня, а в американцев). Значит постоянно создается что-то новое, развивается экономика, происходит технологический рост. Тег №1 у нас — Россия. Очень хороший тег, я не спорю. Но не значит ли это, что прогресс в нашей стране решено заменить патриотизмом? Если да, то такая замена может вызвать довольно печальные последствия.
Чингачгук
1 марта, 2015 - 16:09
Наоборот! В РФ сколько хорошего за год произошло, что каждый отдельный позитивчик просто не набрал большого число упоминаний.
Вот именно поэтому россиян эта новость и менее всего впечатлила: «Наши телефонные разговоры прослушивают?! Я так и знал. Впрочем, это не телефонный разговор...".
Вообще-то это объясняется проще: в англоязычных рекламных текстах слово "new" используется чуть менее чем всегда. Кстати словечки типа "sale"/"sales" и "million" из той же оперы.
pomodor
1 марта, 2015 - 20:11
Согласен. Точнее, не согласен, а посмотрел контекст. Действительно, 70% употреблений приходится на статьи со скрытой рекламой (открытой нет, ибо новости собирались с лент WSJ, NYT, WP и прочих изданий, которые слишком крупные, чтобы позориться с рекламным шлаком в основной ленте новостей). Вот типичный пример использования "new":
С одной стороны, действительно реклама. С другой стороны, обилие новых товаров все же коррелирует с развитием экономики.
Впрочем, я поспешил с выводом о том, что в американских новостях преобладает "new". Оказывается, это не закономерность, а временный эффект. Например, сейчас картина другая:
Возможно, new тоже вылезает тогда, когда настоящих новостей нет.
Сам люблю оптимизм, но ничего хорошего не вижу: народ обнищал, из союзников осталась одна Белоруссия, агрессивность внутри страны растет. Нетрудно догадаться, к чему приведет эта «линия тренда». Но если Вы видите что-то позитивное, поделитесь. Порадуюсь вместе с Вами.
Так по этой реакции нащупывается линия допустимого. Почти на 100% уверен, что Gemalto — запланированный слив. Прозондировать общественное настроение. Там возмутились, поэтому на время закручивание гаек будет приостановлено. Здесь всем похер, поэтому можно переходить от прослушки к более серьезным шалостям.
pomodor
25 февраля, 2015 - 22:21
А не могли бы читатели с Украины накидать ссылок на свои крупные СМИ? Очень любопытно было бы посмотреть на картинку по Украине.
Чингачгук
12 августа, 2017 - 16:13
Тут довольно ценная инфорация.
www mkyong com solr apache-solr-hello-world-example
В основном авторы с аналогичной инфрмацией либо сами не владеют темой, либо дают на уровне програмиста.
Комментировать