Итак, скажем, у вас есть важный технический вопрос, на который просто нужно ответить:
«В чем разница между JavaScript и Java?»
Обычно вы размещаете его в StackOverflow и добавляете огромную награду, чтобы получить быстрый ответ . Но вы отправили награду за последние 10 вопросов, и теперь ваша репутация переполнения стека равна 4.
Не беспокойтесь, возможно, если вы правильно рассчитаете время своего вопроса, вы сможете поймать всех тех программистов на Java / JavaScript, когда они отвечают на такие важные вопросы, как ваш. И как вы узнаете, когда наступит это волшебное время? Проще говоря, вы индексируете весь дамп данных StackOverflow в Solr и рассматриваете Solr как аналитический движок StackOverflow. (Эй, вы можете не знать разницу между Java и JavaScript, но вы не дураки, когда дело доходит до Solr!)
Так вот как это выглядит. Файл post.xml в дампе данных StackOverflow содержит все вопросы и ответы на сайте. Сообщения содержат следующие поля:
- Id — уникальный идентификатор для вопроса или ответа.
- ParentId — если этот пост является ответом, ParentId ссылается на соответствующий вопрос.
- PostTypeId — 1 для вопроса, 2 для ответа.
- CreationDate — по Гринвичу.
- Тело — Содержание поста.
- Заголовок — Вы догадались.
- Теги — список тем для этого вопроса.
Чтобы разделить и нарезать кубиками данные, чтобы найти лучшее время года, дня недели или времени суток для ответа на вопрос, рекомендуется разбить CreationDate на набор связанных полей:
- CreationMonth — с 1 по 12.
- Час создания — от 0 до 23.
- CreationMinute — от 0 до 60.
- CreationDayOfWeek — от 0 (понедельник) до 6.
- CreationDayOfYear — от 1 до 365.
Теперь все, что вам нужно сделать, чтобы узнать, что золотое время для того, чтобы задать вопрос, — это найти время, когда большинство людей отвечают на вопросы о Java и Javascript.
http://localhost:8983/solr/collection1/select ?q=Tags:(java AND javascript) &fq=PostTypeId:2 &facet=on &facet.field=CreationDayOfYear &f.CreationDayOfYear.facet.limit=365 &facet.field=CreationDayOfWeek &facet.field=CreationHour &facet.sort=index
Словом, запрос q
предназначен для всех вопросов, помеченных как java, так и javascript. Эти результаты фильтруются fq
так, что возвращаются только ответы. Остальные параметры включают отсортированные списки фасетов для времени года, недели и дня. Итак, как только вы получите запрос Solr, вы узнаете лучшие времена года, недели и дня, чтобы задать свои вопросы. Вы нажимаете Enter и SNAP нет результатов! Что дает?!
После небольшого исследования выясняется, что поле имеют только вопросы ( PostTypeId=1
), Tags
поэтому очевидно, что вы не сможете получить количество ответов, помеченных тегом Java AND JavaScript
. Так ты потонул? Нет ли способа узнать, когда вопросы о Java / JavaScript привлекают все внимание? Собираетесь ли вы сделать какую-то сумасшедшую работу по индексированию MapReduce, чтобы связать ответы с соответствующими тегами? Оказывается нет !
Solr присоединиться к спасению
Это верно, функциональность Solr Join идеально подходит для этой конкретной проблемы. Давайте посмотрим, как это будет работать:
http://localhost:8983/solr/collection1/select q={!join from=Id to=ParentId}Tags:(java AND javascript) &facet=on &fq=PostTypeId:2 &facet.field=CreationDayOfYear &f.CreationDayOfYear.facet.limit=365 &facet.field=CreationDayOfWeek &facet.field=CreationDayOHour &facet.sort=index
Как видите, единственная разница здесь — странная запись в начале q
параметра.
{!join from=Id to=ParentId}
Это нотация локальных параметров Solr , и вот что говорит Solr: во-первых, у вас есть join
; на самом деле это синтаксический сахар только для первого параметра. Это то же самое, что сказать type=join
. Это означает, что вместо использования режима запроса lucene
или dismax
мы будем использовать join
режим запроса. Далее у нас есть from=Id
. Чтобы выразить это в терминах SQL, это означает, что мы будем использовать Id
в качестве первичного ключа. Наконец, мы имеем, to=ParentId
что, как вы уже догадались, подразумевает, что ParentId
будет использоваться в качестве внешнего ключа.
Когда мы выдаем запрос, Solr сначала получает список документов, соответствующих запросу Tags:(java AND javascript)
. Затем для каждого документа в этом наборе результатов Solr извлекает набор документов, которые ParentId
соответствуют Id
s в исходном наборе.
В мире SQL этот запрос будет выглядеть так:
SELECT * FROM collection1 WHERE ParentId IN (SELECT Id FROM collection1 where Tag = "(Java and Javascript")
<lst name="CreationDayOfYear"> <int name="1">2</int> <int name="2">4</int> <int name="3">12</int> <int name="4">5</int> <int name="5">10</int> <int name="6">8</int> <int name="7">2</int> <!--snip--> <int name="362">9</int> <int name="363">3</int> <int name="364">4</int> <int name="365">5</int> </lst> <lst name="CreationHour"> <int name="1">63</int> <int name="2">44</int> <int name="3">122</int> <int name="4">65</int> <int name="5">120</int> <int name="6">48</int> <int name="7">62</int> <!--snip--> <int name="21">29</int> <int name="22">63</int> <int name="23">434</int> </lst> <lst name="CreationDayOfWeek"> <int name="0">371</int> <int name="1">390</int> <int name="2">383</int> <int name="3">422</int> <int name="4">369</int> <int name="5">266</int> <int name="6">272</int> </lst>
Вы можете представить, как эти данные могут быть легко использованы для построения визуализации лучших времен для запроса переполнения стека для вашей конкретной темы. И в ожидании будущей визуализации данных поста мы на самом деле показать вам , как визуализировать эти результаты с помощью D3 .
Также, если вам интересно играть с этим самим, проверьте репо на GitHub .
— Подробнее см .: http://www.opensourceconnections.com/2013/02/12/using-solr-join-to-find-the-best-time-to-ask-questions-on-stackoverflow/#sthash. vyJJXado.dpuf