type: "text" for BM25 token search over one or more named fields, and type: "query_string" for the full Lucene grammar, with boolean operators, phrases, boosting, fuzzy matching, and more.
Choosing a query type
The two types differ in the capabilities they support:Token matching (type: "text")
With type: "text", the query string is run through the field’s analyzer pipeline (see Tokens and analyzers) and each resulting term contributes to the BM25 score. Multiple terms use OR semantics: documents can match if they contain any of the terms; documents that match more terms or stronger term statistics typically rank higher. Matching is case-insensitive. Exact phrase constraints (adjacent words in order) belong in type: "query_string" using quotes, or in a $match_phrase filter.
Key behaviors
- Single term (
machine): Matches documents containing that term. Case-insensitive. - Multiple terms (
machine learning): Each term is searched independently with OR-style matching and combined BM25 scoring, not as a single adjacent phrase. - No operator support: Characters like
AND,OR,NOT,*,~,^,+,-, and quotes are treated as literal text.
Lucene query syntax (type: "query_string")
With type: "query_string", you write Lucene query syntax, with operator support. Field names are embedded in the query itself (e.g., content:(term)) and can combine multiple fields with boolean operators.
Terms and default OR behavior
A term is a single word. Multiple space-separated terms use OR logic by default.Phrases
Wrap multiple words in quotes to match them as an exact sequence.type: "text" with query: "machine learning", which uses token OR matching on the field. For phrase matching as a filter (e.g., composed with dense-vector ranking), use {"body": {"$match_phrase": "machine learning"}} in the filter block.
Phrase terms are matched against the field’s analyzed tokens. If stemming is enabled on the field, the phrase terms stem too, e.g., "running fast" matches running fast and runs fast.
Boolean operators (AND, OR, NOT)
UseAND, OR, and NOT for explicit boolean logic.
Required and excluded terms (+, -)
Use+ to require a term and - to exclude a term.
Phrase proximity (slop)
Allow words in a phrase to appear within N positions of each other.Boosting
Use^N to multiply a clause’s contribution to the relevance score, where N is 0 or greater. The default is 1, so ^2 doubles the contribution and ^0.5 halves it. Scaling is linear.
^N directly to a term, a quoted phrase, or a parenthesized group. A space on either side of ^, as in body:(machine ^2 learning), is a query error (400).
Nis a literal number, whole or decimal, with digits on both sides of the decimal point, such as2,1.5, or0.75.- Values below
1reduce the clause’s weight, and^1leaves scoring unchanged. ^0drops the clause’s contribution to zero, though documents matching it are still returned. If every clause in the query is boosted to0, all matches score0and their order isn’t meaningful.- Anything else is a query error (
400): Arithmetic (^(2*3)), negatives (^-2), scientific notation (^1e3), a bare leading decimal point (^.5), and chained boosts (^2^3).
type: "query_string". With type: "text" and in the text-match filters, ^ is treated as a literal character.
Phrase prefix
Append* to a quoted phrase to treat the last term as a prefix. The phrase must contain at least two terms.
auto*, isn’t supported. It returns no matches rather than an error. Use a phrase prefix instead, or configure the field for substring search.
Both the literal terms and the prefix are matched against the field’s analyzed tokens. If stemming is enabled on the field, stemming applies to the completed terms in the phrase, while the final prefix is expanded against analyzed tokens.
Phrase prefix is optimized for autocomplete-style queries where the final word prefix is reasonably specific. To keep latency low, Pinecone expands the final prefix to the first 50 matching terms in lexicographic order. For example, "new yor"* can match new york, but "new yo"* might not if york isn’t among the first 50 expanded terms for yo.
Regex
Wrap a pattern in forward slashes to match documents by regular expression on a field.body field contains a token matching the regex comput.* (e.g., “computer”, “computing”, “computation”). Regex patterns are matched against individual analyzed tokens, not the raw field text.
type: "query_string". It’s not supported with type: "text".
Fuzzy matching (typo tolerance)
Append~ to a bare term to match indexed terms within a small edit distance, so a misspelled query term still matches the intended word.
term~— automatic distance based on the term’s length: terms shorter than 4 characters must match exactly, terms of 4–7 characters allow 1 edit, and terms of 8 or more characters allow 2 edits.term~N— fixed edit distanceN, whereNis0,1, or2.~0is an exact match. A distance greater than 2 is a query error (400).
The
~ operator is fuzzy only when it follows a bare term. After a quoted phrase, ~N keeps its phrase slop meaning, for example, body:("machine learning"~2) is slop, while body:(learning~2) is fuzzy. There is no fuzzy phrase matching.On stemmed fields, fuzzy matching runs against the stemmed terms and is best-effort: a typo that changes how a word stems may not match. Fuzzy matching is most effective on fields without stemming (the default). Fuzzy is available only with
type: "query_string". With type: "text", ~ is treated as a literal character. Fuzzy also doesn’t apply in the $match_phrase, $match_all, and $match_any text-match filters, where a ~ operator is matched literally and the filter finds nothing.Cross-field queries
query_string can target multiple fields in the same expression. Use Lucene field qualifiers (field:(clause)) directly in the query string; omit them to run against all text-searchable fields:
title contains “quantum”, documents whose body contains “machine” or “learning”, or both, with BM25 scoring combining across fields.