Подтвердить что ты не робот

Как получить все результаты запроса solr?

Я выполнил некоторый запрос типа "Address:Jack*". Он показывает numFound = 5214 и отображает 100 документов на странице результатов (я изменил результаты отображения по умолчанию с 10 на 100).

Как я могу получить все документы.

4b9b3361

Ответ 1

Я помню, как я делал & rows = 2147483647

2,147,483,647 - целочисленное максимальное значение. Я помню, используя число, большее, чем однократно, и имеющее исключение NumberFormatException, потому что оно не может быть проанализировано в int. Я не знаю, используют ли они Long в настоящее время, но 2 миллиарда строк обычно более чем достаточно.

Небольшое примечание:
Будьте осторожны, если вы планируете делать это на производстве. Если вы выполните запрос типа *: * и ваш индекс большой, вы можете перенести пару гигабайт в этот запрос.
Если вы знаете, что у вас не будет много документов, продолжайте использовать значение integer max.

С другой стороны, если вы выполняете одноразовый script и просто должны сбрасывать все результаты (например, ID документа), тогда этот подход действителен, если вы не возражаете ждать 3-5 минут для запроса вернуться.

Ответ 2

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

Кроме того, параметр Solr rows помогает вам настроить количество возвращаемых результатов.
Тем не менее, я не думаю, что есть способ настроить строки для возврата всех результатов. Он не принимает значение -1 как значение.
Поэтому вам нужно будет установить большое значение для всех результатов, которые будут возвращены.

Ответ 3

Я предлагаю использовать Deep Paging.

Простая разбивка на страницы - это простая вещь, когда у вас мало документов для чтения, и все, что вам нужно сделать, это играть с параметрами start и rows. Но если у вас много документов, я имею в виду сотни тысяч или даже миллионы, это невозможно.
Это то, что может привести ваш сервер Solr на колени.

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

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

Теперь мы говорим о Deep Paging.

Я предлагаю прочитать этот удивительный пост:

https://lucidworks.com/blog/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/

И взгляните на эту страницу документа:

https://cwiki.apache.org/confluence/display/solr/Pagination+of+Results

И вот пример, который пытается объяснить, как рисовать страницы с помощью курсоров.

SolrQuery solrQuery = new SolrQuery();
solrQuery.setRows(500);
solrQuery.setQuery("*:*");
solrQuery.addSort("id", ORDER.asc);  // Pay attention to this line
String cursorMark = CursorMarkParams.CURSOR_MARK_START;
boolean done = false;
while (!done) {
    solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark);
    QueryResponse rsp = solrClient.query(solrQuery);
    String nextCursorMark = rsp.getNextCursorMark();
    for (SolrDocument d : rsp.getResults()) {
            ... 
    }
    if (cursorMark.equals(nextCursorMark)) {
        done = true;
    }
    cursorMark = nextCursorMark;
}

Ответ 4

Что вам нужно сделать, так это сначала создать SolrQuery, показанный ниже, и установить количество документов, которые вы хотите получить в пакете.

int lastResult=0; //this is for processing the future batch

String query = "id:[ lastResult TO *]"; // just considering id for the sake of simplicity

SolrQuery solrQuery = new SolrQuery(query).setRows(500); //setRows will set the required batch, you can change this to whatever size you want.

SolrDocumentList results = solrClient.query(solrQuery).getResults(); //execute this statement

Здесь я рассматриваю пример поиска по id, вы можете заменить его любым из ваших параметров для поиска.

"lastResult" - это переменная, которую вы можете изменить после выполнения первых 500 записей (500 - размер партии) и установить ее на последний идентификатор, полученный из результатов.

Это поможет вам выполнить следующую партию, начиная с последнего результата из предыдущей партии.

Надеюсь, это поможет. Снимите комментарий ниже, если вам нужно какое-либо разъяснение.

Ответ 5

Для выбора всех документов в dismax/edismax через клиент php Solarium обычный синтаксис запроса: не работает. Чтобы выбрать все документы, установите значение запроса по умолчанию в запросе солярия на пустую строку. Это необходимо, поскольку запрос по умолчанию в Solarium:. Также установите альтернативный запрос:. Dismax/eDismax обычный синтаксис запроса не поддерживает:, но альтернативный синтаксис запроса делает.

Подробнее о книге можно прочитать

http://www.packtpub.com/apache-solr-php-integration/book

Ответ 6

Как указывалось в других ответах, вы можете настроить строки как max integer, чтобы вернуть все результаты для запроса. Я бы рекомендовал использовать функцию Solr для разбивки на страницы и построить функцию, которая вернет вам все результаты, используя API-интерфейс cursorMark. Суть этого в том, что вы задали параметр cursorMark в '*', вы задаете размер страницы (параметр rows), и по каждому результату вы получите курсорMark для следующей страницы, так что вы выполняете тот же запрос только с помощью курсораMark из последнего результата. Таким образом, у вас будет больше гибкости в отношении того, сколько результатов вы хотите вернуть, гораздо более эффективным способом.

Ответ 7

Я решил проблему, выполнив запрос дважды:

// Start with your (usually small) default page size
solrQuery.setRows(50); 
QueryResponse response = solrResponse(query);
if (response.getResults().getNumFound() > 50) {
    solrQuery.setRows(response.getResults().getNumFound()); 
    response = solrResponse(query);
}

Он дважды обращается к Solr, но получает все совпадающие записи... с небольшим снижением производительности.

Ответ 8

query.setRows(Integer.MAX_VALUE); работает для меня!