Solr/SolrJ: cómo iterar resultados sin crear una ArrayList gigante
(2)
Ese código parece correcto. También puede envolverlo en un iterador para que su código de cliente no tenga que saber nada sobre la búsqueda subyacente.
Acerca de SolrQuery.setStart()
requiere un Entero, ciertamente parece extraño, creo que tienes razón y debería ser también algo largo. Intente preguntar en la lista de correo de solr-usuario o lucene-dev .
¿Hay alguna manera de iterar sobre una respuesta de Solrj de manera que los resultados se obtengan de forma incremental durante la iteración, en lugar de devolver una ArrayList
en memoria gigante?
¿O tenemos que recurrir a esto?
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
int fetchSize = 1000;
query.setRows(fetchSize);
QueryResponse rsp = server.query(query);
long offset = 0;
long totalResults = rsp.getResults().getNumFound();
while (offset < totalResults)
{
query.setStart((int) offset); // requires an int? wtf?
query.setRows(fetchSize);
for (SolrDocument doc : server.query(query).getResults())
{
log.info((String) doc.getFieldValue("title"));
}
offset += fetchSize;
}
Y mientras estoy en el tema, ¿por qué SolrQuery.setStart()
requiere un integer
, cuando SolrDocumentList.getStart()/getNumFound()
regresa a long
?
La razón, cafeína, es que Solr está diseñado para darle los mejores resultados de búsqueda X. La expectativa es que tendrá un número "razonable" para regresar. Si Solr tiene que mirar en profundidad en los resultados de búsqueda (en miles), está frotando contra el grano para lo que Solr fue diseñado. Funcionará, pero la respuesta de la consulta se hará cada vez más lenta y lenta a medida que avancen los resultados de búsqueda. Hay un trabajo continuo en Solr para hacer que este caso de uso sea más eficiente, pero no he visto progreso en él últimamente.