Add any field with a suffix
You never edit the schema to add a field. Name it with the right ending, such as price_f or brand_sm, and it is created with the matching type the first time a document carries it. The ending decides everything: searched as text or matched exactly, and whether it can be a facet, be sorted or take a range.
The suffixes
| Suffix | Type | Example | Facet | Sort | Range | Search |
|---|---|---|---|---|---|---|
*_s | string | currency_s: "EUR" | List | yes | no | exact |
*_sm | string, list | brand_sm: ["Nike","Asics"] | List | no | no | exact |
*_ss | string, list | colour_ss: ["red","blue"] | List | no | no | exact |
*_t | text_general | specs_t: "Gore-Tex upper" | no | no | no | words |
*_i | pint | stock_i: 42 | List, Slider | yes | yes | no |
*_im | pint, list | sizes_im: [40,41,42] | List, Slider | no | yes | no |
*_l | plong | views_l: 1284930112 | List, Slider | yes | yes | no |
*_f | pfloat | price_f: 79.99 | List, Slider | yes | yes | no |
*_fm | pfloat, list | prices_fm: [79.99,69.99] | List, Slider | no | yes | no |
*_d | pdouble, list | weight_d: [0.245] | List, Slider | no | yes | no |
*_dt | pdate | date_dt: "2026-01-15T10:30:00Z" | List, Date range | yes | yes | no |
*_dtm | pdate, list | events_dtm: [...] | List, Date range | no | yes | no |
*_b | boolean | in_stock_b: true | List | yes | no | no |
meta_* | string | meta_sku: "AX-100" | List | yes | no | exact |
phonetic_* | text_general_phonetic | phonetic_text | no | no | no | sounds like |
ignored_*, *_nlp | ignored, list | ignored_debug | no | no | no | no |
Facet shows the sidebar filters a field can use: a whole-seconds _i or _l field can also be a Duration, and a list field named by level, such as breadcrumb_1_sm, a Hierarchical filter. See Facet fields.
Rules worth knowing
_dt field wants ISO 8601 in UTC: 2026-01-15T10:30:00Z. A bare 2026-01-15 or a Unix time is refused. Send Unix time in timestamp instead and Opensolr fills creation_date for you.meta_price_f matches meta_* before *_f, so it becomes a string and loses range filters. Keep type suffixes out of the meta_ names: use price_f.price, is refused and the document fails. Every field of your own needs a suffix or the meta_ prefix.brand_s: ["a","b"]) fails. One value sent to a list field is fine.sort=._s or meta_ field matches the whole value, upper and lower case included. When people should search the words in it, send them in a _t field too, or in text.price_f holds numbers, you cannot send "n/a" into it.A product, start to finish
One document pushed with Data Ingestion, and the searches its suffixes make possible.
{
"uri": "https://shop.example.com/products/trail-runner-x",
"title": "Trail Runner X",
"description": "Lightweight trail shoe with a Gore-Tex upper.",
"text": "Full product description, care instructions, reviews ...",
"timestamp": 1768473000,
"price_f": 129.0,
"currency_s": "EUR",
"brand_sm": ["Asics"],
"sizes_im": [40, 41, 42, 43],
"in_stock_b": true,
"specs_t": "Gore-Tex upper, Vibram sole, 245 g",
"meta_sku": "TRX-129"
}| You want | Parameter |
|---|---|
| Shoes between 100 and 150 euro | fq=price_f:[100 TO 150]&fq=currency_s:EUR |
| Only in stock, cheapest first | fq=in_stock_b:true&sort=price_f asc |
| Brand counts for the sidebar | facet=true&facet.field=brand_sm |
| Anything in size 42 | fq=sizes_im:42 |
| Added in the last 30 days | fq=creation_date:[NOW-30DAYS TO NOW] |
| Look up by your own SKU | fq=meta_sku:TRX-129 |
The hosted search page builds these for you from your Facets settings.