Как управлять «пейджингом» с помощью Solr? - PullRequest
4 голосов
/ 27 февраля 2010

У меня есть сайт объявлений ... У меня есть Solr, который выполняет поиск объявлений, а затем возвращает ID: nrs, который я затем использую для помещения в массив. Затем я использую этот массив для поиска любых объявлений в базе данных MySql, где ID: s совпадают с ID: s в массиве, возвращенном Solr.

Теперь, поскольку этот массив может быть очень очень большим (100 тысяч записей или более), тогда мне нужно будет «постраничить» результаты так, чтобы, возможно, 100 было возвращено одновременно. А затем используйте эти 100 идентификаторов в MySql, чтобы найти объявления.

Итак, возможно ли пейджинг с SOLR?

А если так, то как? Мне нужен пример кода ... И какие результаты будут, пожалуйста.

В основном мне нужен тщательный пример!

Спасибо

Ответы [ 5 ]

21 голосов
/ 28 февраля 2010

Пейджинг управляется параметрами start и row , например ::

?q=something&rows=10&start=20

выдаст вам 10 документов, начиная с документа 20.

Что касается получения другой информации из MySQL, вы сами по себе. Я и другие люди уже предложили вам хранить все в Solr, чтобы избежать дополнительных запросов к MySQL.

11 голосов
/ 24 апреля 2015

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

Поскольку упоминается Йоник , проблема обычного start / rows заключается в том, что когда у нас большой набор данных, а start немного дальше ( много дальше ), чем ноль, мы имеем хорошие накладные расходы с точки зрения эффективности и памяти. Это происходит потому, что выборка 20 документов из "середины" 500K записей + с использованием сортировки, по крайней мере, требует сортировки всего набора данных ( сортировка внутренних уникальных ) , Более того, если поиск будет распространяться, он будет еще более ресурсоемким, т.к. набор данных ( из 500 020 строк ) из каждого сегмента должен быть возвращен на узел агрегатора для объединения, чтобы найти применимые 20 строк.

Solr не может вычислить, какой соответствующий документ является 999001-м результатом в отсортированном порядке, без предварительного определения того, какие первые 999000 соответствуют отсортированным результатам.


Решением здесь является использование Solr cursorMark.

По первому запросу вы объявляете, что &cursorMark=*. Это значит следующее:

Вы можете думать, что это аналогично start=0 как способ сказать Solr " начать с начала моих отсортированных результатов ", за исключением того, что он также сообщает Solr, что вы хотите использовать Курсор.

! Одно «предостережение» заключается в том, что ваши sort предложения должны включать поле uniqueKey . Это может быть поле id, если оно уникально.

Часть первого запроса будет выглядеть так:

?sort=price desc,id asc&start=0&cursorMark=* ...

В результате вы получите следующую структуру

{
    "response":{"numFound":20,"start":0,"docs":[ /* docs here */ ]},
    "nextCursorMark":"AoIIRPoAAFBX" // Here is cursor mark for next "page"
}

Чтобы получить следующую страницу, следующий запрос будет выглядеть следующим образом:

?sort=price desc,id asc&start=0&cursorMark=AoIIRPoAAFBX ...

Обратите внимание на cursorMark из предыдущего ответа. И в результате вы получите следующую страницу результатов ( такая же структура, как и у первого ответа, но с другим nextCursorMarker значением ). И так далее ...

Этот подход идеально подходит для нумерации страниц с бесконечной прокруткой, но для его использования в классической нумерации страниц есть несколько вещей, о которых стоит подумать:).

Вот некоторые справочные материалы, которые я нашел для решения этой проблемы, надеюсь, это поможет кому-то это сделать.

5 голосов
/ 28 февраля 2010

Взгляните на IBM . Может быть, это поможет вам выбрать правильный курс.

Количество результатов: указывает максимальное количество результатов для возврата.

Start: смещение, с которого начинается в наборе результатов. Это полезно для нумерации страниц.

Так что вы, вероятно, хотите немного изменить

<str name="rows">10</str>
<str name="start">0</str>

Ваш клиент Solr должен предоставить какой-то способ получить общее количество результатов без особых проблем.

4 голосов
/ 27 января 2014

Параметр «start» управляет смещением в результатах поиска, а параметр «rows» определяет, сколько документов оттуда вернуть.

Если вы выполняете «глубокое разбиение на страницы» (итерация по многим страницам), то вы можете добиться гораздо лучшей производительности, используя курсор для итерации по набору результатов.

1 голос
/ 14 апреля 2013

Я думаю, что стоит сказать, что solr возвращает вместе с текущей страницей результат подсчета общего количества найденных записей.

Например, звонить:

http://192.168.0.1:8983/solr/select?qt=edismax&fl=*,score&qf=content^2%20metatag.description^3%20title^5%20metatag.keywords^10&q=something&start=20&rows=10&wt=xml&version=2.2

Ответ:

<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
        <lst name="params">
            <str name="fl">*,score</str>
            <str name="q">something</str>
            <str name="qf">content^2 metatag.description^3 title^5 metatag.keywords^10</str>
            <str name="qt">edismax</str>
            <str name="wt">xml</str>
            <str name="rows">10</str>
            <str name="version">2.2</str>
            </lst>
        </lst>
        <result name="response" numFound="1801" start="0" maxScore="0.15953878">
            <doc>...</doc>
            <doc>...</doc>
            <doc>...</doc>
...

Используя solrj, запрос метода возвращает SolrDocumentList, который имеет метод: getNumFound ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...