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

22

Я выполнил некоторый запрос, например & quot; Адрес: Джек * & quot ;. Он показывает numFound = 5214 и отображает 100 документов на странице результатов (я изменил результаты отображения по умолчанию с 10 на 100). Как я могу получить все документы.

Заранее спасибо...

Ваш Ответ

8   ответов
-3

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

как вы получили, используя это утверждение. Он получает только 10 даже после использования этого утверждения.
Осторожнее с этим. Я использовал его в очень конкретном случае, когда фактическое количество было ограничено клиентским приложением. При развертывании на рабочем сервере из-за этого я получил исключение java.lang.NegativeArraySizeException.
0

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

// 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, но получает все совпадающие записи ... с небольшим снижением производительности.

7

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

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

Наш опыт (и полученные консультации) был таким же: использование Solr в качестве системы фильтрации и возврата всех результатов далеко не оптимально. Он просто не был предназначен для возврата всех результатов. Однако нам бы хотелось, чтобы был хоть какой-то способ получить хотя бы все совпадающие «ключи» (значения ключевых полей). Видеть этоsimilar question
0

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

Для более подробной информации можно обратиться к следующей книге

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

0

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

3

Я бы предложил использовать Deep Paging.

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

For typical applications displaying search results to a human user, this tends to not be much of an issue since most users don’t care about drilling down past the first handful of pages of search results — but for automated systems that want to crunch data about all of the documents matching a query, it can be seriously prohibitive.

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

Теперь мы говорим о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;
}
Это нормально. Вы добровольно помогаете сообществу. Это само по себе большое дело :)
@ Кибермонк, верно, сегодня утром я действительно не успел последовать за тобой.
Перефразируя, я не могу сортировать это по чему-либо и все еще использовать маркер курсора?
После некоторого прочтения выяснилось, что «сортировка = оценка desc, id asc»; включит сортировку по умолчанию. id используется в качестве разрыва связи
если я сортирую его по идентификатору, это не повлияет на показатель релевантности по умолчанию? Есть ли обходной путь
33

Я помню себя делаю&rows=2147483647

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

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

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

Не используйте Integer.MAX_VALUE (2147483647) в качестве значения строк в производстве. Это сильно замедлит ваш запрос, даже если у вас небольшой набор результатов, потому что solr предварительно выделяет очередь такого размера. увидетьissues.apache.org/jira/browse/SOLR-7580
Dangerous. Делайте это только для небольшого количества документов.
2

Что вы должны сделать, это сначала создать 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

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

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

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

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

Похожие вопросы