This repo is a Redis Search demo built around S&P 500 FY2025 10-K filings. It shows how Redis can support structured filtering, autocomplete, full-text search, vector search, and hybrid search over the same application data.
Dataset:
- sample-records.json.zip
- Extract
sample-records.jsontosrc/main/resources/datasets/sp500-fy2025-10k/sample-records.json
- Java 25
- Docker and Docker Compose
- A Redis runtime on port
6379with Redis Search, JSON, and vector support - Enough local disk and patience for initial dataset indexing
Notes:
- This repo is intentionally pinned to Java 25 in
build.gradle.kts. - The Docker setup in this repo is now pinned to versioned Redis images for a more reproducible demo environment.
docker compose up -dThis starts Redis and RedisInsight.
- Redis:
redis://localhost:6379 - RedisInsight:
http://localhost:5540
Note:
- The compose file uses
redis:8andredis/redisinsight:2.70. - Vector and hybrid search also depend on a working embedding runtime.
- If the embedder is not ready, full-text, filters, and autocomplete can still work while vector and hybrid fail at runtime.
./gradlew bootRunOpen the demo at:
http://localhost:8080
The browser UI is the main way to experience this demo.
- Open
http://localhost:8080. - Use the free-text query box to search the 10-K corpus.
- Use the filters to narrow by company, ticker, sector, section, filing year, or filing date.
- Switch between
Full-Text,Vector, andHybridmodes. - Review the ranked chunk results and the live diagnostics shown in the UI.
Use RedisInsight if you want to inspect the underlying Redis data, but the demo itself is meant to be driven from the app UI.
When Redis is empty, startup takes longer because the app indexes the packaged dataset into Redis and generates embeddings for vector search.
- The packaged dataset in
src/main/resources/datasetsis large, roughly274 MB. - The sample records dataset used by this demo is also published here: sample-records.json.zip
- After downloading, extract it to
src/main/resources/datasets/sp500-fy2025-10k/sample-records.json - The app indexes the fixed workshop subset of 25 companies.
- Indexing time depends on whether the local transformer embedder is configured and ready.
- If vector or hybrid search fail, check your local embedding setup first.
Example:
unzip sample-records.json.zip -d src/main/resources/datasets/sp500-fy2025-10kYou can check status with:
curl -s http://localhost:8080/dataset/statusIf the app is already running and Redis is empty, restart the Spring app. You can also trigger the same load manually:
curl -s -X POST http://localhost:8080/dataset/initializeThe browser UI also has a Load Data button next to the dataset status. After data is indexed, the same button becomes Reload Data.
The UI follows this flow:
- Start the app so it indexes the workshop dataset when Redis is empty.
- Use the filters to narrow company, ticker, sector, year, and filing date.
- Use autocomplete for company names, tickers, and section names.
- Switch between full-text, vector, and hybrid search.
- Review the returned chunks and the live diagnostics.
Useful endpoints:
GET /dataset/statusPOST /dataset/initializeGET /filtersGET /autocompletePOST /search
If you want the workshop version of the narrative, start with:
- Part 1: Introduction
- Part 2: Understanding the Problem
- Part 3: The Solution
- Part 4: Testing the Demo
For presenter-safe query ideas, see:
For the checked-in vector configuration, see: