Статьи

Случайные документы из набора результатов (бесплатные результаты!)


А теперь две птицы с одним камнем — новая статья и
Apache Solr 4 Cookbook
поддавки результатов. В этой статье мы хотели бы показать вам, как реализовать произвольное упорядочение документов в результате с использованием Apache Solr. Наш пример — сценарий реального случая — мы использовали это, чтобы привлечь двух
бесплатных участников. Те два автора комментариев, которые будут на вершине набора результатов, получат книгу.

документы

Наши документы содержат информацию об участниках конкурса — их идентификатор , имя (в качестве поля автора ) и адрес электронной почты . Например, одна запись выглядит так:

<doc>
  <field name="id">1</id>
  <field name="author">Solr.pl author</field>
  <field name="email">blog(at)solr.pl</field>
</doc>

Наши очень большие данные содержат 19 записей, может быть, мы должны были использовать карту / уменьшить? :),

схема

Schema.xml файл , описывающий структуру индекса также очень просто. В нашем случае он содержит следующие поля:

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="author" type="text_general" indexed="true" stored="true"/>
<field name="email" type="text_general" indexed="true" stored="true"/>

Дополнительная конфигурация

Теперь нам нужно убедиться, что файл schema.xml содержит следующие определения типа и определения полей:

<fieldType name="random" class="solr.RandomSortField" indexed="true" />
<dynamicField name="random_*" type="random" />

В примере файла schema.xml, входящего в стандартный дистрибутив Solr, этот тип и динамическое поле доступны по умолчанию. Они понадобятся нам для рандомизации нашего набора результатов.

Выполнение запроса со случайной сортировкой

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

localhost:8983/solr/competition/select?q=*:*&sort=random_12939291%20desc

Как это работает ?

Solr рассчитает порядок документов на основе имени случайного поля и версии индекса. Это означает, что каждый раз, когда вы используете одно и то же имя поля и один и тот же индекс (который не изменялся между запросами), вы будете получать результаты, которые упорядочены абсолютно одинаково. Это недостаток этого метода, но иногда это может быть очень удобно, например, при выполнении подкачки страниц (мы не хотим, чтобы у каждой страницы был разный порядок упорядочивания результатов, верно?). По этой причине вы должны сгенерировать имя поля в вашем приложении, которое выполняет запросы к Solr.

А теперь — бесплатные результаты!

Мы использовали вышеупомянутый запрос. Число, используемое в поле сортировки, является абсолютно случайным, которое было рандомизировано, говоря: «Папа, скажи мне несколько случайных чисел» :). Таким образом, весь запрос, который мы использовали, был:

localhost:8983/solr/collection1/select?q=*:*&indent=true&rows=2&sort=random_3721117253841%20desc

Этот запрос дал следующие результаты:

<result name="response" numFound="19" start="0">
  <doc>
    <str name="id">9</str>
    <str name="author">Rajeev Srivastava</str>
    <str name="email">[CENSORED]</str>
    <long name="_version_">1431017731370516481</long></doc>
  <doc>
    <str name="id">8</str>
    <str name="author">Evgeny</str>
    <str name="email">[CENSORED]</str>
    <long name="_version_">1431017731370516480</long></doc>
</result>

И победителями стали

  • Раджив
  • Евгений

Поздравляю! Мы свяжемся с вами в самое ближайшее время и предоставим дополнительную информацию о том, как получить ваши награды. Еще раз поздравляю! Кроме того, всем остальным участникам, спасибо за участие и ваши комментарии!