Every document you push is one JSON object. Four fields are required; the optional ones make your results richer; and you can add fields of your own for filters and sorting.
Required fields
| Field | What to send |
|---|---|
uri | The web address of the document: a full http:// or https:// URL. It is the document's identity: the same uri always means the same document. A trailing slash is removed. |
title | The title, shown as the heading of the result. |
description | A short summary, shown under the title. |
text | The full text, as plain text (no HTML). Not needed when you send a file with "rtf": true: the text is read from the file (Files and documents). |
Opensolr makes each document's id from its uri (the MD5 of the address). An id you send is ignored. Because the same address always gives the same id, sending a document again replaces it instead of adding a copy (Update and remove documents). The ids come back in doc_ids when you push.
Optional fields
| Field | What it does |
|---|---|
timestamp | The date of the content: Unix time (1741392000) or a date such as 2026-03-08 14:00:00. Date filters and fresh results use it. |
og_image | The address of a picture shown with the result. |
meta_icon | The address of your site's icon. |
author | The author's name. |
category | A category name, usable as a filter. |
content_type | The type of the document. When you send none, it is read from the file for a file, and is text/html otherwise. A text/... type shows on the Web tab of the hosted search page, any other type (a PDF, a Word file) on the Documents tab (Web and Documents tabs). |
meta_detected_language | The two-letter language code: en, de, fr. Without it, or with a code that is not a language, Opensolr detects the language from the title and description, and leaves it empty when unsure. |
meta_og_locale | Language and country, such as en_gb or es_ar (en-GB works too). A value without a real country is dropped. Without it, a locale in the address, such as /es-ar/, is used. |
meta_domain | The domain of your site; taken from uri when you send none. |
price_f, currency_s | A price and its currency code (USD, EUR): shown on the result, used by the price filter and price sorting. |
text_t | A cleaner version of the text, for example from your structured data. When you send it, the meaning vector is made from it instead of text. |
Opensolr adds the rest itself: meaning vectors, sentiment, the detected language and the fields search needs (What Opensolr adds to every document). Every field of the index: Core fields.
Your own fields
Add any field whose name ends with a type suffix of the Opensolr schema, and it is stored exactly as you send it, ready for filters, facets and sorting. No setup needed.
{
"uri": "https://example.com/handbook/deploy",
"title": "Deployment runbook",
"description": "How a release goes to production.",
"text": "1. Check that every test passed. 2. Tag the release ...",
"department_s": "Engineering",
"tags_sm": ["release", "production"],
"priority_i": 1,
"rating_f": 4.5,
"reviewed_dt": "2026-09-20T00:00:00Z",
"public_b": false,
"notes_t": "Searchable notes, not a filter"
}
Every suffix and what it allows (filter, facet, sort, full-text search): Dynamic fields. A field whose name matches nothing in the schema is refused by your index: the job then reports those documents as failed, with the reason.