FT.SEARCH
Searches the index with a textual query, returning either documents or just ids
Browse all commands · Upstream source documentation
| Reference field | Value |
|---|---|
| Canonical name | FT.SEARCH |
| Catalog group | Search commands |
| Upstream since | 1.0.0 — upstream Redis/module version, not an ffkv release |
| Pinned catalog | Redis 8.10.0 |
Syntax
Section titled “Syntax”FT.SEARCH index query [NOCONTENT] [VERBATIM] [NOSTOPWORDS] [WITHSCORES] [WITHPAYLOADS] [WITHSORTKEYS] [FILTER numeric field min max [FILTER numeric field min max ...]] [GEOFILTER geo field lon lat radius <m | km | mi | ft> [GEOFILTER geo field lon lat radius <m | km | mi | ft> ...]] [INKEYS count key [key ...]] [INFIELDS count field [field ...]] [RETURN count identifier [AS property] [identifier [AS property] ...]] [SUMMARIZE [FIELDS count field [field ...]] [FRAGS num] [LEN fragsize] [SEPARATOR separator]] [HIGHLIGHT [FIELDS count field [field ...]] [TAGS open close]] [SLOP slop] [TIMEOUT timeout] [INORDER] [LANGUAGE language] [EXPANDER expander] [SCORER scorer] [EXPLAINSCORE] [PAYLOAD payload] [SORTBY sortby [ASC | DESC]] [LIMIT offset num] [PARAMS nargs name value [name value ...]] [DIALECT dialect]ffkv behavior and limits
Section titled “ffkv behavior and limits”Search worker configuration controls a real Rayon pool; GC schedules generation-fenced Rust compaction, not a POSIX fork. Search indexes and documents are bounded and RAM-resident; upstream syntax is not a promise of every option combination or Redis module ABI parity.
Source: README.md:375–377, 636–642; src/engine/search/; tests/bdd/features/search.feature.
All requests share the 8 MiB framing/1,024-argument ingress limit; normal RESP replies have 64 MiB wire/logical budgets with bounded nesting/value counts. Management and Lua origins impose smaller budgets. These are not a process RSS cap. Catalog inclusion is not exhaustive option or wire-format parity. See limits and compatibility.
Metadata availability
Section titled “Metadata availability”This command is in the canonical catalog but has no matching entry in the pinned src/command_metadata.json. Argument flags, complexity and key specifications are not invented. Use the syntax, upstream source documentation and actual scenario evidence below.
BDD coverage and source examples
Section titled “BDD coverage and source examples”These are source observations, not a test run performed by this documentation build. A tag identifies scenario intent; an extracted vector identifies a command invocation, which may intentionally produce an error. Scenarios may require setup, multiple connections, persistence, cluster nodes or native-module fixtures.
- Dynamic index namespace denials are logged without logging visibility filtering —
tests/bdd/features/client_control_repair.feature:474; command tag and invocation observed. - Function and search metadata accompany migrated keys without replacing unrelated catalogs —
tests/bdd/features/cluster.feature:1011; invocation observed. - Numeric signed zero bounds share equality without invalid ranges —
tests/bdd/features/search.feature:5; command tag and invocation observed. - Empty tag queries follow initial scans updates deletion and rebuild —
tests/bdd/features/search.feature:61; command tag and invocation observed. - Initial scans and typed intersections find only eligible documents —
tests/bdd/features/search.feature:113; command tag and invocation observed. - Hash mutations remove old postings without losing the source value —
tests/bdd/features/search.feature:137; command tag and invocation observed. - Invalid indexed values reject the document but never roll back HSET —
tests/bdd/features/search.feature:161; command tag and invocation observed. - Alias creation rebinding and deletion affect metadata only —
tests/bdd/features/search.feature:206; invocation observed. - ALTER validates a full new schema before rescanning existing documents —
tests/bdd/features/search.feature:255; invocation observed. - Synonym updates preserve skipped document coverage through recovery —
tests/bdd/features/search.feature:361; invocation observed. - Tags preserve interior spaces and normalize only configured case —
tests/bdd/features/search.feature:406; invocation observed. - Each vector algorithm maintains a real index across updates and deletions (Scenario Outline) —
tests/bdd/features/search.feature:693; command tag and invocation observed. - Geographic radius and nonrectangular shape predicates use indexed geometry —
tests/bdd/features/search.feature:755; command tag and invocation observed. - JSON multivalue indexing follows all matching paths and subsequent JSON writes —
tests/bdd/features/search.feature:779; command tag and invocation observed. - Phrase fuzzy stemming and highlighting share genuine match positions —
tests/bdd/features/search.feature:816; command tag and invocation observed. - Minimum stem length governs indexed words without blocking short query roots —
tests/bdd/features/search.feature:856; command tag and invocation observed. - Missing and empty fields remain distinct searchable states —
tests/bdd/features/search.feature:880; command tag and invocation observed. - Rename expiration deletion and type replacement do not leave stale postings —
tests/bdd/features/search.feature:904; command tag and invocation observed. - Recovery retains intentionally unindexed initial data and metadata namespaces —
tests/bdd/features/search.feature:944; invocation observed. - ACLs authorize prefix namespaces rather than the index name —
tests/bdd/features/search.feature:985; command tag and invocation observed. - Invalid query schema and pipeline options fail without document mutation (Scenario Outline) —
tests/bdd/features/search.feature:1027; command tag and invocation observed. - Search payloads and aggregate LOAD remain binary safe —
tests/bdd/features/search.feature:1092; command tag and invocation observed. - Invalid vector blobs do not undo successful document writes —
tests/bdd/features/search.feature:1132; command tag and invocation observed. - Suffix dictionaries update when their last posting disappears —
tests/bdd/features/search.feature:1168; command tag and invocation observed. - Read-only document grants never authorize DROPINDEX DD deletion —
tests/bdd/features/search.feature:1196; invocation observed. - Matching a literal prefix probe does not authorize a whole index namespace —
tests/bdd/features/search.feature:1225; command tag and invocation observed. - Search worker reconfiguration preserves queries and enforces strict timeout prerequisites —
tests/bdd/features/search.feature:1246; command tag and invocation observed. - Disposable Lua debugging sees staged search changes without publishing catalog changes —
tests/bdd/features/search.feature:1316; command tag and invocation observed. - Swapping database zero reconciles search documents without replacing schemas or aliases —
tests/bdd/features/search.feature:1381; command tag and invocation observed.
Extracted command vectors
Section titled “Extracted command vectors”The following JSON arrays are the test harness’s argument vectors, not shell commands. Numeric arguments are converted by the harness; objects of the form {"base64":"…"} represent decoded binary bytes, not a literal JSON command argument. Preserve scenario setup and connection ordering. See the CLI guide for shell quoting and binary stdin. No reply is invented or inferred.
Invalid vector blobs do not undo successful document writes — tests/bdd/features/search.feature:1146 (I execute:)
[ "FT.SEARCH", "idx", "*", "NOCONTENT"]Next source assertion: the reply equals:
[0]Recovery retains intentionally unindexed initial data and metadata namespaces — tests/bdd/features/search.feature:951 (I execute:)
[ "FT.SEARCH", "view", "*", "NOCONTENT"]Next source assertion: the reply equals:
[1,"doc:new"]Hash mutations remove old postings without losing the source value — tests/bdd/features/search.feature:143 (I execute:)
[ "FT.SEARCH", "idx", "shoes", "NOCONTENT"]Next source assertion: the reply equals:
[0]