[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-redis-redis-search":3,"mdc--6vyz7y-key":38,"related-repo-redis-redis-search":1753,"related-org-redis-redis-search":1863},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":33,"sourceUrl":36,"mdContent":37},"redis-search","implement Redis Search indexing and queries","Redis Search guidance covering FT.CREATE schema design, field type selection (TEXT, TAG, NUMERIC, GEO, GEOSHAPE, VECTOR, JSON path), DIALECT 2 query syntax, FT.SEARCH \u002F FT.AGGREGATE \u002F FT.HYBRID command selection, vector similarity with HNSW or FLAT, hybrid retrieval combining lexical and vector ranking, RAG pipelines, zero-downtime index updates via aliases, and debugging with FT.PROFILE and FT.EXPLAIN. Use when defining a search index on Hash or JSON documents, writing FT.SEARCH queries with filters, sorting, aggregation, or vector KNN, tuning HNSW parameters, building a RAG retrieval pipeline, or troubleshooting slow or empty search results.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"redis","Redis","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fredis.png",[12,16,19,22,25],{"name":13,"slug":14,"type":15},"Architecture","architecture","tag",{"name":17,"slug":18,"type":15},"Database","database",{"name":20,"slug":21,"type":15},"Search","search",{"name":23,"slug":24,"type":15},"Engineering","engineering",{"name":9,"slug":8,"type":15},92,"https:\u002F\u002Fgithub.com\u002Fredis\u002Fagent-skills","2026-06-24T07:39:43.089819","MIT",21,[32,8],"agent-skills",{"repoUrl":27,"stars":26,"forks":30,"topics":34,"description":35},[32,8],"Redis' official collection of agent skills","https:\u002F\u002Fgithub.com\u002Fredis\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fredis-search","---\nname: redis-search\ndescription: Redis Search guidance covering FT.CREATE schema design, field type selection (TEXT, TAG, NUMERIC, GEO, GEOSHAPE, VECTOR, JSON path), DIALECT 2 query syntax, FT.SEARCH \u002F FT.AGGREGATE \u002F FT.HYBRID command selection, vector similarity with HNSW or FLAT, hybrid retrieval combining lexical and vector ranking, RAG pipelines, zero-downtime index updates via aliases, and debugging with FT.PROFILE and FT.EXPLAIN. Use when defining a search index on Hash or JSON documents, writing FT.SEARCH queries with filters, sorting, aggregation, or vector KNN, tuning HNSW parameters, building a RAG retrieval pipeline, or troubleshooting slow or empty search results.\nlicense: MIT\nmetadata:\n  author: Redis, Inc.\n  version: \"1.0.0\"\n---\n\n# Redis Search\n\nSingle source of guidance for Redis Search — the retrieval surface that spans lexical, numeric, geo, JSON-path, and vector queries. Vector fields are part of the same `FT.CREATE` machinery as TEXT\u002FTAG\u002FNUMERIC fields, and `FT.HYBRID` blends lexical and vector ranking in one command, so this skill covers them together.\n\n## When to apply\n\n- Creating, modifying, or reviewing a Redis Search index (`FT.CREATE`, `FT.ALTER`).\n- Writing or optimizing `FT.SEARCH`, `FT.AGGREGATE`, or `FT.HYBRID` queries.\n- Picking between `TEXT`, `TAG`, `NUMERIC`, `GEO`, `GEOSHAPE`, `VECTOR`, or JSON-path fields.\n- Defining a `VECTOR` field, choosing HNSW vs FLAT, tuning HNSW parameters.\n- Building a retrieval-augmented generation (RAG) pipeline.\n- Rolling out a new index schema without downtime.\n- Troubleshooting empty results, slow queries, or tokenization issues with `FT.EXPLAIN`, `FT.PROFILE`, `FT.INFO`.\n\n## 1. Pick the right command\n\nThree query commands. Reach for the narrowest one that fits.\n\n| Command | When to use | Mental model | Minimum Redis |\n|---|---|---|---|\n| **FT.SEARCH** | Document retrieval, ranked or sorted. Best default. | Returns matching docs directly. | 2.0 (module) \u002F 8.0 (built-in) |\n| **FT.AGGREGATE** | Faceting, computed fields, custom output shape, analytics. | Declarative pipeline: `LOAD`, `APPLY`, `GROUPBY`, `REDUCE`, `SORTBY`. | 2.0 \u002F 8.0 |\n| **FT.HYBRID** | Blend lexical (BM25) with vector similarity, with configurable fusion. | Pipeline with explicit `SEARCH` + `VSIM` legs and a `COMBINE` fusion stage. | **8.4.0** |\n\n```\n# FT.SEARCH — most common\nFT.SEARCH idx:products \"@category:{electronics} @price:[100 500]\" LIMIT 0 20 RETURN 3 name price category\n\n# FT.AGGREGATE — top categories by avg price\nFT.AGGREGATE idx:products \"*\" GROUPBY 1 @category REDUCE AVG 1 @price AS avg_price SORTBY 2 @avg_price DESC\n\n# FT.HYBRID (Redis ≥ 8.4) — lexical + vector fusion\nFT.HYBRID idx:docs\n  SEARCH \"@title:transformers\" SCORER BM25 YIELD_SCORE_AS lexscore\n  VSIM embedding $vec KNN count 1 K 50 YIELD_SCORE_AS vecscore\n  COMBINE RRF 2 CONSTANT 60\n  PARAMS 2 vec \"...\"\n  DIALECT 2\n```\n\nFor Redis \u003C 8.4 the lexical+vector blend is approximated with `FT.SEARCH` pre-filter + `=>[KNN ...]`. See [references\u002Fcommand-selection.md](references\u002Fcommand-selection.md) and [references\u002Fhybrid-search.md](references\u002Fhybrid-search.md).\n\n## 2. Schema basics — `FT.CREATE`\n\n`FT.CREATE` indexes Hash or JSON documents matching a `PREFIX`. Always set `PREFIX`. Use `DIALECT 2` (the default since Redis 8; required for vector queries).\n\n```\nFT.CREATE idx:products ON HASH PREFIX 1 product:\n    SCHEMA\n        name TEXT WEIGHT 2.0\n        category TAG SORTABLE\n        price NUMERIC SORTABLE\n        location GEO\n        embedding VECTOR HNSW 6\n            TYPE FLOAT32\n            DIM 1536\n            DISTANCE_METRIC COSINE\n```\n\nPick the narrowest field type that supports your access pattern:\n\n| Field type | Use when | Notes |\n|---|---|---|\n| `TEXT` | Full-text search | Tokenized + stemmed; **not** for exact match |\n| `TAG` | Exact match \u002F filtering | Add `SORTABLE UNF` for fastest tag queries |\n| `NUMERIC` | Range queries, sorting | Prices, counts, timestamps |\n| `GEO` | Lat\u002Flong points | Stores, users |\n| `GEOSHAPE` | Polygon \u002F area queries | Delivery zones, regions |\n| `VECTOR` | Similarity search | HNSW or FLAT; see §4 |\n| JSON `$.path AS alias` | Nested JSON fields | `ON JSON`; see [references\u002Fjson-indexing.md](references\u002Fjson-indexing.md) |\n\nThe classic mistake is `TEXT` for a category or status field \"because it's a string\" — `TAG` is roughly 10× faster for exact-match filtering.\n\nSee [references\u002Findex-creation.md](references\u002Findex-creation.md), [references\u002Ffield-types.md](references\u002Ffield-types.md), [references\u002Fdialect.md](references\u002Fdialect.md), [references\u002Fft-create-options.md](references\u002Fft-create-options.md), [references\u002Fjson-indexing.md](references\u002Fjson-indexing.md).\n\n## 3. Common queries\n\nNarrow with filters; return only what you need.\n\n```\n# Tag filter + numeric range, sorted by price\nFT.SEARCH idx:products \"@category:{electronics} @price:[100 500]\"\n    SORTBY price ASC\n    LIMIT 0 20\n    RETURN 3 name price category\n\n# Text + tag filter\nFT.SEARCH idx:products \"wireless headphones @category:{audio}\"\n\n# Negation and OR\nFT.SEARCH idx:products \"@category:{audio} -@brand:{generic} (@price:[0 100] | @on_sale:{true})\"\n```\n\nOperators worth remembering: space = AND, `|` = OR, `-` = NOT, `~` = optional (scoring boost), `=>{$weight: N}` = boost. Escape hyphens and special characters inside TAG values (`@sku:{ABC\\\\-123}`). See [references\u002Fquery-syntax.md](references\u002Fquery-syntax.md) and [references\u002Fsearch-syntax-primitives.md](references\u002Fsearch-syntax-primitives.md) for the DSL vocabulary.\n\nFor tokenization gotchas (stemming, stopwords, language) see [references\u002Ftext-tokenization.md](references\u002Ftext-tokenization.md). For result shaping (`SORTBY`, `RETURN`, `HIGHLIGHT`, `SUMMARIZE`, `NOCONTENT`) see [references\u002Fresult-shaping.md](references\u002Fresult-shaping.md). For performance levers (pre-filters, `SORTABLE` fields, tight `RETURN`, `FT.PROFILE`) see [references\u002Fquery-optimization.md](references\u002Fquery-optimization.md).\n\n## 4. Vector basics\n\nThree vector settings have to match the embedding model exactly:\n\n- **`DIM`** — output dimensionality (e.g. 1536 for OpenAI `text-embedding-3-small`). Mismatch produces silent garbage.\n- **`DISTANCE_METRIC`** — `COSINE` for normalized text embeddings (common case), `IP` for unnormalized inner-product, `L2` for raw Euclidean.\n- **`TYPE`** — usually `FLOAT32`. Use `FLOAT16` or quantized variants only when memory is the binding constraint.\n\n```\n# Index\nFT.CREATE idx:docs ON HASH PREFIX 1 doc:\n    SCHEMA\n        content TEXT\n        embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE\n\n# Pure KNN query (top 5 by cosine similarity)\nFT.SEARCH idx:docs \"*=>[KNN 5 @embedding $vec AS score]\"\n    PARAMS 2 vec \"...\"\n    SORTBY score\n    DIALECT 2\n```\n\n| Algorithm | Speed | Accuracy | Memory | Use for |\n|---|---|---|---|---|\n| **HNSW** | Fast (approximate) | ~95%+ recall (tunable) | Higher | Production: >10k vectors, latency-sensitive |\n| **FLAT** | Slow (exact) | 100% | Lower | Small corpora (\u003C10k), exact-match required |\n\nHNSW tuning levers: `M` (16–64, connections per node), `EF_CONSTRUCTION` (100–500, build quality), `EF_RUNTIME` (query-time candidate list).\n\nSee [references\u002Fvector-query.md](references\u002Fvector-query.md), [references\u002Falgorithm-choice.md](references\u002Falgorithm-choice.md).\n\n## 5. Hybrid retrieval\n\nTwo distinct patterns get called \"hybrid.\" Pick by intent.\n\n**Filter-then-vector** (any Redis version) — apply attribute filters so the engine narrows the search space *before* the vector comparison.\n\n```\nFT.SEARCH idx:docs \"(@category:{tech} @date:[2024 +inf])=>[KNN 10 @embedding $vec AS score]\"\n    PARAMS 2 vec \"...\"\n    SORTBY score\n    DIALECT 2\n```\n\n**Lexical + vector fusion** (Redis ≥ 8.4) — blend BM25 text scoring with vector similarity, fuse with `RRF` or `LINEAR`. Use `FT.HYBRID` (see §1).\n\nDon't fetch a wide unfiltered result and filter client-side — slower and less accurate. See [references\u002Fhybrid-search.md](references\u002Fhybrid-search.md).\n\n## 6. Aggregations and shaping\n\n`FT.AGGREGATE` is the declarative result-shaping command. Build a pipeline of stages.\n\n```\n# Top 5 categories by total revenue\nFT.AGGREGATE idx:orders \"@status:{shipped}\"\n    LOAD 2 @category @amount\n    GROUPBY 1 @category\n        REDUCE SUM 1 @amount AS revenue\n    SORTBY 2 @revenue DESC\n    LIMIT 0 5\n```\n\nCommon stages: `LOAD`, `APPLY` (computed fields), `FILTER` (post-query), `GROUPBY` + `REDUCE` (`SUM`, `COUNT`, `AVG`, `FIRST_VALUE`, `TOLIST`), `SORTBY`, `LIMIT`.\n\nFor long-running result sets use `WITHCURSOR` + `FT.CURSOR READ` to page server-side. See [references\u002Faggregate-pipeline.md](references\u002Faggregate-pipeline.md) and [references\u002Faggregate-cursors.md](references\u002Faggregate-cursors.md).\n\n## 7. RAG pattern\n\nStandard pipeline: embed the query, vector-search Redis, pass top-K context to the LLM.\n\nPractical tips:\n\n- **Match the metric** to the embedding model (almost always `COSINE` for normalized text models).\n- **Chunk long documents** (200–500-token chunks usually beat indexing whole pages).\n- **Batch inserts** rather than one call per record.\n- **Pre-filter with attributes** (tenant, recency, document type) before the vector search — see §5.\n- **Re-rank** at the top of the funnel if precision matters more than recall.\n\nSee [references\u002Frag-pattern.md](references\u002Frag-pattern.md).\n\n## 8. Operations\n\nZero-downtime schema changes: keep app queries pointed at an alias and swap the underlying index.\n\n```\nFT.CREATE idx:products_v2 ON HASH PREFIX 1 product: SCHEMA ...\nFT.ALIASUPDATE products idx:products_v2\n# App queries are stable:\nFT.SEARCH products \"@category:{electronics}\"\n```\n\nUseful management commands: `FT.INFO`, `FT.DROPINDEX`, `FT._LIST`, `FT.ALIASADD\u002FUPDATE\u002FDEL`. See [references\u002Findex-management.md](references\u002Findex-management.md).\n\nDebug empty or slow queries with `FT.EXPLAIN` (shows how the query was parsed) and `FT.PROFILE` (shows execution stats). See [references\u002Fdebugging.md](references\u002Fdebugging.md).\n\n## 9. Client examples\n\nInline examples in this SKILL.md are CLI \u002F RESP form — the wire protocol every client serializes to. For idiomatic snippets in a specific client:\n\n- **redis-py** (Python, raw client): [references\u002Fclients\u002Fpython-redis-py.md](references\u002Fclients\u002Fpython-redis-py.md)\n- **Jedis** (Java): [references\u002Fclients\u002Fjava-jedis.md](references\u002Fclients\u002Fjava-jedis.md)\n- **RedisVL** (Python, higher-level SDK on top of redis-py): [references\u002Fclients\u002Fpython-redisvl.md](references\u002Fclients\u002Fpython-redisvl.md)\n\nOther clients (Lettuce, node-redis, go-redis, NRedisStack, .NET) translate the same CLI form; coverage is tracked as a follow-up.\n\n## References\n\n- [Redis: Search and query](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Finteract\u002Fsearch-and-query\u002F)\n- [Redis: Vectors](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Fai\u002Fsearch-and-query\u002Fvectors\u002F)\n- [Redis: Query syntax](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Finteract\u002Fsearch-and-query\u002Fquery\u002F)\n- [Redis: Query dialects](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Finteract\u002Fsearch-and-query\u002Fadvanced-concepts\u002Fdialects\u002F)\n- [Redis: RAG quickstart](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Fget-started\u002Frag\u002F)\n- [FT.CREATE](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002Fft.create\u002F) · [FT.SEARCH](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002Fft.search\u002F) · [FT.AGGREGATE](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002Fft.aggregate\u002F) · [FT.HYBRID](https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002Fft.hybrid\u002F)\n- [RedisVL documentation](https:\u002F\u002Fdocs.redisvl.com\u002Fen\u002Flatest\u002F)\n",{"data":39,"body":43},{"name":4,"description":6,"license":29,"metadata":40},{"author":41,"version":42},"Redis, Inc.","1.0.0",{"type":44,"children":45},"root",[46,54,77,84,233,239,244,420,432,466,477,510,519,524,727,746,780,786,791,800,858,938,944,949,1041,1050,1149,1178,1194,1200,1205,1223,1232,1264,1274,1280,1290,1299,1387,1419,1425,1430,1435,1495,1505,1511,1516,1525,1563,1588,1594,1599,1647,1652,1658],{"type":47,"tag":48,"props":49,"children":50},"element","h1",{"id":4},[51],{"type":52,"value":53},"text","Redis Search",{"type":47,"tag":55,"props":56,"children":57},"p",{},[58,60,67,69,75],{"type":52,"value":59},"Single source of guidance for Redis Search — the retrieval surface that spans lexical, numeric, geo, JSON-path, and vector queries. Vector fields are part of the same ",{"type":47,"tag":61,"props":62,"children":64},"code",{"className":63},[],[65],{"type":52,"value":66},"FT.CREATE",{"type":52,"value":68}," machinery as TEXT\u002FTAG\u002FNUMERIC fields, and ",{"type":47,"tag":61,"props":70,"children":72},{"className":71},[],[73],{"type":52,"value":74},"FT.HYBRID",{"type":52,"value":76}," blends lexical and vector ranking in one command, so this skill covers them together.",{"type":47,"tag":78,"props":79,"children":81},"h2",{"id":80},"when-to-apply",[82],{"type":52,"value":83},"When to apply",{"type":47,"tag":85,"props":86,"children":87},"ul",{},[88,109,136,184,196,201,206],{"type":47,"tag":89,"props":90,"children":91},"li",{},[92,94,99,101,107],{"type":52,"value":93},"Creating, modifying, or reviewing a Redis Search index (",{"type":47,"tag":61,"props":95,"children":97},{"className":96},[],[98],{"type":52,"value":66},{"type":52,"value":100},", ",{"type":47,"tag":61,"props":102,"children":104},{"className":103},[],[105],{"type":52,"value":106},"FT.ALTER",{"type":52,"value":108},").",{"type":47,"tag":89,"props":110,"children":111},{},[112,114,120,121,127,129,134],{"type":52,"value":113},"Writing or optimizing ",{"type":47,"tag":61,"props":115,"children":117},{"className":116},[],[118],{"type":52,"value":119},"FT.SEARCH",{"type":52,"value":100},{"type":47,"tag":61,"props":122,"children":124},{"className":123},[],[125],{"type":52,"value":126},"FT.AGGREGATE",{"type":52,"value":128},", or ",{"type":47,"tag":61,"props":130,"children":132},{"className":131},[],[133],{"type":52,"value":74},{"type":52,"value":135}," queries.",{"type":47,"tag":89,"props":137,"children":138},{},[139,141,147,148,154,155,161,162,168,169,175,176,182],{"type":52,"value":140},"Picking between ",{"type":47,"tag":61,"props":142,"children":144},{"className":143},[],[145],{"type":52,"value":146},"TEXT",{"type":52,"value":100},{"type":47,"tag":61,"props":149,"children":151},{"className":150},[],[152],{"type":52,"value":153},"TAG",{"type":52,"value":100},{"type":47,"tag":61,"props":156,"children":158},{"className":157},[],[159],{"type":52,"value":160},"NUMERIC",{"type":52,"value":100},{"type":47,"tag":61,"props":163,"children":165},{"className":164},[],[166],{"type":52,"value":167},"GEO",{"type":52,"value":100},{"type":47,"tag":61,"props":170,"children":172},{"className":171},[],[173],{"type":52,"value":174},"GEOSHAPE",{"type":52,"value":100},{"type":47,"tag":61,"props":177,"children":179},{"className":178},[],[180],{"type":52,"value":181},"VECTOR",{"type":52,"value":183},", or JSON-path fields.",{"type":47,"tag":89,"props":185,"children":186},{},[187,189,194],{"type":52,"value":188},"Defining a ",{"type":47,"tag":61,"props":190,"children":192},{"className":191},[],[193],{"type":52,"value":181},{"type":52,"value":195}," field, choosing HNSW vs FLAT, tuning HNSW parameters.",{"type":47,"tag":89,"props":197,"children":198},{},[199],{"type":52,"value":200},"Building a retrieval-augmented generation (RAG) pipeline.",{"type":47,"tag":89,"props":202,"children":203},{},[204],{"type":52,"value":205},"Rolling out a new index schema without downtime.",{"type":47,"tag":89,"props":207,"children":208},{},[209,211,217,218,224,225,231],{"type":52,"value":210},"Troubleshooting empty results, slow queries, or tokenization issues with ",{"type":47,"tag":61,"props":212,"children":214},{"className":213},[],[215],{"type":52,"value":216},"FT.EXPLAIN",{"type":52,"value":100},{"type":47,"tag":61,"props":219,"children":221},{"className":220},[],[222],{"type":52,"value":223},"FT.PROFILE",{"type":52,"value":100},{"type":47,"tag":61,"props":226,"children":228},{"className":227},[],[229],{"type":52,"value":230},"FT.INFO",{"type":52,"value":232},".",{"type":47,"tag":78,"props":234,"children":236},{"id":235},"_1-pick-the-right-command",[237],{"type":52,"value":238},"1. Pick the right command",{"type":47,"tag":55,"props":240,"children":241},{},[242],{"type":52,"value":243},"Three query commands. Reach for the narrowest one that fits.",{"type":47,"tag":245,"props":246,"children":247},"table",{},[248,277],{"type":47,"tag":249,"props":250,"children":251},"thead",{},[252],{"type":47,"tag":253,"props":254,"children":255},"tr",{},[256,262,267,272],{"type":47,"tag":257,"props":258,"children":259},"th",{},[260],{"type":52,"value":261},"Command",{"type":47,"tag":257,"props":263,"children":264},{},[265],{"type":52,"value":266},"When to use",{"type":47,"tag":257,"props":268,"children":269},{},[270],{"type":52,"value":271},"Mental model",{"type":47,"tag":257,"props":273,"children":274},{},[275],{"type":52,"value":276},"Minimum Redis",{"type":47,"tag":278,"props":279,"children":280},"tbody",{},[281,308,368],{"type":47,"tag":253,"props":282,"children":283},{},[284,293,298,303],{"type":47,"tag":285,"props":286,"children":287},"td",{},[288],{"type":47,"tag":289,"props":290,"children":291},"strong",{},[292],{"type":52,"value":119},{"type":47,"tag":285,"props":294,"children":295},{},[296],{"type":52,"value":297},"Document retrieval, ranked or sorted. Best default.",{"type":47,"tag":285,"props":299,"children":300},{},[301],{"type":52,"value":302},"Returns matching docs directly.",{"type":47,"tag":285,"props":304,"children":305},{},[306],{"type":52,"value":307},"2.0 (module) \u002F 8.0 (built-in)",{"type":47,"tag":253,"props":309,"children":310},{},[311,318,323,363],{"type":47,"tag":285,"props":312,"children":313},{},[314],{"type":47,"tag":289,"props":315,"children":316},{},[317],{"type":52,"value":126},{"type":47,"tag":285,"props":319,"children":320},{},[321],{"type":52,"value":322},"Faceting, computed fields, custom output shape, analytics.",{"type":47,"tag":285,"props":324,"children":325},{},[326,328,334,335,341,342,348,349,355,356,362],{"type":52,"value":327},"Declarative pipeline: ",{"type":47,"tag":61,"props":329,"children":331},{"className":330},[],[332],{"type":52,"value":333},"LOAD",{"type":52,"value":100},{"type":47,"tag":61,"props":336,"children":338},{"className":337},[],[339],{"type":52,"value":340},"APPLY",{"type":52,"value":100},{"type":47,"tag":61,"props":343,"children":345},{"className":344},[],[346],{"type":52,"value":347},"GROUPBY",{"type":52,"value":100},{"type":47,"tag":61,"props":350,"children":352},{"className":351},[],[353],{"type":52,"value":354},"REDUCE",{"type":52,"value":100},{"type":47,"tag":61,"props":357,"children":359},{"className":358},[],[360],{"type":52,"value":361},"SORTBY",{"type":52,"value":232},{"type":47,"tag":285,"props":364,"children":365},{},[366],{"type":52,"value":367},"2.0 \u002F 8.0",{"type":47,"tag":253,"props":369,"children":370},{},[371,378,383,412],{"type":47,"tag":285,"props":372,"children":373},{},[374],{"type":47,"tag":289,"props":375,"children":376},{},[377],{"type":52,"value":74},{"type":47,"tag":285,"props":379,"children":380},{},[381],{"type":52,"value":382},"Blend lexical (BM25) with vector similarity, with configurable fusion.",{"type":47,"tag":285,"props":384,"children":385},{},[386,388,394,396,402,404,410],{"type":52,"value":387},"Pipeline with explicit ",{"type":47,"tag":61,"props":389,"children":391},{"className":390},[],[392],{"type":52,"value":393},"SEARCH",{"type":52,"value":395}," + ",{"type":47,"tag":61,"props":397,"children":399},{"className":398},[],[400],{"type":52,"value":401},"VSIM",{"type":52,"value":403}," legs and a ",{"type":47,"tag":61,"props":405,"children":407},{"className":406},[],[408],{"type":52,"value":409},"COMBINE",{"type":52,"value":411}," fusion stage.",{"type":47,"tag":285,"props":413,"children":414},{},[415],{"type":47,"tag":289,"props":416,"children":417},{},[418],{"type":52,"value":419},"8.4.0",{"type":47,"tag":421,"props":422,"children":426},"pre",{"className":423,"code":425,"language":52},[424],"language-text","# FT.SEARCH — most common\nFT.SEARCH idx:products \"@category:{electronics} @price:[100 500]\" LIMIT 0 20 RETURN 3 name price category\n\n# FT.AGGREGATE — top categories by avg price\nFT.AGGREGATE idx:products \"*\" GROUPBY 1 @category REDUCE AVG 1 @price AS avg_price SORTBY 2 @avg_price DESC\n\n# FT.HYBRID (Redis ≥ 8.4) — lexical + vector fusion\nFT.HYBRID idx:docs\n  SEARCH \"@title:transformers\" SCORER BM25 YIELD_SCORE_AS lexscore\n  VSIM embedding $vec KNN count 1 K 50 YIELD_SCORE_AS vecscore\n  COMBINE RRF 2 CONSTANT 60\n  PARAMS 2 vec \"...\"\n  DIALECT 2\n",[427],{"type":47,"tag":61,"props":428,"children":430},{"__ignoreMap":429},"",[431],{"type":52,"value":425},{"type":47,"tag":55,"props":433,"children":434},{},[435,437,442,444,450,452,458,460,465],{"type":52,"value":436},"For Redis \u003C 8.4 the lexical+vector blend is approximated with ",{"type":47,"tag":61,"props":438,"children":440},{"className":439},[],[441],{"type":52,"value":119},{"type":52,"value":443}," pre-filter + ",{"type":47,"tag":61,"props":445,"children":447},{"className":446},[],[448],{"type":52,"value":449},"=>[KNN ...]",{"type":52,"value":451},". See ",{"type":47,"tag":453,"props":454,"children":456},"a",{"href":455},"references\u002Fcommand-selection.md",[457],{"type":52,"value":455},{"type":52,"value":459}," and ",{"type":47,"tag":453,"props":461,"children":463},{"href":462},"references\u002Fhybrid-search.md",[464],{"type":52,"value":462},{"type":52,"value":232},{"type":47,"tag":78,"props":467,"children":469},{"id":468},"_2-schema-basics-ftcreate",[470,472],{"type":52,"value":471},"2. Schema basics — ",{"type":47,"tag":61,"props":473,"children":475},{"className":474},[],[476],{"type":52,"value":66},{"type":47,"tag":55,"props":478,"children":479},{},[480,485,487,493,495,500,502,508],{"type":47,"tag":61,"props":481,"children":483},{"className":482},[],[484],{"type":52,"value":66},{"type":52,"value":486}," indexes Hash or JSON documents matching a ",{"type":47,"tag":61,"props":488,"children":490},{"className":489},[],[491],{"type":52,"value":492},"PREFIX",{"type":52,"value":494},". Always set ",{"type":47,"tag":61,"props":496,"children":498},{"className":497},[],[499],{"type":52,"value":492},{"type":52,"value":501},". Use ",{"type":47,"tag":61,"props":503,"children":505},{"className":504},[],[506],{"type":52,"value":507},"DIALECT 2",{"type":52,"value":509}," (the default since Redis 8; required for vector queries).",{"type":47,"tag":421,"props":511,"children":514},{"className":512,"code":513,"language":52},[424],"FT.CREATE idx:products ON HASH PREFIX 1 product:\n    SCHEMA\n        name TEXT WEIGHT 2.0\n        category TAG SORTABLE\n        price NUMERIC SORTABLE\n        location GEO\n        embedding VECTOR HNSW 6\n            TYPE FLOAT32\n            DIM 1536\n            DISTANCE_METRIC COSINE\n",[515],{"type":47,"tag":61,"props":516,"children":517},{"__ignoreMap":429},[518],{"type":52,"value":513},{"type":47,"tag":55,"props":520,"children":521},{},[522],{"type":52,"value":523},"Pick the narrowest field type that supports your access pattern:",{"type":47,"tag":245,"props":525,"children":526},{},[527,548],{"type":47,"tag":249,"props":528,"children":529},{},[530],{"type":47,"tag":253,"props":531,"children":532},{},[533,538,543],{"type":47,"tag":257,"props":534,"children":535},{},[536],{"type":52,"value":537},"Field type",{"type":47,"tag":257,"props":539,"children":540},{},[541],{"type":52,"value":542},"Use when",{"type":47,"tag":257,"props":544,"children":545},{},[546],{"type":52,"value":547},"Notes",{"type":47,"tag":278,"props":549,"children":550},{},[551,579,608,629,650,671,692],{"type":47,"tag":253,"props":552,"children":553},{},[554,562,567],{"type":47,"tag":285,"props":555,"children":556},{},[557],{"type":47,"tag":61,"props":558,"children":560},{"className":559},[],[561],{"type":52,"value":146},{"type":47,"tag":285,"props":563,"children":564},{},[565],{"type":52,"value":566},"Full-text search",{"type":47,"tag":285,"props":568,"children":569},{},[570,572,577],{"type":52,"value":571},"Tokenized + stemmed; ",{"type":47,"tag":289,"props":573,"children":574},{},[575],{"type":52,"value":576},"not",{"type":52,"value":578}," for exact match",{"type":47,"tag":253,"props":580,"children":581},{},[582,590,595],{"type":47,"tag":285,"props":583,"children":584},{},[585],{"type":47,"tag":61,"props":586,"children":588},{"className":587},[],[589],{"type":52,"value":153},{"type":47,"tag":285,"props":591,"children":592},{},[593],{"type":52,"value":594},"Exact match \u002F filtering",{"type":47,"tag":285,"props":596,"children":597},{},[598,600,606],{"type":52,"value":599},"Add ",{"type":47,"tag":61,"props":601,"children":603},{"className":602},[],[604],{"type":52,"value":605},"SORTABLE UNF",{"type":52,"value":607}," for fastest tag queries",{"type":47,"tag":253,"props":609,"children":610},{},[611,619,624],{"type":47,"tag":285,"props":612,"children":613},{},[614],{"type":47,"tag":61,"props":615,"children":617},{"className":616},[],[618],{"type":52,"value":160},{"type":47,"tag":285,"props":620,"children":621},{},[622],{"type":52,"value":623},"Range queries, sorting",{"type":47,"tag":285,"props":625,"children":626},{},[627],{"type":52,"value":628},"Prices, counts, timestamps",{"type":47,"tag":253,"props":630,"children":631},{},[632,640,645],{"type":47,"tag":285,"props":633,"children":634},{},[635],{"type":47,"tag":61,"props":636,"children":638},{"className":637},[],[639],{"type":52,"value":167},{"type":47,"tag":285,"props":641,"children":642},{},[643],{"type":52,"value":644},"Lat\u002Flong points",{"type":47,"tag":285,"props":646,"children":647},{},[648],{"type":52,"value":649},"Stores, users",{"type":47,"tag":253,"props":651,"children":652},{},[653,661,666],{"type":47,"tag":285,"props":654,"children":655},{},[656],{"type":47,"tag":61,"props":657,"children":659},{"className":658},[],[660],{"type":52,"value":174},{"type":47,"tag":285,"props":662,"children":663},{},[664],{"type":52,"value":665},"Polygon \u002F area queries",{"type":47,"tag":285,"props":667,"children":668},{},[669],{"type":52,"value":670},"Delivery zones, regions",{"type":47,"tag":253,"props":672,"children":673},{},[674,682,687],{"type":47,"tag":285,"props":675,"children":676},{},[677],{"type":47,"tag":61,"props":678,"children":680},{"className":679},[],[681],{"type":52,"value":181},{"type":47,"tag":285,"props":683,"children":684},{},[685],{"type":52,"value":686},"Similarity search",{"type":47,"tag":285,"props":688,"children":689},{},[690],{"type":52,"value":691},"HNSW or FLAT; see §4",{"type":47,"tag":253,"props":693,"children":694},{},[695,706,711],{"type":47,"tag":285,"props":696,"children":697},{},[698,700],{"type":52,"value":699},"JSON ",{"type":47,"tag":61,"props":701,"children":703},{"className":702},[],[704],{"type":52,"value":705},"$.path AS alias",{"type":47,"tag":285,"props":707,"children":708},{},[709],{"type":52,"value":710},"Nested JSON fields",{"type":47,"tag":285,"props":712,"children":713},{},[714,720,722],{"type":47,"tag":61,"props":715,"children":717},{"className":716},[],[718],{"type":52,"value":719},"ON JSON",{"type":52,"value":721},"; see ",{"type":47,"tag":453,"props":723,"children":725},{"href":724},"references\u002Fjson-indexing.md",[726],{"type":52,"value":724},{"type":47,"tag":55,"props":728,"children":729},{},[730,732,737,739,744],{"type":52,"value":731},"The classic mistake is ",{"type":47,"tag":61,"props":733,"children":735},{"className":734},[],[736],{"type":52,"value":146},{"type":52,"value":738}," for a category or status field \"because it's a string\" — ",{"type":47,"tag":61,"props":740,"children":742},{"className":741},[],[743],{"type":52,"value":153},{"type":52,"value":745}," is roughly 10× faster for exact-match filtering.",{"type":47,"tag":55,"props":747,"children":748},{},[749,751,756,757,762,763,768,769,774,775,779],{"type":52,"value":750},"See ",{"type":47,"tag":453,"props":752,"children":754},{"href":753},"references\u002Findex-creation.md",[755],{"type":52,"value":753},{"type":52,"value":100},{"type":47,"tag":453,"props":758,"children":760},{"href":759},"references\u002Ffield-types.md",[761],{"type":52,"value":759},{"type":52,"value":100},{"type":47,"tag":453,"props":764,"children":766},{"href":765},"references\u002Fdialect.md",[767],{"type":52,"value":765},{"type":52,"value":100},{"type":47,"tag":453,"props":770,"children":772},{"href":771},"references\u002Fft-create-options.md",[773],{"type":52,"value":771},{"type":52,"value":100},{"type":47,"tag":453,"props":776,"children":777},{"href":724},[778],{"type":52,"value":724},{"type":52,"value":232},{"type":47,"tag":78,"props":781,"children":783},{"id":782},"_3-common-queries",[784],{"type":52,"value":785},"3. Common queries",{"type":47,"tag":55,"props":787,"children":788},{},[789],{"type":52,"value":790},"Narrow with filters; return only what you need.",{"type":47,"tag":421,"props":792,"children":795},{"className":793,"code":794,"language":52},[424],"# Tag filter + numeric range, sorted by price\nFT.SEARCH idx:products \"@category:{electronics} @price:[100 500]\"\n    SORTBY price ASC\n    LIMIT 0 20\n    RETURN 3 name price category\n\n# Text + tag filter\nFT.SEARCH idx:products \"wireless headphones @category:{audio}\"\n\n# Negation and OR\nFT.SEARCH idx:products \"@category:{audio} -@brand:{generic} (@price:[0 100] | @on_sale:{true})\"\n",[796],{"type":47,"tag":61,"props":797,"children":798},{"__ignoreMap":429},[799],{"type":52,"value":794},{"type":47,"tag":55,"props":801,"children":802},{},[803,805,811,813,819,821,827,829,835,837,843,845,850,851,856],{"type":52,"value":804},"Operators worth remembering: space = AND, ",{"type":47,"tag":61,"props":806,"children":808},{"className":807},[],[809],{"type":52,"value":810},"|",{"type":52,"value":812}," = OR, ",{"type":47,"tag":61,"props":814,"children":816},{"className":815},[],[817],{"type":52,"value":818},"-",{"type":52,"value":820}," = NOT, ",{"type":47,"tag":61,"props":822,"children":824},{"className":823},[],[825],{"type":52,"value":826},"~",{"type":52,"value":828}," = optional (scoring boost), ",{"type":47,"tag":61,"props":830,"children":832},{"className":831},[],[833],{"type":52,"value":834},"=>{$weight: N}",{"type":52,"value":836}," = boost. Escape hyphens and special characters inside TAG values (",{"type":47,"tag":61,"props":838,"children":840},{"className":839},[],[841],{"type":52,"value":842},"@sku:{ABC\\\\-123}",{"type":52,"value":844},"). See ",{"type":47,"tag":453,"props":846,"children":848},{"href":847},"references\u002Fquery-syntax.md",[849],{"type":52,"value":847},{"type":52,"value":459},{"type":47,"tag":453,"props":852,"children":854},{"href":853},"references\u002Fsearch-syntax-primitives.md",[855],{"type":52,"value":853},{"type":52,"value":857}," for the DSL vocabulary.",{"type":47,"tag":55,"props":859,"children":860},{},[861,863,868,870,875,876,882,883,889,890,896,897,903,905,910,912,918,920,925,926,931,932,937],{"type":52,"value":862},"For tokenization gotchas (stemming, stopwords, language) see ",{"type":47,"tag":453,"props":864,"children":866},{"href":865},"references\u002Ftext-tokenization.md",[867],{"type":52,"value":865},{"type":52,"value":869},". For result shaping (",{"type":47,"tag":61,"props":871,"children":873},{"className":872},[],[874],{"type":52,"value":361},{"type":52,"value":100},{"type":47,"tag":61,"props":877,"children":879},{"className":878},[],[880],{"type":52,"value":881},"RETURN",{"type":52,"value":100},{"type":47,"tag":61,"props":884,"children":886},{"className":885},[],[887],{"type":52,"value":888},"HIGHLIGHT",{"type":52,"value":100},{"type":47,"tag":61,"props":891,"children":893},{"className":892},[],[894],{"type":52,"value":895},"SUMMARIZE",{"type":52,"value":100},{"type":47,"tag":61,"props":898,"children":900},{"className":899},[],[901],{"type":52,"value":902},"NOCONTENT",{"type":52,"value":904},") see ",{"type":47,"tag":453,"props":906,"children":908},{"href":907},"references\u002Fresult-shaping.md",[909],{"type":52,"value":907},{"type":52,"value":911},". For performance levers (pre-filters, ",{"type":47,"tag":61,"props":913,"children":915},{"className":914},[],[916],{"type":52,"value":917},"SORTABLE",{"type":52,"value":919}," fields, tight ",{"type":47,"tag":61,"props":921,"children":923},{"className":922},[],[924],{"type":52,"value":881},{"type":52,"value":100},{"type":47,"tag":61,"props":927,"children":929},{"className":928},[],[930],{"type":52,"value":223},{"type":52,"value":904},{"type":47,"tag":453,"props":933,"children":935},{"href":934},"references\u002Fquery-optimization.md",[936],{"type":52,"value":934},{"type":52,"value":232},{"type":47,"tag":78,"props":939,"children":941},{"id":940},"_4-vector-basics",[942],{"type":52,"value":943},"4. Vector basics",{"type":47,"tag":55,"props":945,"children":946},{},[947],{"type":52,"value":948},"Three vector settings have to match the embedding model exactly:",{"type":47,"tag":85,"props":950,"children":951},{},[952,974,1012],{"type":47,"tag":89,"props":953,"children":954},{},[955,964,966,972],{"type":47,"tag":289,"props":956,"children":957},{},[958],{"type":47,"tag":61,"props":959,"children":961},{"className":960},[],[962],{"type":52,"value":963},"DIM",{"type":52,"value":965}," — output dimensionality (e.g. 1536 for OpenAI ",{"type":47,"tag":61,"props":967,"children":969},{"className":968},[],[970],{"type":52,"value":971},"text-embedding-3-small",{"type":52,"value":973},"). Mismatch produces silent garbage.",{"type":47,"tag":89,"props":975,"children":976},{},[977,986,988,994,996,1002,1004,1010],{"type":47,"tag":289,"props":978,"children":979},{},[980],{"type":47,"tag":61,"props":981,"children":983},{"className":982},[],[984],{"type":52,"value":985},"DISTANCE_METRIC",{"type":52,"value":987}," — ",{"type":47,"tag":61,"props":989,"children":991},{"className":990},[],[992],{"type":52,"value":993},"COSINE",{"type":52,"value":995}," for normalized text embeddings (common case), ",{"type":47,"tag":61,"props":997,"children":999},{"className":998},[],[1000],{"type":52,"value":1001},"IP",{"type":52,"value":1003}," for unnormalized inner-product, ",{"type":47,"tag":61,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":52,"value":1009},"L2",{"type":52,"value":1011}," for raw Euclidean.",{"type":47,"tag":89,"props":1013,"children":1014},{},[1015,1024,1026,1032,1033,1039],{"type":47,"tag":289,"props":1016,"children":1017},{},[1018],{"type":47,"tag":61,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":52,"value":1023},"TYPE",{"type":52,"value":1025}," — usually ",{"type":47,"tag":61,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":52,"value":1031},"FLOAT32",{"type":52,"value":501},{"type":47,"tag":61,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":52,"value":1038},"FLOAT16",{"type":52,"value":1040}," or quantized variants only when memory is the binding constraint.",{"type":47,"tag":421,"props":1042,"children":1045},{"className":1043,"code":1044,"language":52},[424],"# Index\nFT.CREATE idx:docs ON HASH PREFIX 1 doc:\n    SCHEMA\n        content TEXT\n        embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE\n\n# Pure KNN query (top 5 by cosine similarity)\nFT.SEARCH idx:docs \"*=>[KNN 5 @embedding $vec AS score]\"\n    PARAMS 2 vec \"...\"\n    SORTBY score\n    DIALECT 2\n",[1046],{"type":47,"tag":61,"props":1047,"children":1048},{"__ignoreMap":429},[1049],{"type":52,"value":1044},{"type":47,"tag":245,"props":1051,"children":1052},{},[1053,1084],{"type":47,"tag":249,"props":1054,"children":1055},{},[1056],{"type":47,"tag":253,"props":1057,"children":1058},{},[1059,1064,1069,1074,1079],{"type":47,"tag":257,"props":1060,"children":1061},{},[1062],{"type":52,"value":1063},"Algorithm",{"type":47,"tag":257,"props":1065,"children":1066},{},[1067],{"type":52,"value":1068},"Speed",{"type":47,"tag":257,"props":1070,"children":1071},{},[1072],{"type":52,"value":1073},"Accuracy",{"type":47,"tag":257,"props":1075,"children":1076},{},[1077],{"type":52,"value":1078},"Memory",{"type":47,"tag":257,"props":1080,"children":1081},{},[1082],{"type":52,"value":1083},"Use for",{"type":47,"tag":278,"props":1085,"children":1086},{},[1087,1118],{"type":47,"tag":253,"props":1088,"children":1089},{},[1090,1098,1103,1108,1113],{"type":47,"tag":285,"props":1091,"children":1092},{},[1093],{"type":47,"tag":289,"props":1094,"children":1095},{},[1096],{"type":52,"value":1097},"HNSW",{"type":47,"tag":285,"props":1099,"children":1100},{},[1101],{"type":52,"value":1102},"Fast (approximate)",{"type":47,"tag":285,"props":1104,"children":1105},{},[1106],{"type":52,"value":1107},"~95%+ recall (tunable)",{"type":47,"tag":285,"props":1109,"children":1110},{},[1111],{"type":52,"value":1112},"Higher",{"type":47,"tag":285,"props":1114,"children":1115},{},[1116],{"type":52,"value":1117},"Production: >10k vectors, latency-sensitive",{"type":47,"tag":253,"props":1119,"children":1120},{},[1121,1129,1134,1139,1144],{"type":47,"tag":285,"props":1122,"children":1123},{},[1124],{"type":47,"tag":289,"props":1125,"children":1126},{},[1127],{"type":52,"value":1128},"FLAT",{"type":47,"tag":285,"props":1130,"children":1131},{},[1132],{"type":52,"value":1133},"Slow (exact)",{"type":47,"tag":285,"props":1135,"children":1136},{},[1137],{"type":52,"value":1138},"100%",{"type":47,"tag":285,"props":1140,"children":1141},{},[1142],{"type":52,"value":1143},"Lower",{"type":47,"tag":285,"props":1145,"children":1146},{},[1147],{"type":52,"value":1148},"Small corpora (\u003C10k), exact-match required",{"type":47,"tag":55,"props":1150,"children":1151},{},[1152,1154,1160,1162,1168,1170,1176],{"type":52,"value":1153},"HNSW tuning levers: ",{"type":47,"tag":61,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":52,"value":1159},"M",{"type":52,"value":1161}," (16–64, connections per node), ",{"type":47,"tag":61,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":52,"value":1167},"EF_CONSTRUCTION",{"type":52,"value":1169}," (100–500, build quality), ",{"type":47,"tag":61,"props":1171,"children":1173},{"className":1172},[],[1174],{"type":52,"value":1175},"EF_RUNTIME",{"type":52,"value":1177}," (query-time candidate list).",{"type":47,"tag":55,"props":1179,"children":1180},{},[1181,1182,1187,1188,1193],{"type":52,"value":750},{"type":47,"tag":453,"props":1183,"children":1185},{"href":1184},"references\u002Fvector-query.md",[1186],{"type":52,"value":1184},{"type":52,"value":100},{"type":47,"tag":453,"props":1189,"children":1191},{"href":1190},"references\u002Falgorithm-choice.md",[1192],{"type":52,"value":1190},{"type":52,"value":232},{"type":47,"tag":78,"props":1195,"children":1197},{"id":1196},"_5-hybrid-retrieval",[1198],{"type":52,"value":1199},"5. Hybrid retrieval",{"type":47,"tag":55,"props":1201,"children":1202},{},[1203],{"type":52,"value":1204},"Two distinct patterns get called \"hybrid.\" Pick by intent.",{"type":47,"tag":55,"props":1206,"children":1207},{},[1208,1213,1215,1221],{"type":47,"tag":289,"props":1209,"children":1210},{},[1211],{"type":52,"value":1212},"Filter-then-vector",{"type":52,"value":1214}," (any Redis version) — apply attribute filters so the engine narrows the search space ",{"type":47,"tag":1216,"props":1217,"children":1218},"em",{},[1219],{"type":52,"value":1220},"before",{"type":52,"value":1222}," the vector comparison.",{"type":47,"tag":421,"props":1224,"children":1227},{"className":1225,"code":1226,"language":52},[424],"FT.SEARCH idx:docs \"(@category:{tech} @date:[2024 +inf])=>[KNN 10 @embedding $vec AS score]\"\n    PARAMS 2 vec \"...\"\n    SORTBY score\n    DIALECT 2\n",[1228],{"type":47,"tag":61,"props":1229,"children":1230},{"__ignoreMap":429},[1231],{"type":52,"value":1226},{"type":47,"tag":55,"props":1233,"children":1234},{},[1235,1240,1242,1248,1250,1256,1257,1262],{"type":47,"tag":289,"props":1236,"children":1237},{},[1238],{"type":52,"value":1239},"Lexical + vector fusion",{"type":52,"value":1241}," (Redis ≥ 8.4) — blend BM25 text scoring with vector similarity, fuse with ",{"type":47,"tag":61,"props":1243,"children":1245},{"className":1244},[],[1246],{"type":52,"value":1247},"RRF",{"type":52,"value":1249}," or ",{"type":47,"tag":61,"props":1251,"children":1253},{"className":1252},[],[1254],{"type":52,"value":1255},"LINEAR",{"type":52,"value":501},{"type":47,"tag":61,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":52,"value":74},{"type":52,"value":1263}," (see §1).",{"type":47,"tag":55,"props":1265,"children":1266},{},[1267,1269,1273],{"type":52,"value":1268},"Don't fetch a wide unfiltered result and filter client-side — slower and less accurate. See ",{"type":47,"tag":453,"props":1270,"children":1271},{"href":462},[1272],{"type":52,"value":462},{"type":52,"value":232},{"type":47,"tag":78,"props":1275,"children":1277},{"id":1276},"_6-aggregations-and-shaping",[1278],{"type":52,"value":1279},"6. Aggregations and shaping",{"type":47,"tag":55,"props":1281,"children":1282},{},[1283,1288],{"type":47,"tag":61,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":52,"value":126},{"type":52,"value":1289}," is the declarative result-shaping command. Build a pipeline of stages.",{"type":47,"tag":421,"props":1291,"children":1294},{"className":1292,"code":1293,"language":52},[424],"# Top 5 categories by total revenue\nFT.AGGREGATE idx:orders \"@status:{shipped}\"\n    LOAD 2 @category @amount\n    GROUPBY 1 @category\n        REDUCE SUM 1 @amount AS revenue\n    SORTBY 2 @revenue DESC\n    LIMIT 0 5\n",[1295],{"type":47,"tag":61,"props":1296,"children":1297},{"__ignoreMap":429},[1298],{"type":52,"value":1293},{"type":47,"tag":55,"props":1300,"children":1301},{},[1302,1304,1309,1310,1315,1317,1323,1325,1330,1331,1336,1338,1344,1345,1351,1352,1358,1359,1365,1366,1372,1374,1379,1380,1386],{"type":52,"value":1303},"Common stages: ",{"type":47,"tag":61,"props":1305,"children":1307},{"className":1306},[],[1308],{"type":52,"value":333},{"type":52,"value":100},{"type":47,"tag":61,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":52,"value":340},{"type":52,"value":1316}," (computed fields), ",{"type":47,"tag":61,"props":1318,"children":1320},{"className":1319},[],[1321],{"type":52,"value":1322},"FILTER",{"type":52,"value":1324}," (post-query), ",{"type":47,"tag":61,"props":1326,"children":1328},{"className":1327},[],[1329],{"type":52,"value":347},{"type":52,"value":395},{"type":47,"tag":61,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":52,"value":354},{"type":52,"value":1337}," (",{"type":47,"tag":61,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":52,"value":1343},"SUM",{"type":52,"value":100},{"type":47,"tag":61,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":52,"value":1350},"COUNT",{"type":52,"value":100},{"type":47,"tag":61,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":52,"value":1357},"AVG",{"type":52,"value":100},{"type":47,"tag":61,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":52,"value":1364},"FIRST_VALUE",{"type":52,"value":100},{"type":47,"tag":61,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":52,"value":1371},"TOLIST",{"type":52,"value":1373},"), ",{"type":47,"tag":61,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":52,"value":361},{"type":52,"value":100},{"type":47,"tag":61,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":52,"value":1385},"LIMIT",{"type":52,"value":232},{"type":47,"tag":55,"props":1388,"children":1389},{},[1390,1392,1398,1399,1405,1407,1412,1413,1418],{"type":52,"value":1391},"For long-running result sets use ",{"type":47,"tag":61,"props":1393,"children":1395},{"className":1394},[],[1396],{"type":52,"value":1397},"WITHCURSOR",{"type":52,"value":395},{"type":47,"tag":61,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":52,"value":1404},"FT.CURSOR READ",{"type":52,"value":1406}," to page server-side. See ",{"type":47,"tag":453,"props":1408,"children":1410},{"href":1409},"references\u002Faggregate-pipeline.md",[1411],{"type":52,"value":1409},{"type":52,"value":459},{"type":47,"tag":453,"props":1414,"children":1416},{"href":1415},"references\u002Faggregate-cursors.md",[1417],{"type":52,"value":1415},{"type":52,"value":232},{"type":47,"tag":78,"props":1420,"children":1422},{"id":1421},"_7-rag-pattern",[1423],{"type":52,"value":1424},"7. RAG pattern",{"type":47,"tag":55,"props":1426,"children":1427},{},[1428],{"type":52,"value":1429},"Standard pipeline: embed the query, vector-search Redis, pass top-K context to the LLM.",{"type":47,"tag":55,"props":1431,"children":1432},{},[1433],{"type":52,"value":1434},"Practical tips:",{"type":47,"tag":85,"props":1436,"children":1437},{},[1438,1455,1465,1475,1485],{"type":47,"tag":89,"props":1439,"children":1440},{},[1441,1446,1448,1453],{"type":47,"tag":289,"props":1442,"children":1443},{},[1444],{"type":52,"value":1445},"Match the metric",{"type":52,"value":1447}," to the embedding model (almost always ",{"type":47,"tag":61,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":52,"value":993},{"type":52,"value":1454}," for normalized text models).",{"type":47,"tag":89,"props":1456,"children":1457},{},[1458,1463],{"type":47,"tag":289,"props":1459,"children":1460},{},[1461],{"type":52,"value":1462},"Chunk long documents",{"type":52,"value":1464}," (200–500-token chunks usually beat indexing whole pages).",{"type":47,"tag":89,"props":1466,"children":1467},{},[1468,1473],{"type":47,"tag":289,"props":1469,"children":1470},{},[1471],{"type":52,"value":1472},"Batch inserts",{"type":52,"value":1474}," rather than one call per record.",{"type":47,"tag":89,"props":1476,"children":1477},{},[1478,1483],{"type":47,"tag":289,"props":1479,"children":1480},{},[1481],{"type":52,"value":1482},"Pre-filter with attributes",{"type":52,"value":1484}," (tenant, recency, document type) before the vector search — see §5.",{"type":47,"tag":89,"props":1486,"children":1487},{},[1488,1493],{"type":47,"tag":289,"props":1489,"children":1490},{},[1491],{"type":52,"value":1492},"Re-rank",{"type":52,"value":1494}," at the top of the funnel if precision matters more than recall.",{"type":47,"tag":55,"props":1496,"children":1497},{},[1498,1499,1504],{"type":52,"value":750},{"type":47,"tag":453,"props":1500,"children":1502},{"href":1501},"references\u002Frag-pattern.md",[1503],{"type":52,"value":1501},{"type":52,"value":232},{"type":47,"tag":78,"props":1506,"children":1508},{"id":1507},"_8-operations",[1509],{"type":52,"value":1510},"8. Operations",{"type":47,"tag":55,"props":1512,"children":1513},{},[1514],{"type":52,"value":1515},"Zero-downtime schema changes: keep app queries pointed at an alias and swap the underlying index.",{"type":47,"tag":421,"props":1517,"children":1520},{"className":1518,"code":1519,"language":52},[424],"FT.CREATE idx:products_v2 ON HASH PREFIX 1 product: SCHEMA ...\nFT.ALIASUPDATE products idx:products_v2\n# App queries are stable:\nFT.SEARCH products \"@category:{electronics}\"\n",[1521],{"type":47,"tag":61,"props":1522,"children":1523},{"__ignoreMap":429},[1524],{"type":52,"value":1519},{"type":47,"tag":55,"props":1526,"children":1527},{},[1528,1530,1535,1536,1542,1543,1549,1550,1556,1557,1562],{"type":52,"value":1529},"Useful management commands: ",{"type":47,"tag":61,"props":1531,"children":1533},{"className":1532},[],[1534],{"type":52,"value":230},{"type":52,"value":100},{"type":47,"tag":61,"props":1537,"children":1539},{"className":1538},[],[1540],{"type":52,"value":1541},"FT.DROPINDEX",{"type":52,"value":100},{"type":47,"tag":61,"props":1544,"children":1546},{"className":1545},[],[1547],{"type":52,"value":1548},"FT._LIST",{"type":52,"value":100},{"type":47,"tag":61,"props":1551,"children":1553},{"className":1552},[],[1554],{"type":52,"value":1555},"FT.ALIASADD\u002FUPDATE\u002FDEL",{"type":52,"value":451},{"type":47,"tag":453,"props":1558,"children":1560},{"href":1559},"references\u002Findex-management.md",[1561],{"type":52,"value":1559},{"type":52,"value":232},{"type":47,"tag":55,"props":1564,"children":1565},{},[1566,1568,1573,1575,1580,1582,1587],{"type":52,"value":1567},"Debug empty or slow queries with ",{"type":47,"tag":61,"props":1569,"children":1571},{"className":1570},[],[1572],{"type":52,"value":216},{"type":52,"value":1574}," (shows how the query was parsed) and ",{"type":47,"tag":61,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":52,"value":223},{"type":52,"value":1581}," (shows execution stats). See ",{"type":47,"tag":453,"props":1583,"children":1585},{"href":1584},"references\u002Fdebugging.md",[1586],{"type":52,"value":1584},{"type":52,"value":232},{"type":47,"tag":78,"props":1589,"children":1591},{"id":1590},"_9-client-examples",[1592],{"type":52,"value":1593},"9. Client examples",{"type":47,"tag":55,"props":1595,"children":1596},{},[1597],{"type":52,"value":1598},"Inline examples in this SKILL.md are CLI \u002F RESP form — the wire protocol every client serializes to. For idiomatic snippets in a specific client:",{"type":47,"tag":85,"props":1600,"children":1601},{},[1602,1617,1632],{"type":47,"tag":89,"props":1603,"children":1604},{},[1605,1610,1612],{"type":47,"tag":289,"props":1606,"children":1607},{},[1608],{"type":52,"value":1609},"redis-py",{"type":52,"value":1611}," (Python, raw client): ",{"type":47,"tag":453,"props":1613,"children":1615},{"href":1614},"references\u002Fclients\u002Fpython-redis-py.md",[1616],{"type":52,"value":1614},{"type":47,"tag":89,"props":1618,"children":1619},{},[1620,1625,1627],{"type":47,"tag":289,"props":1621,"children":1622},{},[1623],{"type":52,"value":1624},"Jedis",{"type":52,"value":1626}," (Java): ",{"type":47,"tag":453,"props":1628,"children":1630},{"href":1629},"references\u002Fclients\u002Fjava-jedis.md",[1631],{"type":52,"value":1629},{"type":47,"tag":89,"props":1633,"children":1634},{},[1635,1640,1642],{"type":47,"tag":289,"props":1636,"children":1637},{},[1638],{"type":52,"value":1639},"RedisVL",{"type":52,"value":1641}," (Python, higher-level SDK on top of redis-py): ",{"type":47,"tag":453,"props":1643,"children":1645},{"href":1644},"references\u002Fclients\u002Fpython-redisvl.md",[1646],{"type":52,"value":1644},{"type":47,"tag":55,"props":1648,"children":1649},{},[1650],{"type":52,"value":1651},"Other clients (Lettuce, node-redis, go-redis, NRedisStack, .NET) translate the same CLI form; coverage is tracked as a follow-up.",{"type":47,"tag":78,"props":1653,"children":1655},{"id":1654},"references",[1656],{"type":52,"value":1657},"References",{"type":47,"tag":85,"props":1659,"children":1660},{},[1661,1672,1682,1692,1702,1712,1743],{"type":47,"tag":89,"props":1662,"children":1663},{},[1664],{"type":47,"tag":453,"props":1665,"children":1669},{"href":1666,"rel":1667},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Finteract\u002Fsearch-and-query\u002F",[1668],"nofollow",[1670],{"type":52,"value":1671},"Redis: Search and query",{"type":47,"tag":89,"props":1673,"children":1674},{},[1675],{"type":47,"tag":453,"props":1676,"children":1679},{"href":1677,"rel":1678},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Fai\u002Fsearch-and-query\u002Fvectors\u002F",[1668],[1680],{"type":52,"value":1681},"Redis: Vectors",{"type":47,"tag":89,"props":1683,"children":1684},{},[1685],{"type":47,"tag":453,"props":1686,"children":1689},{"href":1687,"rel":1688},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Finteract\u002Fsearch-and-query\u002Fquery\u002F",[1668],[1690],{"type":52,"value":1691},"Redis: Query syntax",{"type":47,"tag":89,"props":1693,"children":1694},{},[1695],{"type":47,"tag":453,"props":1696,"children":1699},{"href":1697,"rel":1698},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Finteract\u002Fsearch-and-query\u002Fadvanced-concepts\u002Fdialects\u002F",[1668],[1700],{"type":52,"value":1701},"Redis: Query dialects",{"type":47,"tag":89,"props":1703,"children":1704},{},[1705],{"type":47,"tag":453,"props":1706,"children":1709},{"href":1707,"rel":1708},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Fget-started\u002Frag\u002F",[1668],[1710],{"type":52,"value":1711},"Redis: RAG quickstart",{"type":47,"tag":89,"props":1713,"children":1714},{},[1715,1721,1723,1729,1730,1736,1737],{"type":47,"tag":453,"props":1716,"children":1719},{"href":1717,"rel":1718},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002Fft.create\u002F",[1668],[1720],{"type":52,"value":66},{"type":52,"value":1722}," · ",{"type":47,"tag":453,"props":1724,"children":1727},{"href":1725,"rel":1726},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002Fft.search\u002F",[1668],[1728],{"type":52,"value":119},{"type":52,"value":1722},{"type":47,"tag":453,"props":1731,"children":1734},{"href":1732,"rel":1733},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002Fft.aggregate\u002F",[1668],[1735],{"type":52,"value":126},{"type":52,"value":1722},{"type":47,"tag":453,"props":1738,"children":1741},{"href":1739,"rel":1740},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fcommands\u002Fft.hybrid\u002F",[1668],[1742],{"type":52,"value":74},{"type":47,"tag":89,"props":1744,"children":1745},{},[1746],{"type":47,"tag":453,"props":1747,"children":1750},{"href":1748,"rel":1749},"https:\u002F\u002Fdocs.redisvl.com\u002Fen\u002Flatest\u002F",[1668],[1751],{"type":52,"value":1752},"RedisVL documentation",{"items":1754,"total":1862},[1755,1774,1790,1803,1816,1834,1842],{"slug":1756,"name":1756,"fn":1757,"description":1758,"org":1759,"tags":1760,"stars":26,"repoUrl":27,"updatedAt":1773},"iris-development","integrate with Redis Iris AI products","Iris is Redis's umbrella for AI-focused products. Use this skill when integrating with the Iris Redis Agent Memory (RAM) data plane on Redis Cloud — recording session events for an AI agent, creating or searching long-term memories, configuring a memory store, or tuning background memory promotion. Code examples use the official `redis-agent-memory` (Python) and `@redis-iris\u002Fagent-memory` (TypeScript) SDKs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1761,1764,1767,1770,1772],{"name":1762,"slug":1763,"type":15},"Agents","agents",{"name":1765,"slug":1766,"type":15},"AI Infrastructure","ai-infrastructure",{"name":1768,"slug":1769,"type":15},"Backend","backend",{"name":1078,"slug":1771,"type":15},"memory",{"name":9,"slug":8,"type":15},"2026-05-27T07:19:45.213725",{"slug":1775,"name":1775,"fn":1776,"description":1777,"org":1778,"tags":1779,"stars":26,"repoUrl":27,"updatedAt":1789},"redis-clustering","configure Redis clustering and replication","Redis Cluster and replication guidance covering hash tags for multi-key operations, avoiding CROSSSLOT errors, and reading from replicas to scale read-heavy workloads. Use when designing keys for a sharded Redis Cluster, debugging CROSSSLOT errors on MGET \u002F SDIFF \u002F pipelines, configuring a multi-key transaction in a cluster, or routing reads to replicas for caches, analytics, or dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1780,1781,1782,1785,1788],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1783,"slug":1784,"type":15},"Infrastructure","infrastructure",{"name":1786,"slug":1787,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-05-27T07:19:38.757599",{"slug":1791,"name":1791,"fn":1792,"description":1793,"org":1794,"tags":1795,"stars":26,"repoUrl":27,"updatedAt":1802},"redis-connections","optimize Redis client connections","Redis client and connection guidance covering connection pooling, multiplexing, pipelining, client-side caching with RESP3, avoiding slow commands (KEYS, SMEMBERS, HGETALL), and tuning socket timeouts. Use when configuring a Redis client (redis-py, Jedis, Lettuce, NRedisStack), batching commands for throughput, eliminating per-request connection creation, iterating large keyspaces with SCAN, enabling client-side caching for read-heavy workloads, or setting connect and read timeouts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1796,1797,1800,1801],{"name":1768,"slug":1769,"type":15},{"name":1798,"slug":1799,"type":15},"Caching","caching",{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},"2026-05-27T07:19:42.616757",{"slug":1804,"name":1804,"fn":1805,"description":1806,"org":1807,"tags":1808,"stars":26,"repoUrl":27,"updatedAt":1815},"redis-core","model data with Redis structures","Core Redis modeling guidance — choose the right data structure (String, Hash, List, Set, Sorted Set, JSON, Stream, Vector Set) and use consistent colon-separated key names. Use when designing a Redis data model, caching objects, deciding between Hash and JSON, building counters, leaderboards, membership sets, or session stores, or when reviewing\u002Fcleaning up Redis key naming.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1809,1810,1813,1814],{"name":13,"slug":14,"type":15},{"name":1811,"slug":1812,"type":15},"Data Modeling","data-modeling",{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-05-27T07:19:41.317954",{"slug":1817,"name":1817,"fn":1818,"description":1819,"org":1820,"tags":1821,"stars":26,"repoUrl":27,"updatedAt":1833},"redis-observability","monitor and triage Redis performance","Redis observability guidance — which metrics to monitor (memory, connections, hit ratio, ops\u002Fsec, rejected connections), which built-in commands to reach for during incident triage (SLOWLOG, INFO, MEMORY DOCTOR, CLIENT LIST, FT.PROFILE), and when to use the Redis Insight GUI. Use when setting up monitoring or alerts for a Redis instance, diagnosing a performance regression, profiling a slow FT.SEARCH query, or wiring Redis metrics into Prometheus, Datadog, or similar.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1822,1825,1828,1831,1832],{"name":1823,"slug":1824,"type":15},"Debugging","debugging",{"name":1826,"slug":1827,"type":15},"Monitoring","monitoring",{"name":1829,"slug":1830,"type":15},"Observability","observability",{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},"2026-05-27T07:19:47.780873",{"slug":4,"name":4,"fn":5,"description":6,"org":1835,"tags":1836,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1837,1838,1839,1840,1841],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"slug":1843,"name":1843,"fn":1844,"description":1845,"org":1846,"tags":1847,"stars":26,"repoUrl":27,"updatedAt":1861},"redis-security","secure Redis instances and clusters","Redis security guidance covering authentication (requirepass and ACL users), TLS, ACL-based least-privilege access control, restricting network exposure via bind and protected-mode, firewall rules, and disabling dangerous commands. Use when deploying Redis to production, defining ACL users for an application, configuring TLS connections, locking down a Redis instance behind a firewall, or auditing a Redis deployment for security hardening.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1848,1851,1854,1857,1858],{"name":1849,"slug":1850,"type":15},"Access Control","access-control",{"name":1852,"slug":1853,"type":15},"Authentication","authentication",{"name":1855,"slug":1856,"type":15},"Compliance","compliance",{"name":9,"slug":8,"type":15},{"name":1859,"slug":1860,"type":15},"Security","security","2026-05-27T07:19:40.030241",8,{"items":1864,"total":1993},[1865,1873,1881,1888,1895,1903,1911,1919,1933,1948,1963,1980],{"slug":1756,"name":1756,"fn":1757,"description":1758,"org":1866,"tags":1867,"stars":26,"repoUrl":27,"updatedAt":1773},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1868,1869,1870,1871,1872],{"name":1762,"slug":1763,"type":15},{"name":1765,"slug":1766,"type":15},{"name":1768,"slug":1769,"type":15},{"name":1078,"slug":1771,"type":15},{"name":9,"slug":8,"type":15},{"slug":1775,"name":1775,"fn":1776,"description":1777,"org":1874,"tags":1875,"stars":26,"repoUrl":27,"updatedAt":1789},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1876,1877,1878,1879,1880],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1783,"slug":1784,"type":15},{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"slug":1791,"name":1791,"fn":1792,"description":1793,"org":1882,"tags":1883,"stars":26,"repoUrl":27,"updatedAt":1802},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1884,1885,1886,1887],{"name":1768,"slug":1769,"type":15},{"name":1798,"slug":1799,"type":15},{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"slug":1804,"name":1804,"fn":1805,"description":1806,"org":1889,"tags":1890,"stars":26,"repoUrl":27,"updatedAt":1815},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1891,1892,1893,1894],{"name":13,"slug":14,"type":15},{"name":1811,"slug":1812,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":1817,"name":1817,"fn":1818,"description":1819,"org":1896,"tags":1897,"stars":26,"repoUrl":27,"updatedAt":1833},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1898,1899,1900,1901,1902],{"name":1823,"slug":1824,"type":15},{"name":1826,"slug":1827,"type":15},{"name":1829,"slug":1830,"type":15},{"name":1786,"slug":1787,"type":15},{"name":9,"slug":8,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1904,"tags":1905,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1906,1907,1908,1909,1910],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"slug":1843,"name":1843,"fn":1844,"description":1845,"org":1912,"tags":1913,"stars":26,"repoUrl":27,"updatedAt":1861},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1914,1915,1916,1917,1918],{"name":1849,"slug":1850,"type":15},{"name":1852,"slug":1853,"type":15},{"name":1855,"slug":1856,"type":15},{"name":9,"slug":8,"type":15},{"name":1859,"slug":1860,"type":15},{"slug":1920,"name":1920,"fn":1921,"description":1922,"org":1923,"tags":1924,"stars":26,"repoUrl":27,"updatedAt":1932},"redis-semantic-cache","implement semantic caching with Redis","Redis LangCache guidance for semantic caching of LLM responses on Redis Cloud — calling search\u002Fset via the SDK or REST API, tuning the similarity threshold, separating caches per task type, and filtering with custom attributes. Use when caching LLM completions or RAG answers to cut API cost and latency, building a cache-aside layer in front of OpenAI \u002F Anthropic \u002F etc., tuning hit rate vs precision, or splitting one app's LLM workloads into multiple LangCache caches.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1925,1926,1927,1930,1931],{"name":1765,"slug":1766,"type":15},{"name":1798,"slug":1799,"type":15},{"name":1928,"slug":1929,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-05-27T07:19:43.897283",{"slug":1934,"name":1934,"fn":1935,"description":1936,"org":1937,"tags":1938,"stars":1945,"repoUrl":1946,"updatedAt":1947},"agent-filesystem","manage persistent storage in Redis","Use when agents need persistent shared storage, when saving or restoring workspace state, or when coordinating file access across multiple agents and machines. Creates Redis-backed workspaces, checkpoints and restores agent state, mounts shared filesystems locally, searches workspace contents, and forks workspaces for parallel work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1939,1940,1943,1944],{"name":1762,"slug":1763,"type":15},{"name":1941,"slug":1942,"type":15},"File Storage","file-storage",{"name":1078,"slug":1771,"type":15},{"name":9,"slug":8,"type":15},22,"https:\u002F\u002Fgithub.com\u002Fredis\u002Fagent-filesystem","2026-04-10T04:51:05.904489",{"slug":1949,"name":1949,"fn":1950,"description":1951,"org":1952,"tags":1953,"stars":1945,"repoUrl":1946,"updatedAt":1962},"codex-settings-sync","sync Codex settings across computers","Use when the user wants to migrate Codex state in ~\u002F.codex into Agent Filesystem and mount the same shared Codex memory\u002Fsettings across multiple computers. Recommends a .afsignore before migration and defaults to excluding worktrees, caches, logs, and temporary files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1954,1957,1958,1961],{"name":1955,"slug":1956,"type":15},"Codex","codex",{"name":1078,"slug":1771,"type":15},{"name":1959,"slug":1960,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-04-10T04:51:07.268248",{"slug":1964,"name":1964,"fn":1965,"description":1966,"org":1967,"tags":1968,"stars":1977,"repoUrl":1978,"updatedAt":1979},"cloud-database-provisioning","provision Redis Cloud databases","Provision a Redis Cloud database end-to-end — Essentials (fixed plan) or Pro (custom) — using Redis Cloud MCP tools",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1969,1972,1973,1976],{"name":1970,"slug":1971,"type":15},"Cloud","cloud",{"name":17,"slug":18,"type":15},{"name":1974,"slug":1975,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},15,"https:\u002F\u002Fgithub.com\u002Fredis\u002Fredisctl","2026-06-03T07:53:00.906753",{"slug":1981,"name":1981,"fn":1982,"description":1983,"org":1984,"tags":1985,"stars":1977,"repoUrl":1978,"updatedAt":1992},"compare-approaches","prototype Redis data model alternatives","Prototype and compare 2-3 Redis data model alternatives for the same workload",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1986,1987,1988,1991],{"name":1811,"slug":1812,"type":15},{"name":17,"slug":18,"type":15},{"name":1989,"slug":1990,"type":15},"Prototyping","prototyping",{"name":9,"slug":8,"type":15},"2026-05-27T07:19:55.591944",27]