Search an index
Executes a search query against an index on the node that receives the request. A node that does not index the target answers from the generation it last pulled, so a recently indexed document may not appear yet.
Path parameters
namestringrequired@ and the name of the generation, such as books@2.Headers
X-Exofind-Freshnessanyfreshness.atLeast is read when both are given.Body
All request properties are optional. An empty request matches all documents in the index.
queryClause[]AND. Evaluated clauses narrow all facet counts. If omitted, matches all documents.Example
{ "field": "category", "match": { "value": "fiction" }}9 types
FieldClausetype: "field"search:usage_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}fieldstringrequired"category"Example
{ "value": "fiction"}9 types
EqualsMatchertype: "equals"value.Example
{ "value": "fiction"}valueanyrequired"fiction"InMatchertype: "in"values. An empty array matches no documents.Example
{ "type": "in", "values": [ "fiction", "poetry" ]}valuesany[]requiredAnyMatchertype: "any"Example
{ "type": "any"}PrefixMatchertype: "prefix"value, evaluated against the entire field value.Example
{ "type": "prefix", "value": "EX-"}valuestringrequired"EX-"UnderMatchertype: "under"hierarchy. Path segments must match complete levels, so Men/Sho matches nothing where a prefix matcher matches.Example
{ "type": "under", "path": "Men/Shoes"}pathstringrequired"Men/Shoes"RangeMatchertype: "range"gte, lte) and exclusive (gt, lt) bounds; either side may be left open, and at least one bound is required (search:matcher:range_empty).Example
{ "type": "range", "gte": 10, "lt": 20}gteany10gtanylteanyltany20RangesMatchertype: "ranges"in matcher.Example
{ "type": "ranges", "values": [ { "gte": 10, "lt": 20 }, { "gte": 50 } ]}valuesMatcherRange[]requiredfrom as gte and to as lt.Example
{ "gte": 10, "lt": 20}4 properties
gteany10gtanylteanyltany20TextMatchertype: "text"Example
{ "type": "text", "text": "silent spring", "match": "phrase"}textstringrequiredmatchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply. Setting join with any other match returns search:clause:join_unsupported.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows the field's typoTolerance configuration; off disables typo tolerance for the matcher.- Default
- "auto"
- Values
- "auto", "off"
slopintegerphrase queries or quoted phrases in user mode.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
interpretInterpretModeuser text are read as filters on the fields of the index: auto reads a number typed next to the unit of a number field, or next to a comparative word such as under, as a filter on that field; off takes every word as text. Whatever was read is reported as interpreted beside the results. See Reading numbers and units.- Default
- "auto"
- Values
- "auto", "off"
DistanceMatchertype: "distance"radius meters of the specified latitude and longitude coordinates.Example
{ "type": "distance", "lat": 59.3, "lon": 18.1, "radius": 5000}latnumberrequired- Format
- double
- Range
- -90 to 90
59.3lonnumberrequired- Format
- double
- Range
- -180 to 180
18.1radiusnumberrequired- Format
- double
5000"text"typoTolerance. Fields defined only for autocomplete do not support phrase matching. See text.Example
{ "type": "text", "text": "silent spr", "fields": { "name": 3, "description": null }}textstringrequired"silent spr"fieldsmap of numbernull uses the weight from its field definition. If omitted, searches all searchable fields, skipping autocomplete-only fields.1 property
<key>number- Format
- float
matchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply, and a filter read out of the text is one of the parts. Setting join with any other match returns search:clause:join_unsupported. See Reading what was typed.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows each field's typoTolerance configuration; off disables typo tolerance for the clause.- Default
- "auto"
- Values
- "auto", "off"
slopintegerslop above 0 with "match": "all" or "match": "any" returns search:clause:slop_unsupported.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
combineCombineterm evaluates each term across all targeted fields, so terms may appear in different fields; field requires a single field to satisfy match on its own. Ignored by phrase queries.- Default
- "term"
- Values
- "term", "field"
interpretInterpretuser text are read as filters on the fields of the index, given as a mode or as the targets to read on. See Reading numbers and units.- Default
- "auto"
2 types
user text are read as filters: auto reads a number typed next to a unit or a comparative word as a filter on the field declaring that unit, off takes every word as text.user text as filters on the named targets only. A number typed with a unit is read on every target declaring that unit; a number typed without one is read on every target holding a currency, when they all hold the same currency.Example
{ "fields": [ { "field": "prices.amount" } ]}Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}3 properties
fieldstringrequired"prices.amount"whenClause[]nested list, and for the document otherwise. Takes what a nested clause takes: field, text, and, or, not and boost. A clause naming a field outside the list returns search:nested:field_not_inside.Example
{ "field": "category", "match": { "value": "fiction" }}fallbackInterpretTarget[]search:interpret:fallback_unit_mismatch.Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}"knn"k nearest documents by vector distance in a specified field, scored by proximity. Cannot be combined with hits (search:hits:knn_unsupported).Example
{ "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 10, "filter": [ { "field": "published", "match": { "value": true } } ]}fieldstringrequired"embedding"vectornumber[]required- Format
- float
kintegerrequiredEXOFIND_SEARCH_MAX_KNN_K.- Format
- int32
filterClause[]Example
{ "field": "category", "match": { "value": "fiction" }}"nested"nested object field satisfies all child clauses. A nested clause on a flattened object field returns search:nested:path_not_nested; on a non-object field it returns an error. See nested.Example
{ "type": "nested", "path": "variants", "clauses": [ { "field": "variants.color", "match": { "value": "red" } }, { "field": "variants.price", "match": { "type": "range", "lt": 20 } } ]}pathstringrequired"variants"clausesClause[]field, text, knn, and, or, not and boost; a clause that only means something for whole documents, such as another nested or a fuse, returns search:nested:clause_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}scoreScore- Default
- "max"
- Values
- "max", "min", "avg", "total"
"and"Example
{ "type": "and", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "published", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"or"Example
{ "type": "or", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "category", "match": { "value": "poetry" } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"not"Example
{ "type": "not", "clauses": [ { "field": "discontinued", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"boost"Example
{ "type": "boost", "weight": 2, "clauses": [ { "field": "featured", "match": { "value": true } } ]}weightnumberrequired1 increase score; values between 0 and 1 decrease score. Leaving it out, or setting it below 0 or to a non-finite number, returns search:clause:weight_out_of_range.- Format
- float
2Example
{ "field": "category", "match": { "value": "fiction" }}"fuse"weight / (rankConstant + rank) across the rankings that reached them. Because the clause reads only result positions, scores from different scales (such as BM25 text relevance and vector similarity) combine without normalization. Matches at most depth results per ranking. See fuse.Example
{ "type": "fuse", "depth": 200, "rankConstant": 60, "rankings": [ { "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ] }, { "clauses": [ { "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 200 } ], "weight": 0.5 } ], "filter": [ { "field": "inStock", "match": { "value": true } } ]}search:clause:rankings_too_few.Example
{ "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ], "weight": 0.5}2 properties
AND. At least one clause is required.Example
{ "field": "category", "match": { "value": "fiction" }}weightnumber- Default
- 1
- Format
- float
depthintegerk in a knn clause. Must be at least 1, and at most EXOFIND_SEARCH_MAX_FUSE_DEPTH.- Default
- 100
- Format
- int32
rankConstantnumber0.- Default
- 60
- Format
- float
filterClause[]depth. A knn clause inside a ranking applies filter entries as a pre-filter, ensuring the vector ranking returns k results. Clauses placed beside the fuse clause filter the merged list after each ranking is cut to depth.Example
{ "field": "category", "match": { "value": "fiction" }}filtersClause[]field clauses or nested clauses. Filters narrow hits, but facets on the filtered field exclude their own filter entries from counts by default (see Facets). Unsupported clause types return search:filter:clause_unsupported. Clauses that score results return search:filter:scoring_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}9 types
FieldClausetype: "field"search:usage_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}fieldstringrequired"category"Example
{ "value": "fiction"}9 types
EqualsMatchertype: "equals"value.Example
{ "value": "fiction"}valueanyrequired"fiction"InMatchertype: "in"values. An empty array matches no documents.Example
{ "type": "in", "values": [ "fiction", "poetry" ]}valuesany[]requiredAnyMatchertype: "any"Example
{ "type": "any"}PrefixMatchertype: "prefix"value, evaluated against the entire field value.Example
{ "type": "prefix", "value": "EX-"}valuestringrequired"EX-"UnderMatchertype: "under"hierarchy. Path segments must match complete levels, so Men/Sho matches nothing where a prefix matcher matches.Example
{ "type": "under", "path": "Men/Shoes"}pathstringrequired"Men/Shoes"RangeMatchertype: "range"gte, lte) and exclusive (gt, lt) bounds; either side may be left open, and at least one bound is required (search:matcher:range_empty).Example
{ "type": "range", "gte": 10, "lt": 20}gteany10gtanylteanyltany20RangesMatchertype: "ranges"in matcher.Example
{ "type": "ranges", "values": [ { "gte": 10, "lt": 20 }, { "gte": 50 } ]}valuesMatcherRange[]requiredfrom as gte and to as lt.Example
{ "gte": 10, "lt": 20}4 properties
gteany10gtanylteanyltany20TextMatchertype: "text"Example
{ "type": "text", "text": "silent spring", "match": "phrase"}textstringrequiredmatchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply. Setting join with any other match returns search:clause:join_unsupported.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows the field's typoTolerance configuration; off disables typo tolerance for the matcher.- Default
- "auto"
- Values
- "auto", "off"
slopintegerphrase queries or quoted phrases in user mode.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
interpretInterpretModeuser text are read as filters on the fields of the index: auto reads a number typed next to the unit of a number field, or next to a comparative word such as under, as a filter on that field; off takes every word as text. Whatever was read is reported as interpreted beside the results. See Reading numbers and units.- Default
- "auto"
- Values
- "auto", "off"
DistanceMatchertype: "distance"radius meters of the specified latitude and longitude coordinates.Example
{ "type": "distance", "lat": 59.3, "lon": 18.1, "radius": 5000}latnumberrequired- Format
- double
- Range
- -90 to 90
59.3lonnumberrequired- Format
- double
- Range
- -180 to 180
18.1radiusnumberrequired- Format
- double
5000"text"typoTolerance. Fields defined only for autocomplete do not support phrase matching. See text.Example
{ "type": "text", "text": "silent spr", "fields": { "name": 3, "description": null }}textstringrequired"silent spr"fieldsmap of numbernull uses the weight from its field definition. If omitted, searches all searchable fields, skipping autocomplete-only fields.1 property
<key>number- Format
- float
matchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply, and a filter read out of the text is one of the parts. Setting join with any other match returns search:clause:join_unsupported. See Reading what was typed.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows each field's typoTolerance configuration; off disables typo tolerance for the clause.- Default
- "auto"
- Values
- "auto", "off"
slopintegerslop above 0 with "match": "all" or "match": "any" returns search:clause:slop_unsupported.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
combineCombineterm evaluates each term across all targeted fields, so terms may appear in different fields; field requires a single field to satisfy match on its own. Ignored by phrase queries.- Default
- "term"
- Values
- "term", "field"
interpretInterpretuser text are read as filters on the fields of the index, given as a mode or as the targets to read on. See Reading numbers and units.- Default
- "auto"
2 types
user text are read as filters: auto reads a number typed next to a unit or a comparative word as a filter on the field declaring that unit, off takes every word as text.user text as filters on the named targets only. A number typed with a unit is read on every target declaring that unit; a number typed without one is read on every target holding a currency, when they all hold the same currency.Example
{ "fields": [ { "field": "prices.amount" } ]}Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}3 properties
fieldstringrequired"prices.amount"whenClause[]nested list, and for the document otherwise. Takes what a nested clause takes: field, text, and, or, not and boost. A clause naming a field outside the list returns search:nested:field_not_inside.Example
{ "field": "category", "match": { "value": "fiction" }}fallbackInterpretTarget[]search:interpret:fallback_unit_mismatch.Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}"knn"k nearest documents by vector distance in a specified field, scored by proximity. Cannot be combined with hits (search:hits:knn_unsupported).Example
{ "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 10, "filter": [ { "field": "published", "match": { "value": true } } ]}fieldstringrequired"embedding"vectornumber[]required- Format
- float
kintegerrequiredEXOFIND_SEARCH_MAX_KNN_K.- Format
- int32
filterClause[]Example
{ "field": "category", "match": { "value": "fiction" }}"nested"nested object field satisfies all child clauses. A nested clause on a flattened object field returns search:nested:path_not_nested; on a non-object field it returns an error. See nested.Example
{ "type": "nested", "path": "variants", "clauses": [ { "field": "variants.color", "match": { "value": "red" } }, { "field": "variants.price", "match": { "type": "range", "lt": 20 } } ]}pathstringrequired"variants"clausesClause[]field, text, knn, and, or, not and boost; a clause that only means something for whole documents, such as another nested or a fuse, returns search:nested:clause_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}scoreScore- Default
- "max"
- Values
- "max", "min", "avg", "total"
"and"Example
{ "type": "and", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "published", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"or"Example
{ "type": "or", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "category", "match": { "value": "poetry" } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"not"Example
{ "type": "not", "clauses": [ { "field": "discontinued", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"boost"Example
{ "type": "boost", "weight": 2, "clauses": [ { "field": "featured", "match": { "value": true } } ]}weightnumberrequired1 increase score; values between 0 and 1 decrease score. Leaving it out, or setting it below 0 or to a non-finite number, returns search:clause:weight_out_of_range.- Format
- float
2Example
{ "field": "category", "match": { "value": "fiction" }}"fuse"weight / (rankConstant + rank) across the rankings that reached them. Because the clause reads only result positions, scores from different scales (such as BM25 text relevance and vector similarity) combine without normalization. Matches at most depth results per ranking. See fuse.Example
{ "type": "fuse", "depth": 200, "rankConstant": 60, "rankings": [ { "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ] }, { "clauses": [ { "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 200 } ], "weight": 0.5 } ], "filter": [ { "field": "inStock", "match": { "value": true } } ]}search:clause:rankings_too_few.Example
{ "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ], "weight": 0.5}2 properties
AND. At least one clause is required.Example
{ "field": "category", "match": { "value": "fiction" }}weightnumber- Default
- 1
- Format
- float
depthintegerk in a knn clause. Must be at least 1, and at most EXOFIND_SEARCH_MAX_FUSE_DEPTH.- Default
- 100
- Format
- int32
rankConstantnumber0.- Default
- 60
- Format
- float
filterClause[]depth. A knn clause inside a ranking applies filter entries as a pre-filter, ensuring the vector ranking returns k results. Clauses placed beside the fuse clause filter the merged list after each ranking is cut to depth.Example
{ "field": "category", "match": { "value": "fiction" }}facetsFacetRequest[]Example
{ "field": "category", "limit": 20, "order": "count"}8 properties
namestringsearch:facet:name_duplicate. Defaults to the field name.fieldstringrequired"category"limitintegerEXOFIND_SEARCH_MAX_FACET_VALUES.- Default
- 10
- Format
- int32
- Range
- 1 or more
orderFacetOrder"count" (descending by count), "value" (ascending by value), or "declared" (the order the search settings declare for the field's values, followed by every other value by count).- Default
- "count"
- Values
- "count", "value", "declared"
rangesFacetRange[]limit or order (search:facet:ranges_conflicting).Example
{ "from": 100, "to": 200}2 properties
fromany100toany200pathstringdepthintegerpath to count.- Default
- 1
- Format
- int32
- Range
- 1 to 10
excludeFiltersstring[][] disables filter exclusion. A blank path returns search:facet:exclude_filters_invalid.sortSort[]Example
{ "field": "name", "order": "asc"}3 types
FieldSorttype: "field"nested object is named by its dotted path, and only the nested values that the query's nested clauses matched are considered.Example
{ "field": "name", "order": "asc"}fieldstringrequired"name"ScoreSorttype: "score"Example
{ "type": "score"}DistanceSorttype: "distance"order property. A distance sort on a nested object field returns search:sort:nested_unsupported.Example
{ "type": "distance", "field": "location", "lat": 59.3, "lon": 18.1}fieldstringrequired"location"latnumberrequired- Format
- double
- Range
- -90 to 90
59.3lonnumberrequired- Format
- double
- Range
- -180 to 180
18.1localestringsv-SE falls back to sv). If no matching variant exists, uses the field default."sv"fieldsstring[]object are specified by dotted path and returned nested inside the object. Requesting unretrievable fields returns an error (see Document source). The primary key is always included.highlightHighlightExample
{ "fields": { "name": {}, "description": { "fragments": 2 } }}1 property
fieldsmap of HighlightFieldrequiredmatching or autocomplete); requesting an unconfigured field returns search:usage_unsupported.1 property
<key>HighlightFieldExample
{ "fragments": 2, "length": 150, "pre": "<mark>", "post": "</mark>"}4 properties
fragmentsinteger- Default
- 3
- Format
- int32
lengthinteger- Default
- 150
- Format
- int32
- Range
- 1 to 10000
prestring- Default
- "<em>"
poststring- Default
- "</em>"
matchedMatchedExample
{ "fields": { "variants": { "limit": 3 } }}1 property
fieldsmap of MatchedFieldrequirednested object returns search:matched:field_not_nested.1 property
<key>MatchedFieldExample
{ "limit": 3, "fields": [ "variants.color" ]}2 properties
limitinteger- Default
- 3
- Format
- int32
- Range
- 1 to 100
fieldsstring[]search:matched:field_not_inside) and exist in the schema (search:field_unknown). On an index whose source is none, a named field has to be stored (search:usage_unsupported).hitsHitsExample
{ "path": "variants", "fields": [ "variants.color", "variants.price" ]}3 properties
pathstringrequirednested object returns search:hits:path_not_nested."variants"fieldsstring[]value, defaulting to all of them. Names must be prefixed by path (search:hits:field_not_inside) and exist in the index (search:field_unknown). On an index whose source is none, a named field has to be stored (search:usage_unsupported).whenClause[]AND, and specified as field or nested clauses. If omitted, every matching document expands. Unsupported clause types return search:hits:when_clause_unsupported; clauses that score return search:hits:when_scoring_unsupported. Sorting by a field is refused while this is set (search:hits:when_sort_unsupported).Example
{ "field": "category", "match": { "value": "fiction" }}9 types
FieldClausetype: "field"search:usage_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}fieldstringrequired"category"Example
{ "value": "fiction"}9 types
EqualsMatchertype: "equals"value.Example
{ "value": "fiction"}valueanyrequired"fiction"InMatchertype: "in"values. An empty array matches no documents.Example
{ "type": "in", "values": [ "fiction", "poetry" ]}valuesany[]requiredAnyMatchertype: "any"Example
{ "type": "any"}PrefixMatchertype: "prefix"value, evaluated against the entire field value.Example
{ "type": "prefix", "value": "EX-"}valuestringrequired"EX-"UnderMatchertype: "under"hierarchy. Path segments must match complete levels, so Men/Sho matches nothing where a prefix matcher matches.Example
{ "type": "under", "path": "Men/Shoes"}pathstringrequired"Men/Shoes"RangeMatchertype: "range"gte, lte) and exclusive (gt, lt) bounds; either side may be left open, and at least one bound is required (search:matcher:range_empty).Example
{ "type": "range", "gte": 10, "lt": 20}gteany10gtanylteanyltany20RangesMatchertype: "ranges"in matcher.Example
{ "type": "ranges", "values": [ { "gte": 10, "lt": 20 }, { "gte": 50 } ]}valuesMatcherRange[]requiredfrom as gte and to as lt.Example
{ "gte": 10, "lt": 20}TextMatchertype: "text"Example
{ "type": "text", "text": "silent spring", "match": "phrase"}textstringrequiredmatchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply. Setting join with any other match returns search:clause:join_unsupported.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows the field's typoTolerance configuration; off disables typo tolerance for the matcher.- Default
- "auto"
- Values
- "auto", "off"
slopintegerphrase queries or quoted phrases in user mode.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
interpretInterpretModeuser text are read as filters on the fields of the index: auto reads a number typed next to the unit of a number field, or next to a comparative word such as under, as a filter on that field; off takes every word as text. Whatever was read is reported as interpreted beside the results. See Reading numbers and units.- Default
- "auto"
- Values
- "auto", "off"
DistanceMatchertype: "distance"radius meters of the specified latitude and longitude coordinates.Example
{ "type": "distance", "lat": 59.3, "lon": 18.1, "radius": 5000}latnumberrequired- Format
- double
- Range
- -90 to 90
59.3lonnumberrequired- Format
- double
- Range
- -180 to 180
18.1radiusnumberrequired- Format
- double
5000"text"typoTolerance. Fields defined only for autocomplete do not support phrase matching. See text.Example
{ "type": "text", "text": "silent spr", "fields": { "name": 3, "description": null }}textstringrequired"silent spr"fieldsmap of numbernull uses the weight from its field definition. If omitted, searches all searchable fields, skipping autocomplete-only fields.1 property
<key>number- Format
- float
matchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply, and a filter read out of the text is one of the parts. Setting join with any other match returns search:clause:join_unsupported. See Reading what was typed.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows each field's typoTolerance configuration; off disables typo tolerance for the clause.- Default
- "auto"
- Values
- "auto", "off"
slopintegerslop above 0 with "match": "all" or "match": "any" returns search:clause:slop_unsupported.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
combineCombineterm evaluates each term across all targeted fields, so terms may appear in different fields; field requires a single field to satisfy match on its own. Ignored by phrase queries.- Default
- "term"
- Values
- "term", "field"
interpretInterpretuser text are read as filters on the fields of the index, given as a mode or as the targets to read on. See Reading numbers and units.- Default
- "auto"
2 types
user text are read as filters: auto reads a number typed next to a unit or a comparative word as a filter on the field declaring that unit, off takes every word as text.user text as filters on the named targets only. A number typed with a unit is read on every target declaring that unit; a number typed without one is read on every target holding a currency, when they all hold the same currency.Example
{ "fields": [ { "field": "prices.amount" } ]}Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}"knn"k nearest documents by vector distance in a specified field, scored by proximity. Cannot be combined with hits (search:hits:knn_unsupported).Example
{ "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 10, "filter": [ { "field": "published", "match": { "value": true } } ]}fieldstringrequired"embedding"vectornumber[]required- Format
- float
kintegerrequiredEXOFIND_SEARCH_MAX_KNN_K.- Format
- int32
filterClause[]Example
{ "field": "category", "match": { "value": "fiction" }}"nested"nested object field satisfies all child clauses. A nested clause on a flattened object field returns search:nested:path_not_nested; on a non-object field it returns an error. See nested.Example
{ "type": "nested", "path": "variants", "clauses": [ { "field": "variants.color", "match": { "value": "red" } }, { "field": "variants.price", "match": { "type": "range", "lt": 20 } } ]}pathstringrequired"variants"clausesClause[]field, text, knn, and, or, not and boost; a clause that only means something for whole documents, such as another nested or a fuse, returns search:nested:clause_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}scoreScore- Default
- "max"
- Values
- "max", "min", "avg", "total"
"and"Example
{ "type": "and", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "published", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"or"Example
{ "type": "or", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "category", "match": { "value": "poetry" } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"not"Example
{ "type": "not", "clauses": [ { "field": "discontinued", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"boost"Example
{ "type": "boost", "weight": 2, "clauses": [ { "field": "featured", "match": { "value": true } } ]}weightnumberrequired1 increase score; values between 0 and 1 decrease score. Leaving it out, or setting it below 0 or to a non-finite number, returns search:clause:weight_out_of_range.- Format
- float
2Example
{ "field": "category", "match": { "value": "fiction" }}"fuse"weight / (rankConstant + rank) across the rankings that reached them. Because the clause reads only result positions, scores from different scales (such as BM25 text relevance and vector similarity) combine without normalization. Matches at most depth results per ranking. See fuse.Example
{ "type": "fuse", "depth": 200, "rankConstant": 60, "rankings": [ { "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ] }, { "clauses": [ { "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 200 } ], "weight": 0.5 } ], "filter": [ { "field": "inStock", "match": { "value": true } } ]}search:clause:rankings_too_few.Example
{ "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ], "weight": 0.5}2 properties
AND. At least one clause is required.Example
{ "field": "category", "match": { "value": "fiction" }}weightnumber- Default
- 1
- Format
- float
depthintegerk in a knn clause. Must be at least 1, and at most EXOFIND_SEARCH_MAX_FUSE_DEPTH.- Default
- 100
- Format
- int32
rankConstantnumber0.- Default
- 60
- Format
- float
filterClause[]depth. A knn clause inside a ranking applies filter entries as a pre-filter, ensuring the vector ranking returns k results. Clauses placed beside the fuse clause filter the merged list after each ranking is cut to depth.Example
{ "field": "category", "match": { "value": "fiction" }}limitintegerEXOFIND_SEARCH_MAX_LIMIT. Setting limit to 0 returns the total match count without hits.- Default
- 10
- Format
- int32
offsetintegeroffset, after, or before.- Default
- 0
- Format
- int32
afterstringnext property of a previous response to fetch the next page.beforestringprevious property of a previous response to fetch the preceding page.pagesPagesRequest{ "max": n } object to limit the number of page entries (default 9). Implies "total": "exact".Example
{ "max": 9}1 property
maxinteger- Default
- 9
- Format
- int32
totalTotalMode"estimate" counts until exceeding the returned window; "exact" counts every matching document.- Default
- "estimate"
- Values
- "estimate", "exact"
signalsSignal[]signalsMode says otherwise. See Signals. If omitted, uses the ranking signals configured on the index.Example
{ "field": "purchases", "saturation": { "pivot": 50 }, "weight": 0.5}5 properties
fieldstringrequired"purchases"saturationSaturationExample
{ "pivot": 50}1 property
pivotnumberrequired- Format
- double
50decayDecayExample
{ "halfLife": 604800}1 property
halfLifeintegerrequired- Format
- int64
604800linearLinearvalue / ceiling held between 0 and 1. For number fields holding a score computed elsewhere.Example
{ "ceiling": 1}1 property
ceilingnumberrequired- Format
- double
1weightnumber- Default
- 1
- Format
- float
signalsModeSignalsModesignals meets the ranking configured on the index: "add" ranks by both, with a signal here standing in for one on the same field; "replace" ranks by signals alone. Supplying this without signals returns search:signal:mode_without_signals.- Default
- "add"
- Values
- "add", "replace"
rescoreRescoreExample
{ "window": 200, "boost": [ { "field": "brand", "match": { "value": "adidas" } } ], "signals": [ { "field": "purchases", "saturation": { "pivot": 50 } } ], "weight": 0.5}4 properties
windowintegerrequiredoffset plus limit, and at most EXOFIND_SEARCH_MAX_RESCORE_WINDOW.- Format
- int32
200boostClause[]boost to weigh it against the others.Example
{ "field": "category", "match": { "value": "fiction" }}9 types
FieldClausetype: "field"search:usage_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}fieldstringrequired"category"Example
{ "value": "fiction"}9 types
EqualsMatchertype: "equals"value.Example
{ "value": "fiction"}valueanyrequired"fiction"InMatchertype: "in"values. An empty array matches no documents.Example
{ "type": "in", "values": [ "fiction", "poetry" ]}valuesany[]requiredAnyMatchertype: "any"Example
{ "type": "any"}PrefixMatchertype: "prefix"value, evaluated against the entire field value.Example
{ "type": "prefix", "value": "EX-"}valuestringrequired"EX-"UnderMatchertype: "under"hierarchy. Path segments must match complete levels, so Men/Sho matches nothing where a prefix matcher matches.Example
{ "type": "under", "path": "Men/Shoes"}pathstringrequired"Men/Shoes"RangeMatchertype: "range"gte, lte) and exclusive (gt, lt) bounds; either side may be left open, and at least one bound is required (search:matcher:range_empty).Example
{ "type": "range", "gte": 10, "lt": 20}gteany10gtanylteanyltany20RangesMatchertype: "ranges"in matcher.Example
{ "type": "ranges", "values": [ { "gte": 10, "lt": 20 }, { "gte": 50 } ]}valuesMatcherRange[]requiredfrom as gte and to as lt.Example
{ "gte": 10, "lt": 20}TextMatchertype: "text"Example
{ "type": "text", "text": "silent spring", "match": "phrase"}textstringrequiredmatchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply. Setting join with any other match returns search:clause:join_unsupported.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows the field's typoTolerance configuration; off disables typo tolerance for the matcher.- Default
- "auto"
- Values
- "auto", "off"
slopintegerphrase queries or quoted phrases in user mode.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
interpretInterpretModeuser text are read as filters on the fields of the index: auto reads a number typed next to the unit of a number field, or next to a comparative word such as under, as a filter on that field; off takes every word as text. Whatever was read is reported as interpreted beside the results. See Reading numbers and units.- Default
- "auto"
- Values
- "auto", "off"
DistanceMatchertype: "distance"radius meters of the specified latitude and longitude coordinates.Example
{ "type": "distance", "lat": 59.3, "lon": 18.1, "radius": 5000}latnumberrequired- Format
- double
- Range
- -90 to 90
59.3lonnumberrequired- Format
- double
- Range
- -180 to 180
18.1radiusnumberrequired- Format
- double
5000"text"typoTolerance. Fields defined only for autocomplete do not support phrase matching. See text.Example
{ "type": "text", "text": "silent spr", "fields": { "name": 3, "description": null }}textstringrequired"silent spr"fieldsmap of numbernull uses the weight from its field definition. If omitted, searches all searchable fields, skipping autocomplete-only fields.1 property
<key>number- Format
- float
matchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply, and a filter read out of the text is one of the parts. Setting join with any other match returns search:clause:join_unsupported. See Reading what was typed.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows each field's typoTolerance configuration; off disables typo tolerance for the clause.- Default
- "auto"
- Values
- "auto", "off"
slopintegerslop above 0 with "match": "all" or "match": "any" returns search:clause:slop_unsupported.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
combineCombineterm evaluates each term across all targeted fields, so terms may appear in different fields; field requires a single field to satisfy match on its own. Ignored by phrase queries.- Default
- "term"
- Values
- "term", "field"
interpretInterpretuser text are read as filters on the fields of the index, given as a mode or as the targets to read on. See Reading numbers and units.- Default
- "auto"
2 types
user text are read as filters: auto reads a number typed next to a unit or a comparative word as a filter on the field declaring that unit, off takes every word as text.user text as filters on the named targets only. A number typed with a unit is read on every target declaring that unit; a number typed without one is read on every target holding a currency, when they all hold the same currency.Example
{ "fields": [ { "field": "prices.amount" } ]}Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}"knn"k nearest documents by vector distance in a specified field, scored by proximity. Cannot be combined with hits (search:hits:knn_unsupported).Example
{ "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 10, "filter": [ { "field": "published", "match": { "value": true } } ]}fieldstringrequired"embedding"vectornumber[]required- Format
- float
kintegerrequiredEXOFIND_SEARCH_MAX_KNN_K.- Format
- int32
filterClause[]Example
{ "field": "category", "match": { "value": "fiction" }}"nested"nested object field satisfies all child clauses. A nested clause on a flattened object field returns search:nested:path_not_nested; on a non-object field it returns an error. See nested.Example
{ "type": "nested", "path": "variants", "clauses": [ { "field": "variants.color", "match": { "value": "red" } }, { "field": "variants.price", "match": { "type": "range", "lt": 20 } } ]}pathstringrequired"variants"clausesClause[]field, text, knn, and, or, not and boost; a clause that only means something for whole documents, such as another nested or a fuse, returns search:nested:clause_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}scoreScore- Default
- "max"
- Values
- "max", "min", "avg", "total"
"and"Example
{ "type": "and", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "published", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"or"Example
{ "type": "or", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "category", "match": { "value": "poetry" } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"not"Example
{ "type": "not", "clauses": [ { "field": "discontinued", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"boost"Example
{ "type": "boost", "weight": 2, "clauses": [ { "field": "featured", "match": { "value": true } } ]}weightnumberrequired1 increase score; values between 0 and 1 decrease score. Leaving it out, or setting it below 0 or to a non-finite number, returns search:clause:weight_out_of_range.- Format
- float
2Example
{ "field": "category", "match": { "value": "fiction" }}"fuse"weight / (rankConstant + rank) across the rankings that reached them. Because the clause reads only result positions, scores from different scales (such as BM25 text relevance and vector similarity) combine without normalization. Matches at most depth results per ranking. See fuse.Example
{ "type": "fuse", "depth": 200, "rankConstant": 60, "rankings": [ { "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ] }, { "clauses": [ { "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 200 } ], "weight": 0.5 } ], "filter": [ { "field": "inStock", "match": { "value": true } } ]}search:clause:rankings_too_few.Example
{ "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ], "weight": 0.5}2 properties
AND. At least one clause is required.Example
{ "field": "category", "match": { "value": "fiction" }}weightnumber- Default
- 1
- Format
- float
depthintegerk in a knn clause. Must be at least 1, and at most EXOFIND_SEARCH_MAX_FUSE_DEPTH.- Default
- 100
- Format
- int32
rankConstantnumber0.- Default
- 60
- Format
- float
filterClause[]depth. A knn clause inside a ranking applies filter entries as a pre-filter, ensuring the vector ranking returns k results. Clauses placed beside the fuse clause filter the merged list after each ranking is cut to depth.Example
{ "field": "category", "match": { "value": "fiction" }}signalsSignal[]signals. Applied to every result in the window. The ranking configured on the index belongs to the first pass and is not applied again here, so signalsMode does not affect these.Example
{ "field": "purchases", "saturation": { "pivot": 50 }, "weight": 0.5}5 properties
fieldstringrequired"purchases"saturationSaturationExample
{ "pivot": 50}1 property
pivotnumberrequired- Format
- double
50decayDecayExample
{ "halfLife": 604800}1 property
halfLifeintegerrequired- Format
- int64
604800linearLinearvalue / ceiling held between 0 and 1. For number fields holding a score computed elsewhere.Example
{ "ceiling": 1}1 property
ceilingnumberrequired- Format
- double
1weightnumber- Default
- 1
- Format
- float
weightnumber- Default
- 1
- Format
- float
freshnessFreshness1 property
atLeaststringfreshness property or X-Exofind-Freshness header. The node answers only once it holds the state the token describes: the generation, the commit and the search settings. A node that is behind commits, pulls or reads the settings first, and answers search:freshness:unavailable with a Retry-After header when it has waited EXOFIND_SEARCH_FRESHNESS_WAIT without reaching the state. The token is opaque; pass it back unchanged."AQoIcHJvZHVjdHMSATIYBw"Responses
sort asks for.SearchResponse
The results of a search. See Response.
hitsHit[]sort asked for.Example
{ "id": "9781234567890", "score": 8.42, "document": { "name": "Silent Spring", "price": 12.5 }, "highlights": { "name": [ "Silent <em>Spring</em>" ] }}8 properties
idanyid when several values of one document matched - the identity of such a hit is id together with key, or with index on a field that declares no key.9781234567890indexintegerkey is what does not move.- Format
- int32
keystringkey its object field declares. Two values of one document never read the same, so id and key name one value and go on naming it after a reindex. Omitted for a document hit, for a field that declares no key, and on an index whose source is none when the key's field is not stored.scorenumberrescore is ordered by nothing a score could say. A value hit scores what its document scored plus what the value itself scored under the nested clauses of its path.- Format
- float
8.42valueobjectsource is none it holds the value's stored fields, and is omitted when nothing of the value is stored.documentobjectfields property, keyed by field name and shaped as indexed. A field declared multiple is an array, and a locale-specific field is an object holding the single variant read for the query locale. For a value hit, returns the fields of the parent document.highlightsmap of string[]1 property
<key>string[]matchedmap of MatchedValues1 property
<key>MatchedValuesExample
{ "values": [ { "color": "red", "price": 18 }, { "color": "blue", "price": 19.5 } ], "totalValues": 5}2 properties
valuesany[]limit. If scoring clauses exist within the nested clause, values are ordered by score; otherwise, they appear in document order. On an index whose source is none each value holds its stored fields, and the array is omitted when nothing of the values is stored.totalValuesintegervalues when the limit is reached.- Format
- int32
totalTotalExample
{ "count": 128, "exact": true}2 properties
countinteger- Format
- int64
128exactbooleancount is exact or a lower bound. Always true when "total": "exact" is requested or when calculating facets.documentsTotalhits names a when, where some documents expand into values and the rest do not; omitted otherwise, where it would be the same number as total. A document that when expands with no matching value under path counts here while answering with no hit.Example
{ "count": 128, "exact": true}2 properties
countinteger- Format
- int64
128exactbooleancount is exact or a lower bound. Always true when "total": "exact" is requested or when calculating facets.facetsmap of FacetResult1 property
<key>FacetResultvalues with totalValues; counting into ranges returns buckets, omitting the other representation. Facet counts exclude filter entries on the facet's own field by default.Example
{ "values": [ { "value": "fiction", "count": 87 }, { "value": "poetry", "count": 41 } ], "totalValues": 2}3 properties
valuesFacetValue[]Example
{ "value": "fiction", "count": 87, "label": "Fiction"}6 properties
valueany"fiction"countinteger- Format
- int64
87labelstring"Fiction"pathstringunder filter matchers. Omitted for non-hierarchical fields."Men/Shoes"valuesFacetValue[]depth levels below the current path. Omitted at the maximum counted depth and for non-hierarchical fields.Example
{ "value": "fiction", "count": 87, "label": "Fiction"}totalValuesintegervalues when the limit is reached, and no count covers the values left out. Omitted for non-hierarchical fields.- Format
- int32
totalValuesintegervalues when the limit is reached, and no count covers the values left out.- Format
- int32
bucketsFacetBucket[]Example
{ "from": 100, "to": 200, "count": 17}3 properties
fromany100toany200countinteger- Format
- int64
17pagePageExample
{ "limit": 20, "offset": 0, "next": "AWtaPJHiAAAS1QFmQErhSA"}5 properties
limitinteger- Format
- int32
20offsetintegernext or previous cursors. Cursors encode positions rather than count offsets and are not restricted by EXOFIND_SEARCH_MAX_PAGE_DEPTH.- Format
- int32
previousstringbefore. Omitted on the first window of a search paged by offset. A window reached by a cursor carries it whenever the window is full, which says there may be results before it rather than that there are, so following it can answer an empty window.nextstringafter. Omitted on the final window of a search paged by offset. A window reached by a cursor carries it whenever the window is full, which says there may be results after it rather than that there are, so following it can answer an empty window. A cursor is an opaque token. Pass it back as it arrived, and do not read anything out of it.pagesPagesResultExample
{ "count": 7, "next": { "number": 4, "cursor": "AW9aPJHiAAAAPA" }, "start": [ { "number": 1, "cursor": "AW9aPJHiAAAAAA" }, { "number": 2, "cursor": "AW9aPJHiAAAAFA" }, { "number": 3, "cursor": "AW9aPJHiAAAAKA", "current": true } ], "end": [ { "number": 7, "cursor": "AW9aPJHiAAAAeA" } ]}6 properties
countinteger- Format
- int64
7previousPageRefExample
{ "number": 3, "cursor": "AW9aPJHiAAAAKA", "current": true}3 properties
numberinteger- Format
- int64
3cursorstringafter.currentbooleannextPageRefExample
{ "number": 3, "cursor": "AW9aPJHiAAAAKA", "current": true}3 properties
numberinteger- Format
- int64
3cursorstringafter.currentbooleanstartPageRef[]Example
{ "number": 3, "cursor": "AW9aPJHiAAAAKA", "current": true}3 properties
numberinteger- Format
- int64
3cursorstringafter.currentbooleanmiddlePageRef[]Example
{ "number": 3, "cursor": "AW9aPJHiAAAAKA", "current": true}3 properties
numberinteger- Format
- int64
3cursorstringafter.currentbooleanendPageRef[]Example
{ "number": 3, "cursor": "AW9aPJHiAAAAKA", "current": true}3 properties
numberinteger- Format
- int64
3cursorstringafter.currentbooleanrelaxedRelaxedExample
{ "dropped": [ { "word": "waterproof", "reason": "unmatched" } ], "text": "running shoes"}2 properties
droppedDropped[]Example
{ "word": "waterproof", "reason": "unmatched"}2 properties
wordstring"waterproof"reasonReason- Values
- "unmatched", "common"
textstring"running shoes"interpretedInterpretedExample
{ "filters": [ { "field": "price", "match": { "type": "range", "lt": 500 }, "words": [ "under", "500" ] } ], "text": "shoes"}2 properties
filtersFilter[]Example
{ "field": "price", "match": { "type": "range", "lt": 500 }, "words": [ "under", "500" ]}5 properties
fieldstring"price"whenClause[]when of the target the request named. Absent when the filter is read wherever the field holds a value.Example
{ "field": "category", "match": { "value": "fiction" }}9 types
FieldClausetype: "field"search:usage_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}fieldstringrequired"category"Example
{ "value": "fiction"}9 types
EqualsMatchertype: "equals"value.Example
{ "value": "fiction"}valueanyrequired"fiction"InMatchertype: "in"values. An empty array matches no documents.Example
{ "type": "in", "values": [ "fiction", "poetry" ]}valuesany[]requiredAnyMatchertype: "any"Example
{ "type": "any"}PrefixMatchertype: "prefix"value, evaluated against the entire field value.Example
{ "type": "prefix", "value": "EX-"}valuestringrequired"EX-"UnderMatchertype: "under"hierarchy. Path segments must match complete levels, so Men/Sho matches nothing where a prefix matcher matches.Example
{ "type": "under", "path": "Men/Shoes"}pathstringrequired"Men/Shoes"RangeMatchertype: "range"gte, lte) and exclusive (gt, lt) bounds; either side may be left open, and at least one bound is required (search:matcher:range_empty).Example
{ "type": "range", "gte": 10, "lt": 20}gteany10gtanylteanyltany20RangesMatchertype: "ranges"in matcher.Example
{ "type": "ranges", "values": [ { "gte": 10, "lt": 20 }, { "gte": 50 } ]}valuesMatcherRange[]requiredfrom as gte and to as lt.Example
{ "gte": 10, "lt": 20}TextMatchertype: "text"Example
{ "type": "text", "text": "silent spring", "match": "phrase"}textstringrequiredmatchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply. Setting join with any other match returns search:clause:join_unsupported.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows the field's typoTolerance configuration; off disables typo tolerance for the matcher.- Default
- "auto"
- Values
- "auto", "off"
slopintegerphrase queries or quoted phrases in user mode.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
interpretInterpretModeuser text are read as filters on the fields of the index: auto reads a number typed next to the unit of a number field, or next to a comparative word such as under, as a filter on that field; off takes every word as text. Whatever was read is reported as interpreted beside the results. See Reading numbers and units.- Default
- "auto"
- Values
- "auto", "off"
DistanceMatchertype: "distance"radius meters of the specified latitude and longitude coordinates.Example
{ "type": "distance", "lat": 59.3, "lon": 18.1, "radius": 5000}latnumberrequired- Format
- double
- Range
- -90 to 90
59.3lonnumberrequired- Format
- double
- Range
- -180 to 180
18.1radiusnumberrequired- Format
- double
5000"text"typoTolerance. Fields defined only for autocomplete do not support phrase matching. See text.Example
{ "type": "text", "text": "silent spr", "fields": { "name": 3, "description": null }}textstringrequired"silent spr"fieldsmap of numbernull uses the weight from its field definition. If omitted, searches all searchable fields, skipping autocomplete-only fields.1 property
<key>number- Format
- float
matchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply, and a filter read out of the text is one of the parts. Setting join with any other match returns search:clause:join_unsupported. See Reading what was typed.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows each field's typoTolerance configuration; off disables typo tolerance for the clause.- Default
- "auto"
- Values
- "auto", "off"
slopintegerslop above 0 with "match": "all" or "match": "any" returns search:clause:slop_unsupported.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
combineCombineterm evaluates each term across all targeted fields, so terms may appear in different fields; field requires a single field to satisfy match on its own. Ignored by phrase queries.- Default
- "term"
- Values
- "term", "field"
interpretInterpretuser text are read as filters on the fields of the index, given as a mode or as the targets to read on. See Reading numbers and units.- Default
- "auto"
2 types
user text are read as filters: auto reads a number typed next to a unit or a comparative word as a filter on the field declaring that unit, off takes every word as text.user text as filters on the named targets only. A number typed with a unit is read on every target declaring that unit; a number typed without one is read on every target holding a currency, when they all hold the same currency.Example
{ "fields": [ { "field": "prices.amount" } ]}Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}"knn"k nearest documents by vector distance in a specified field, scored by proximity. Cannot be combined with hits (search:hits:knn_unsupported).Example
{ "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 10, "filter": [ { "field": "published", "match": { "value": true } } ]}fieldstringrequired"embedding"vectornumber[]required- Format
- float
kintegerrequiredEXOFIND_SEARCH_MAX_KNN_K.- Format
- int32
filterClause[]Example
{ "field": "category", "match": { "value": "fiction" }}"nested"nested object field satisfies all child clauses. A nested clause on a flattened object field returns search:nested:path_not_nested; on a non-object field it returns an error. See nested.Example
{ "type": "nested", "path": "variants", "clauses": [ { "field": "variants.color", "match": { "value": "red" } }, { "field": "variants.price", "match": { "type": "range", "lt": 20 } } ]}pathstringrequired"variants"clausesClause[]field, text, knn, and, or, not and boost; a clause that only means something for whole documents, such as another nested or a fuse, returns search:nested:clause_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}scoreScore- Default
- "max"
- Values
- "max", "min", "avg", "total"
"and"Example
{ "type": "and", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "published", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"or"Example
{ "type": "or", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "category", "match": { "value": "poetry" } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"not"Example
{ "type": "not", "clauses": [ { "field": "discontinued", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"boost"Example
{ "type": "boost", "weight": 2, "clauses": [ { "field": "featured", "match": { "value": true } } ]}weightnumberrequired1 increase score; values between 0 and 1 decrease score. Leaving it out, or setting it below 0 or to a non-finite number, returns search:clause:weight_out_of_range.- Format
- float
2Example
{ "field": "category", "match": { "value": "fiction" }}"fuse"weight / (rankConstant + rank) across the rankings that reached them. Because the clause reads only result positions, scores from different scales (such as BM25 text relevance and vector similarity) combine without normalization. Matches at most depth results per ranking. See fuse.Example
{ "type": "fuse", "depth": 200, "rankConstant": 60, "rankings": [ { "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ] }, { "clauses": [ { "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 200 } ], "weight": 0.5 } ], "filter": [ { "field": "inStock", "match": { "value": true } } ]}search:clause:rankings_too_few.Example
{ "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ], "weight": 0.5}2 properties
AND. At least one clause is required.Example
{ "field": "category", "match": { "value": "fiction" }}weightnumber- Default
- 1
- Format
- float
depthintegerk in a knn clause. Must be at least 1, and at most EXOFIND_SEARCH_MAX_FUSE_DEPTH.- Default
- 100
- Format
- int32
rankConstantnumber0.- Default
- 60
- Format
- float
filterClause[]depth. A knn clause inside a ranking applies filter entries as a pre-filter, ensuring the vector ranking returns k results. Clauses placed beside the fuse clause filter the merged list after each ranking is cut to depth.Example
{ "field": "category", "match": { "value": "fiction" }}matchMatchermatch of a field clause takes: a range for a bound, an equals for a number written with its unit and nothing else. Can be sent back as a filter as it is.Example
{ "value": "fiction"}9 types
EqualsMatchertype: "equals"value.Example
{ "value": "fiction"}valueanyrequired"fiction"InMatchertype: "in"values. An empty array matches no documents.Example
{ "type": "in", "values": [ "fiction", "poetry" ]}valuesany[]requiredAnyMatchertype: "any"Example
{ "type": "any"}PrefixMatchertype: "prefix"value, evaluated against the entire field value.Example
{ "type": "prefix", "value": "EX-"}valuestringrequired"EX-"UnderMatchertype: "under"hierarchy. Path segments must match complete levels, so Men/Sho matches nothing where a prefix matcher matches.Example
{ "type": "under", "path": "Men/Shoes"}pathstringrequired"Men/Shoes"RangeMatchertype: "range"gte, lte) and exclusive (gt, lt) bounds; either side may be left open, and at least one bound is required (search:matcher:range_empty).Example
{ "type": "range", "gte": 10, "lt": 20}gteany10gtanylteanyltany20RangesMatchertype: "ranges"in matcher.Example
{ "type": "ranges", "values": [ { "gte": 10, "lt": 20 }, { "gte": 50 } ]}valuesMatcherRange[]requiredfrom as gte and to as lt.Example
{ "gte": 10, "lt": 20}4 properties
gteany10gtanylteanyltany20TextMatchertype: "text"Example
{ "type": "text", "text": "silent spring", "match": "phrase"}textstringrequiredmatchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply. Setting join with any other match returns search:clause:join_unsupported.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows the field's typoTolerance configuration; off disables typo tolerance for the matcher.- Default
- "auto"
- Values
- "auto", "off"
slopintegerphrase queries or quoted phrases in user mode.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
interpretInterpretModeuser text are read as filters on the fields of the index: auto reads a number typed next to the unit of a number field, or next to a comparative word such as under, as a filter on that field; off takes every word as text. Whatever was read is reported as interpreted beside the results. See Reading numbers and units.- Default
- "auto"
- Values
- "auto", "off"
DistanceMatchertype: "distance"radius meters of the specified latitude and longitude coordinates.Example
{ "type": "distance", "lat": 59.3, "lon": 18.1, "radius": 5000}latnumberrequired- Format
- double
- Range
- -90 to 90
59.3lonnumberrequired- Format
- double
- Range
- -180 to 180
18.1radiusnumberrequired- Format
- double
5000wordsstring[]fallbackInterpretTarget[]fallback of the target the request named. Absent when there are none.Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}3 properties
fieldstringrequired"prices.amount"whenClause[]nested list, and for the document otherwise. Takes what a nested clause takes: field, text, and, or, not and boost. A clause naming a field outside the list returns search:nested:field_not_inside.Example
{ "field": "category", "match": { "value": "fiction" }}9 types
FieldClausetype: "field"search:usage_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}fieldstringrequired"category""text"typoTolerance. Fields defined only for autocomplete do not support phrase matching. See text.Example
{ "type": "text", "text": "silent spr", "fields": { "name": 3, "description": null }}textstringrequired"silent spr"fieldsmap of numbernull uses the weight from its field definition. If omitted, searches all searchable fields, skipping autocomplete-only fields.matchMatchphrase requires terms to appear in exact order and adjacent; user parses search syntax such as quotes and negation.- Default
- "all"
- Values
- "all", "any", "phrase", "user"
joinJoinuser text combine: all requires every word and every quoted phrase, any accepts a document that holds one of them. Excluded terms (-word) always apply, and a filter read out of the text is one of the parts. Setting join with any other match returns search:clause:join_unsupported. See Reading what was typed.- Default
- "all"
- Values
- "all", "any"
prefixPrefixlast_token matches the trailing word as a prefix; off requires an exact word match.- Default
- "last_token"
- Values
- "last_token", "off"
typosTyposModeauto follows each field's typoTolerance configuration; off disables typo tolerance for the clause.- Default
- "auto"
- Values
- "auto", "off"
slopintegerslop above 0 with "match": "all" or "match": "any" returns search:clause:slop_unsupported.- Default
- 0
- Format
- int32
relaxRelax- Default
- "unmatched"
- Values
- "off", "unmatched", "words"
combineCombineterm evaluates each term across all targeted fields, so terms may appear in different fields; field requires a single field to satisfy match on its own. Ignored by phrase queries.- Default
- "term"
- Values
- "term", "field"
interpretInterpretuser text are read as filters on the fields of the index, given as a mode or as the targets to read on. See Reading numbers and units.- Default
- "auto"
"knn"k nearest documents by vector distance in a specified field, scored by proximity. Cannot be combined with hits (search:hits:knn_unsupported).Example
{ "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 10, "filter": [ { "field": "published", "match": { "value": true } } ]}fieldstringrequired"embedding"vectornumber[]required- Format
- float
kintegerrequiredEXOFIND_SEARCH_MAX_KNN_K.- Format
- int32
filterClause[]Example
{ "field": "category", "match": { "value": "fiction" }}"nested"nested object field satisfies all child clauses. A nested clause on a flattened object field returns search:nested:path_not_nested; on a non-object field it returns an error. See nested.Example
{ "type": "nested", "path": "variants", "clauses": [ { "field": "variants.color", "match": { "value": "red" } }, { "field": "variants.price", "match": { "type": "range", "lt": 20 } } ]}pathstringrequired"variants"clausesClause[]field, text, knn, and, or, not and boost; a clause that only means something for whole documents, such as another nested or a fuse, returns search:nested:clause_unsupported.Example
{ "field": "category", "match": { "value": "fiction" }}scoreScore- Default
- "max"
- Values
- "max", "min", "avg", "total"
"and"Example
{ "type": "and", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "published", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"or"Example
{ "type": "or", "clauses": [ { "field": "category", "match": { "value": "fiction" } }, { "field": "category", "match": { "value": "poetry" } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"not"Example
{ "type": "not", "clauses": [ { "field": "discontinued", "match": { "value": true } } ]}Example
{ "field": "category", "match": { "value": "fiction" }}"boost"Example
{ "type": "boost", "weight": 2, "clauses": [ { "field": "featured", "match": { "value": true } } ]}weightnumberrequired1 increase score; values between 0 and 1 decrease score. Leaving it out, or setting it below 0 or to a non-finite number, returns search:clause:weight_out_of_range.- Format
- float
2Example
{ "field": "category", "match": { "value": "fiction" }}"fuse"weight / (rankConstant + rank) across the rankings that reached them. Because the clause reads only result positions, scores from different scales (such as BM25 text relevance and vector similarity) combine without normalization. Matches at most depth results per ranking. See fuse.Example
{ "type": "fuse", "depth": 200, "rankConstant": 60, "rankings": [ { "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ] }, { "clauses": [ { "type": "knn", "field": "embedding", "vector": [ 0.1, 0.2 ], "k": 200 } ], "weight": 0.5 } ], "filter": [ { "field": "inStock", "match": { "value": true } } ]}search:clause:rankings_too_few.Example
{ "clauses": [ { "type": "text", "text": "waterproof jacket", "fields": { "name": null } } ], "weight": 0.5}depthintegerk in a knn clause. Must be at least 1, and at most EXOFIND_SEARCH_MAX_FUSE_DEPTH.- Default
- 100
- Format
- int32
rankConstantnumber0.- Default
- 60
- Format
- float
filterClause[]depth. A knn clause inside a ranking applies filter entries as a pre-filter, ensuring the vector ranking returns k results. Clauses placed beside the fuse clause filter the merged list after each ranking is cut to depth.Example
{ "field": "category", "match": { "value": "fiction" }}fallbackInterpretTarget[]search:interpret:fallback_unit_mismatch.Example
{ "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "customer" } } ], "fallback": [ { "field": "prices.amount", "when": [ { "field": "prices.list", "match": { "value": "store" } } ] } ]}textstring"shoes"generationstring@ and this name to the index name to send a later request to the same data. See Names and generations."2"freshnessstringfreshness.atLeast on a later request, and that request is answered from this state or a later one whichever node it lands on. Opaque; pass it back unchanged. See Freshness."AQoIcHJvZHVjdHMSATIYBw"tookMsnumber- Format
- double
7.412ErrorResponse
The body of every failed request. Error codes use colon-separated namespaces such as index:field:name_invalid, are stable across API versions, and are never renamed or reused, so clients match on code rather than on message. See Errors.
codestringvalidation and the individual problems are listed in errors. For all other failures, this matches the code of the single entry in errors."validation"messagestringcode rather than on message. When a validation failure contains one problem, this is that problem's message. When it contains several, it reads Request contains N errors."Request contains 2 errors"errorsErrorDetail[]Example
{ "code": "index:field:primary_key:multiple_unsupported", "message": "Field `id` is marked as a primary key and multiple, primary keys can not have multiple values", "path": "id"}4 properties
codestring"index:field:primary_key:multiple_unsupported"messagestring"Field `id` is marked as a primary key and multiple, primary keys can not have multiple values"pathstringfields.title or documents[1].nonexistent. Names join with ., one element of a list reads [n] counted from zero, and a key of a free-form map such as metadata goes in brackets and double quotes when it holds a dot or a bracket, as metadata["build.sha"]. A field inside an object field carries its own dotted path, so a path here reaches a field the same way a query does. Omitted when the problem applies to the request as a whole. See API conventions."id"argumentsmap of string1 property
<key>stringError codes
- request:value_required
- A part of the request that needs a value carries none. The `path` names it.
- search:clause:field_required
- A `field` clause does not name the field to match.
- search:clause:match_required
- A `field` clause does not say what to look for in the field.
- search:clause:text_required
- A `text` clause carries no text to search for.
- search:clause:path_required
- A `nested` clause does not name the object field to match inside.
- search:clause:vector_required
- A `knn` clause carries no vector to find the neighbours of.
- search:clause:k_out_of_range
- The `k` of a `knn` clause is missing, below one, or above `EXOFIND_SEARCH_MAX_KNN_K`.
- search:clause:weight_out_of_range
- The `weight` of a `boost` clause is missing, below zero or not a finite number.
- search:clause:slop_out_of_range
- The `slop` of a `text` clause is below zero.
- search:clause:slop_unsupported
- A `text` clause sets `slop` without matching as a phrase. Set `match` to `phrase`, or to `user`.
- search:clause:join_unsupported
- A `text` clause sets `join` without matching what somebody typed. Set `match` to `user`, or say `all` or `any` in `match` itself.
- search:clause:rankings_too_few
- A `fuse` clause holds fewer than two rankings to fuse.
- search:clause:ranking_empty
- A ranking of a `fuse` clause holds nothing to rank by.
- search:clause:rank_constant_out_of_range
- The `rankConstant` of a `fuse` clause is not a number above zero.
- search:clause:depth_out_of_range
- The `depth` of a `fuse` clause is below one result, or above `EXOFIND_SEARCH_MAX_FUSE_DEPTH`.
- search:clause:interpret_fields_required
- The `interpret` of a `text` clause names no target field. Name at least one, or use `auto` or `off`.
- search:clause:interpret_when_unsupported
- The `when` of an `interpret` target holds a `nested`, `knn` or `fuse` clause.
- search:matcher:value_required
- A matcher carries no value to look for.
- search:matcher:range_empty
- A range matcher carries no bound.
- search:matcher:range_conflicting
- A range matcher combines `gte` with `gt`, or `lte` with `lt`.
- search:matcher:origin_required
- A distance matcher carries no `lat` and `lon` to measure from.
- search:matcher:radius_required
- A distance matcher does not say how far from the origin values may be.
- search:filter:clause_unsupported
- A clause under `filters` is neither a `field` nor a `nested` clause. A clause that scopes the whole search belongs in `query`.
- search:sort:field_required
- A `sort` entry does not name the field to sort by.
- search:sort:origin_required
- A `sort` entry that orders by distance carries no `lat` and `lon` to measure from.
- search:limit_out_of_range
- `limit` is below zero or above `EXOFIND_SEARCH_MAX_LIMIT`.
- search:offset_out_of_range
- `offset` is below zero.
- search:paging_conflicting
- The request combines more than one of `offset`, `after` and `before`.
- search:cursor:invalid
- `after` or `before` carries a cursor this engine did not hand out.
- search:cursor:sort_mismatch
- A cursor is used under a different `sort` than the one it was handed out under. Start the search again from the first page.
- search:cursor:stale
- A cursor was taken under this `sort` but does not name a position in it, which a `sort` field that changed type in the index definition leaves behind. Start the search again from the first page.
- search:pages:without_limit
- `pages` is asked for without a `limit` above zero.
- search:pages:without_offset
- `pages` is asked for from a `next` or `previous` cursor, which carries no page number. Start from `offset` or from a page's own cursor.
- search:pages:max_out_of_range
- The `max` of `pages` is not above zero.
- search:facet:field_required
- A facet does not name the field to count.
- search:facet:name_invalid
- A facet is keyed by a blank name. Leave `name` out to key the counts by the field.
- search:facet:name_duplicate
- Two facets are keyed by the same name.
- search:facet:limit_out_of_range
- The `limit` of a facet asks for more values than the node allows, or for none. The `max` argument carries the cap.
- search:facet:depth_out_of_range
- The `depth` of a facet counts more levels of a tree than the node allows, or none. The `max` argument carries the cap.
- search:facet:path_invalid
- The `path` of a facet is blank. Leave it out to count from the top of the tree.
- search:facet:range_empty
- A bucket of a facet carries no bound.
- search:facet:ranges_required
- A facet counts into buckets and lists none. Leave `ranges` out to count one value at a time.
- search:facet:ranges_too_many
- A facet counts into more buckets than the node allows. The `max` argument carries the cap.
- search:facet:ranges_conflicting
- A facet combines `ranges` with `limit` or `order`. A facet with `ranges` answers one count per bucket, in the order the buckets are given.
- search:facet:ranges_with_tree
- A facet combines `ranges` with `path` or `depth`. Those count one level of a tree, and `ranges` counts buckets.
- search:facet:exclude_filters_invalid
- An entry of `excludeFilters` is blank. Leave the list out for the facet's own field, or give it empty to leave nothing out.
- search:highlight:fields_required
- `highlight` names no field to highlight.
- search:highlight:field_required
- An entry of the fields to highlight is blank.
- search:highlight:fragments_out_of_range
- The number of fragments to highlight is not above zero.
- search:highlight:length_out_of_range
- The length a highlighted fragment aims for is outside 1 to 10000 characters.
- search:matched:fields_required
- `matched` names no object field to answer matched values for.
- search:matched:field_required
- An entry of the fields to answer matched values for is blank.
- search:matched:fields_empty
- A `matched` entry asks for only some fields of the values and names none.
- search:matched:field_not_inside
- A `matched` entry names a field that is not inside its object field. Name the fields of the values by their dotted paths.
- search:matched:limit_out_of_range
- A `matched` entry asks for more values per field than the node allows, or for none. The `max` argument carries the cap.
- search:hits:path_required
- `hits` does not name the object field whose matched values are the hits.
- search:hits:fields_empty
- `hits` asks for only some fields of the values and names none.
- search:hits:field_not_inside
- `hits` names a field that is not inside the object field it stands for. Name the fields of the values by their dotted paths.
- search:hits:when_clause_unsupported
- A clause under `hits.when` is neither a `field` nor a `nested` clause. A clause that scopes the whole search belongs in `query`.
- search:hits:when_scoring_unsupported
- A clause under `hits.when` affects the score. Clauses that score belong in `query`.
- search:hits:when_sort_unsupported
- A search whose hits are chosen by `hits.when` is ordered by a field. Order it by score.
- search:hits:sort_unsupported
- A search whose hits are the values of an object field is ordered by distance.
- search:hits:knn_unsupported
- A search whose hits are the values of an object field holds a `knn` clause.
- search:hits:matched_unsupported
- A search whose hits are the values of an object field also asks for `matched`, which would ask a hit about itself.
- search:hits:highlight_field_not_inside
- A search whose hits are the values of an object field highlights a field that is not inside those values.
- search:signal:field_required
- A signal does not name the field to read its value from.
- search:signal:shape_invalid
- A signal is not exactly one of `saturation`, `decay` and `linear`.
- search:signal:pivot_out_of_range
- The `pivot` of a saturation signal is not a number above zero.
- search:signal:half_life_out_of_range
- The `halfLife` of a decay signal is not a number of seconds above zero.
- search:signal:ceiling_out_of_range
- The `ceiling` of a linear signal is not a number above zero.
- search:signal:weight_out_of_range
- The `weight` of a signal is below zero.
- search:signal:mode_without_signals
- `signalsMode` is given without `signals`. Give the signals as well, or leave the mode out.
- search:rescore:window_required
- A `rescore` block does not say how many of the best results the second pass reaches.
- search:rescore:window_out_of_range
- The `window` of a `rescore` block is below one or above `EXOFIND_SEARCH_MAX_RESCORE_WINDOW`.
- search:rescore:window_too_small
- `offset` plus `limit` reaches past the `window` of a `rescore` block. Widen the window, or ask for an earlier page.
- search:rescore:empty
- A `rescore` block holds neither a boost nor a signal to reorder by.
- search:rescore:weight_out_of_range
- The `weight` of a `rescore` block is below zero.
- search:rescore:hits_unsupported
- A search whose hits are the values of an object field also asks to `rescore`. A second pass scores documents, so it cannot reorder values.
- search:locale_unsupported
- The request names a locale this engine has no rules for.
- search:source_not_kept
- `fields` asks for something only the document copy can answer on an index whose `source` is `none`.
- search:interpret:unit_required
- An `interpret` target names a field that is not a number field or that declares no `unit`.
- search:filter:scoring_unsupported
- A clause under `filter` affects the score. Move it out of `filter`.
- search:field_unknown
- A clause names a field the index does not have.
- search:usage_unsupported
- A field is not defined for the usage the clause asks of it.
- search:paging_too_deep
- `offset` plus `limit` reaches past `EXOFIND_SEARCH_MAX_PAGE_DEPTH`. Follow the `next` cursor instead.
- search:clauses_too_many
- The query holds more clauses than the node allows.
- search:clauses_too_deep
- The query nests deeper than the node allows.
- search:value_invalid
- A matcher is given a value of the wrong kind for the type of its field.
- search:matcher:type_unsupported
- A matcher is used on a field whose type cannot answer it.
- search:no_searchable_fields
- A text clause names no fields and the index has none defined for matching.
- search:nested:path_not_nested
- A `nested` clause names a path whose values are flattened.
- search:nested:field_not_inside
- A clause inside a `nested` clause names a field outside its path.
- search:nested:field_outside
- A clause outside a `nested` clause names a field inside a nested list.
- search:nested:clause_unsupported
- A `nested` clause holds a clause that cannot run against a single value, such as `fuse`.
- search:interpret:fallback_unit_mismatch
- A `fallback` target declares another unit than the target it stands in for.
- search:facet:range_invalid
- A range bucket has `to` at or below `from`.
- search:hits:facet_unsupported
- A facet of a search with `hits` names a field inside another object than the `hits` path.
- search:hits:path_not_nested
- The `hits` path names an object field that is not in `nested` mode.
- search:matched:field_not_nested
- A `matched` field is an object field that is not in `nested` mode.
- search:sort:nested_unsupported
- A sort names a field inside a nested list in a way its values cannot be ordered.
- search:clause:k_required
- A `knn` clause carries no `k`.
- search:freshness:invalid
- The freshness token is not one the engine issued. Pass a token back unchanged.
- search:freshness:version_unsupported
- The freshness token was issued in a format version this node does not read. The `version` argument carries it; send the request to a node of the release that issued the token.
- search:freshness:index_mismatch
- The freshness token is of another index than the one in the path. The `index` argument carries the index the token is of.
WWW-Authenticate: Bearer.ErrorResponse
The body of every failed request. Error codes use colon-separated namespaces such as index:field:name_invalid, are stable across API versions, and are never renamed or reused, so clients match on code rather than on message. See Errors.
codestringvalidation and the individual problems are listed in errors. For all other failures, this matches the code of the single entry in errors."validation"messagestringcode rather than on message. When a validation failure contains one problem, this is that problem's message. When it contains several, it reads Request contains N errors."Request contains 2 errors"errorsErrorDetail[]Example
{ "code": "index:field:primary_key:multiple_unsupported", "message": "Field `id` is marked as a primary key and multiple, primary keys can not have multiple values", "path": "id"}4 properties
codestring"index:field:primary_key:multiple_unsupported"messagestring"Field `id` is marked as a primary key and multiple, primary keys can not have multiple values"pathstringfields.title or documents[1].nonexistent. Names join with ., one element of a list reads [n] counted from zero, and a key of a free-form map such as metadata goes in brackets and double quotes when it holds a dot or a bracket, as metadata["build.sha"]. A field inside an object field carries its own dotted path, so a path here reaches a field the same way a query does. Omitted when the problem applies to the request as a whole. See API conventions."id"argumentsmap of string1 property
<key>stringError codes
- auth:unauthenticated
- The request carries no credential this node accepts.
search permission.ErrorResponse
The body of every failed request. Error codes use colon-separated namespaces such as index:field:name_invalid, are stable across API versions, and are never renamed or reused, so clients match on code rather than on message. See Errors.
codestringvalidation and the individual problems are listed in errors. For all other failures, this matches the code of the single entry in errors."validation"messagestringcode rather than on message. When a validation failure contains one problem, this is that problem's message. When it contains several, it reads Request contains N errors."Request contains 2 errors"errorsErrorDetail[]Example
{ "code": "index:field:primary_key:multiple_unsupported", "message": "Field `id` is marked as a primary key and multiple, primary keys can not have multiple values", "path": "id"}4 properties
codestring"index:field:primary_key:multiple_unsupported"messagestring"Field `id` is marked as a primary key and multiple, primary keys can not have multiple values"pathstringfields.title or documents[1].nonexistent. Names join with ., one element of a list reads [n] counted from zero, and a key of a free-form map such as metadata goes in brackets and double quotes when it holds a dot or a bracket, as metadata["build.sha"]. A field inside an object field carries its own dotted path, so a path here reaches a field the same way a query does. Omitted when the problem applies to the request as a whole. See API conventions."id"argumentsmap of string1 property
<key>stringError codes
- auth:forbidden
- The key is accepted but does not hold the `search` permission.
ErrorResponse
The body of every failed request. Error codes use colon-separated namespaces such as index:field:name_invalid, are stable across API versions, and are never renamed or reused, so clients match on code rather than on message. See Errors.
codestringvalidation and the individual problems are listed in errors. For all other failures, this matches the code of the single entry in errors."validation"messagestringcode rather than on message. When a validation failure contains one problem, this is that problem's message. When it contains several, it reads Request contains N errors."Request contains 2 errors"errorsErrorDetail[]Example
{ "code": "index:field:primary_key:multiple_unsupported", "message": "Field `id` is marked as a primary key and multiple, primary keys can not have multiple values", "path": "id"}4 properties
codestring"index:field:primary_key:multiple_unsupported"messagestring"Field `id` is marked as a primary key and multiple, primary keys can not have multiple values"pathstringfields.title or documents[1].nonexistent. Names join with ., one element of a list reads [n] counted from zero, and a key of a free-form map such as metadata goes in brackets and double quotes when it holds a dot or a bracket, as metadata["build.sha"]. A field inside an object field carries its own dotted path, so a path here reaches a field the same way a query does. Omitted when the problem applies to the request as a whole. See API conventions."id"argumentsmap of string1 property
<key>stringError codes
- index:not_found
- The node holds no such index, or the key has no permission on it.
ErrorResponse
The body of every failed request. Error codes use colon-separated namespaces such as index:field:name_invalid, are stable across API versions, and are never renamed or reused, so clients match on code rather than on message. See Errors.
codestringvalidation and the individual problems are listed in errors. For all other failures, this matches the code of the single entry in errors."validation"messagestringcode rather than on message. When a validation failure contains one problem, this is that problem's message. When it contains several, it reads Request contains N errors."Request contains 2 errors"errorsErrorDetail[]Example
{ "code": "index:field:primary_key:multiple_unsupported", "message": "Field `id` is marked as a primary key and multiple, primary keys can not have multiple values", "path": "id"}4 properties
codestring"index:field:primary_key:multiple_unsupported"messagestring"Field `id` is marked as a primary key and multiple, primary keys can not have multiple values"pathstringfields.title or documents[1].nonexistent. Names join with ., one element of a list reads [n] counted from zero, and a key of a free-form map such as metadata goes in brackets and double quotes when it holds a dot or a bracket, as metadata["build.sha"]. A field inside an object field carries its own dotted path, so a path here reaches a field the same way a query does. Omitted when the problem applies to the request as a whole. See API conventions."id"argumentsmap of string1 property
<key>stringError codes
- index:no_live_generation
- The index has no live generation. Promote one and send the request again.
ErrorResponse
The body of every failed request. Error codes use colon-separated namespaces such as index:field:name_invalid, are stable across API versions, and are never renamed or reused, so clients match on code rather than on message. See Errors.
codestringvalidation and the individual problems are listed in errors. For all other failures, this matches the code of the single entry in errors."validation"messagestringcode rather than on message. When a validation failure contains one problem, this is that problem's message. When it contains several, it reads Request contains N errors."Request contains 2 errors"errorsErrorDetail[]Example
{ "code": "index:field:primary_key:multiple_unsupported", "message": "Field `id` is marked as a primary key and multiple, primary keys can not have multiple values", "path": "id"}4 properties
codestring"index:field:primary_key:multiple_unsupported"messagestring"Field `id` is marked as a primary key and multiple, primary keys can not have multiple values"pathstringfields.title or documents[1].nonexistent. Names join with ., one element of a list reads [n] counted from zero, and a key of a free-form map such as metadata goes in brackets and double quotes when it holds a dot or a bracket, as metadata["build.sha"]. A field inside an object field carries its own dotted path, so a path here reaches a field the same way a query does. Omitted when the problem applies to the request as a whole. See API conventions."id"argumentsmap of string1 property
<key>stringError codes
- index:closed
- The request raced the index being closed to free local resources. Sending it again reopens the index.
- search:timeout
- The search collected for longer than `EXOFIND_SEARCH_TIMEOUT`. What it collected is dropped, so narrow the search rather than sending it again.
- search:freshness:unavailable
- The node did not reach the state the freshness token asks for within `EXOFIND_SEARCH_FRESHNESS_WAIT`. Send the request again after the `Retry-After` header.
Authorization
- Permission
- search
- Checked on
- The index the path names
- Roles
reader,writer,admin- Anonymous
- Served to a request carrying no credential where the node sets an anonymous key.
An API key sent as a bearer token, such as Authorization: Bearer exok_4ff6b760264c1918_ePQcdT1O9HSATZoXfDbT8hhHGsP9VpZH. A key carries grants that pair permissions with index patterns; the permission each endpoint needs is named beside it. Nodes running with EXOFIND_AUTH_MODE=none accept requests without a credential, and a node with EXOFIND_AUTH_ANONYMOUS_KEY set serves requests that carry none with the permissions of that key.
Exofind is built by Level Four AB and is available under the Apache License 2.0.