Ask with wt=json and every answer of your index is built from the same parts. This is what each one holds.
01 · The parts
| Part | When | What it holds |
|---|---|---|
responseHeader | Always | status 0 means success. QTime is the time Solr spent, in milliseconds, network not included. |
response | Always, unless there is an error | numFound (all the matches), start (the offset you asked for), maxScore (when fl asks for the score) and docs, the results of this page. |
highlighting | hl=true | Snippets with the searched words marked, keyed by document id: Highlighting. |
facet_counts | facet=true | Counts per value: Facets. |
spellcheck | spellcheck=true | Corrections: Did you mean. |
error | On failure | The reason and the HTTP code. |
02 · A result
{ "id": "1f9e6cba8357fe106a950a1f80b301cc", "uri": "https://www.example.com/blog/solar-panels", "title": "Solar Panels for Small Roofs", "description": "How many panels fit on a small roof, and what they produce.", "og_image": "https://www.example.com/img/solar.jpg", "meta_domain": "example.com", "meta_detected_language": "en", "content_type": "text/html", "creation_date": "2026-09-14T08:30:00Z", "score": 0.853 }
A result carries the fields named in fl; score is there only when fl asks for it. What each field holds: the core fields and the fields Opensolr adds to every document.
03 · Facets
Each facet is a flat list of value, count, value, count:
"facet_counts": { "facet_fields": { "meta_detected_language": ["en", 834, "de", 245, "fr", 123] } }
var pairs = data.facet_counts.facet_fields.meta_detected_language; var facets = []; for (var i = 0; i < pairs.length; i += 2) { facets.push({ value: pairs[i], count: pairs[i + 1] }); }
With json.nl=map in the request, the same facet comes back as an object instead: {"en": 834, "de": 245}.
04 · Did you mean
"spellcheck": { "suggestions": ["bakup", {"numFound": 3, "startOffset": 5, "endOffset": 10, "suggestion": ["backup", "backups", "baked"]}], "collations": ["collation", "solr backup", "collation", "solr backups"] }
collations alternates the word collation with a whole corrected search; the first one is collations[1].
05 · Errors
{ "responseHeader": { "status": 400, "QTime": 36 }, "error": { "metadata": ["error-class", "org.apache.solr.common.SolrException", "root-error-class", "org.apache.solr.common.SolrException"], "msg": "undefined field nonexistent_field", "code": 400 } }
The HTTP status of the answer is the same code. 400 means the request is wrong (syntax, a field that does not exist, a bad value); 401 means the username or password is wrong; 500 is an error inside Solr, and your Error Log shows it.