Search
Quickstart
1. Create Index
import { Redis, s } from "@upstash/redis";const redis = Redis.fromEnv();const index = await redis.search.createIndex({ name: "products", dataType: "json", prefix: "product:", schema: s.object({ name: s.string(), description: s.string(), category: s.string().noTokenize(), price: s.number(), inStock: s.boolean(), }),});from upstash_redis import Redisredis = Redis.from_env()index = redis.search.create_index( name="products", data_type="json", prefixes="product:", schema={ "name": "TEXT", "description": "TEXT", "category": {"type": "TEXT", "notokenize": True}, "price": "F64", "inStock": "BOOL", },)SEARCH.CREATE products ON JSON PREFIX 1 product: SCHEMA name TEXT description TEXT category TEXT NOTOKENIZE price F64 FAST inStock BOOLCreate an index once, not on every request. createIndex throws if an index with
the same name already exists. To make setup safely re-runnable, pass exists_ok=True
in the Python SDK, or wrap the call in a try/catch in TypeScript.
2. Add Data
Add data using standard Redis JSON commands. Any key matching the index prefix will be automatically indexed.
Writes are indexed asynchronously: a JSON.SET returns before the document is
searchable. For demos and tests, call waitIndexing() / wait_indexing() to
block until pending updates are applied. In production, queries running on a later
request will normally hit an up-to-date index without waiting.
await redis.json.set("product:1", "$", { name: "Wireless Headphones", description: "Premium noise-cancelling wireless headphones with 30-hour battery life", category: "electronics", price: 199.99, inStock: true,});await redis.json.set("product:2", "$", { name: "Running Shoes", description: "Lightweight running shoes with advanced cushioning technology", category: "sports", price: 129.99, inStock: true,});await index.waitIndexing();redis.json.set("product:1", "$", { "name": "Wireless Headphones", "description": "Premium noise-cancelling wireless headphones with 30-hour battery life", "category": "electronics", "price": 199.99, "inStock": True,})redis.json.set("product:2", "$", { "name": "Running Shoes", "description": "Lightweight running shoes with advanced cushioning technology", "category": "sports", "price": 129.99, "inStock": True,})index.wait_indexing()JSON.SET product:1 $ '{"name": "Wireless Headphones", "description": "Premium noise-cancelling wireless headphones with 30-hour battery life", "category": "electronics", "price": 199.99, "inStock": true}'JSON.SET product:2 $ '{"name": "Running Shoes", "description": "Lightweight running shoes with advanced cushioning technology", "category": "sports", "price": 129.99, "inStock": true}'SEARCH.WAITINDEXING products3. Search Data
const results = await index.query({ filter: { description: "wireless" },});const count = await index.count({ filter: { price: { $lt: 150 } },});results = index.query(filter={"description": "wireless"})count = index.count(filter={"price": {"$lt": 150}})SEARCH.QUERY products '{"description": "wireless"}'SEARCH.COUNT products '{"price": {"$lt": 150}}'