Статьи

Использование Solr Join, чтобы найти лучшее время для вопросов на StackOVerflow

Итак, скажем, у вас есть важный технический вопрос, на который просто нужно ответить:

«В чем разница между 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соответствуют Ids в исходном наборе.

В мире 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