Вопрос по solr – Как получить все результаты запроса Solr?
query.setRows (Integer.MAX_VALUE); работает для меня!!
Я решил проблему, выполнив запрос дважды:
// 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, но получает все совпадающие записи ... с небольшим снижением производительности.
Возврат всех результатов никогда не является хорошим вариантом, так как он будет очень медленным.
Можете ли вы упомянуть свой вариант использования?
Также Solrстроки Параметр поможет вам настроить количество результатов, которые будут возвращены.
Однако я не думаю, что есть способ настроить строки, чтобы вернуть все результаты. Он не принимает значение -1 в качестве значения.
Таким образом, вам нужно будет установить высокое значение для всех результатов, которые будут возвращены.
Для выбора всех документов в dismax / edismax через PHP-клиент Solarium используется обычный синтаксис запроса: не работает. Чтобы выбрать все документы, установите значение запроса по умолчанию в запросе солярия на пустую строку. Это необходимо, так как запрос по умолчанию в солярии:, Также установите альтернативный запрос:, Нормальный синтаксис запросов Dismax / eDismax не поддерживает:, но альтернативный синтаксис запроса делает.
Для более подробной информации можно обратиться к следующей книге
Как указывалось в других ответах, вы можете настроить строки на максимальное целое число, чтобы получить все результаты запроса. Я бы порекомендовал хотя бы использоватьSolr особенность нумерации страници создайте функцию, которая будет возвращать вам все результаты, используя API cursorMark. Суть его в том, что вы устанавливаете параметр cursorMark равным «*», вы устанавливаете размер страницы (параметр строки), и для каждого результата вы получаете курсор курсора для следующей страницы, поэтому вы выполняете тот же запрос только с Маркер курсора, полученный из последнего результата. Таким образом, у вас будет больше гибкости в отношении того, сколько результатов вы хотите вернуть, гораздо более производительным способом.
Я бы предложил использовать 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://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;
}
Я помню себя делаю&rows=2147483647
2 147 483 647 - это максимальное значение целого числа. Я помню, как использовал число, большее чем один раз, и имел NumberFormatException, потому что он не может быть разобран в int. Я не знаю, используют ли они Long сегодня, но обычно 2 миллиарда строк более чем достаточно.
Small note:
Будьте осторожны, если вы планируете сделать это в производстве. Если вы делаете запрос, подобный *: *, и ваш индекс большой, вы можете перенести пару гигабайт в этом запросе.
Если вы знаете, что у вас не будет много документов, продолжайте и используйте максимальное значение целого числа.
С другой стороны, если вы выполняете одноразовый сценарий и вам просто нужно вывести все результаты (например, идентификаторы документов), тогда этот подход действителен, если вы не возражаете ждать 3-5 минут для запроса запроса. вернуть.
Что вы должны сделать, это сначала создать 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 - размер пакета) и установить для нее последний идентификатор, полученный из результатов.
Это поможет вам выполнить следующую партию, начиная с последнего результата из предыдущей партии.
Надеюсь это поможет. Снимите комментарий ниже, если вам нужны какие-либо разъяснения.