2012-03-15 3 views
1

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

Ошибка, наложенная сервером на 500 - с сообщением об исключении из памяти.

Этот сбой:

http://localhost:8983/solr/myIndex1/select?rows=100000&q=*%3A*&fq=group%3term1_JAYUNIT100&fq=grid%3A75&wt=json&indent=on 

Это не катастрофа:

http://localhost:8983/solr/myIndex1/select?rows=1&q=*%3A*&fq=group%3term1_JAYUNIT100&fq=grid%3A75&wt=json&indent=on 

Это странно для меня - я не понимаю, почему Solr бы использовать дополнительную память для запроса, который возвращает только одну строку , Существует ли какое-то предварительное распределение ресурсов, которое происходит на стороне сервера перед выполнением запроса, которое основано на значении параметра «rows»?

ответ

1

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

Прежде всего, SOLR нуждается в ОЗУ. В конце концов, это индекс в ОЗУ. Все, что делает SOLR быстрым, занимает RAM, поэтому, пожалуйста, не голодайте SOLR-сервер.

Во-вторых, ваш фактический запрос бесполезен. Там нет смысла говорить «выбрать все записи из базы данных, построение индекса растрового и затем фильтровать этот набор, чтобы выбрать только те, которые с определенными значениями полей Если ваш запрос звучит, как это на естественном языке:.

Records where XField is like so, AND YField is like that, AND ZField meets this condition

Тогда правильный способ сделать это в ГУМЗЕ является:

q=XField:so&fq=Yfield:that%20AND%20ZField:this

в самом деле, если вы уверены, что есть х записи с XField: так и 3x запись с YField: что и .07x запись с ZField: это, а затем начать с переупорядочения выражения AND и поставить ZField i n q= часть.

Часть q= определяет набор результатов. Получив все записи в наборе результатов, SOLR затем применяет методы индекса растрового изображения, чтобы быстро фильтровать (сузить) результаты с помощью заданий набора. Поэтому, когда вы можете сделать, часть q= возвращает меньше записей для fq= для работы.