Class: SearchIndex
Defined in: indexes/search-index.ts:138
SearchIndex class for managing Redis vector search indices.
This class provides methods to create, manage, and query Redis search indices. Users create their own Redis client and pass it to the constructor.
Example
import { createClient } from 'redis';
import { SearchIndex, IndexSchema, StorageType } from 'redis-vl';
const client = createClient();
await client.connect();
const schema = new IndexSchema({
index: { name: 'my-index', prefix: 'doc', storageType: StorageType.HASH }
});
schema.addField({ name: 'title', type: 'text' });
const searchIndex = new SearchIndex(schema, client);
await searchIndex.create();
Accessors
name
Get Signature
get name():
string
Defined in: indexes/search-index.ts:240
Get the index name from the schema.
Returns
string
Constructors
Constructor
new SearchIndex(
schema,client,validateOnLoad?):SearchIndex
Defined in: indexes/search-index.ts:169
Create a new SearchIndex instance.
Parameters
schema
The index schema
client
any
Redis client instance (created by user)
validateOnLoad?
boolean = false
Whether to validate documents on load (default: false)
Returns
SearchIndex
Throws
If schema is not a valid IndexSchema instance
Throws
If client is not provided
Methods
aggregate()
aggregate(
query):Promise<{results:Record<string,string|string[]>[];total:number; }>
Defined in: indexes/search-index.ts:760
Execute an AggregationQuery (FT.AGGREGATE) against this index.
Returns the raw aggregate result: a total row count and a list of
rows, where each row is a Record<string, string | string[]> of field
name to value. GROUPBY/REDUCE/APPLY aliases appear as keys on each row.
Scalar reducers (COUNT, SUM, AVG, …) yield strings — numeric
casting is the caller's job. List reducers (TOLIST) yield
string[], preserving the array structure Redis returns on the wire.
Parameters
query
AggregationQuery
Returns
Promise<{ results: Record<string, string | string[]>[]; total: number; }>
Example
import { AggregationQuery, Reducers } from 'redis-vl';
const q = new AggregationQuery('@category:{electronics}')
.groupBy('@brand', Reducers.sum('price', 'revenue'))
.sortBy([{ field: 'revenue', direction: 'DESC' }])
.limit(0, 5);
const { total, results } = await index.aggregate(q);
for (const row of results) console.log(row.brand, row.revenue);
create()
create(
options?):Promise<any>
Defined in: indexes/search-index.ts:307
Create the index in Redis.
Parameters
options?
CreateIndexOptions = {}
Creation options
Returns
Promise<any>
The result from Redis FT.CREATE command
Throws
If no fields are defined for the index
delete()
delete(
options?):Promise<any>
Defined in: indexes/search-index.ts:357
Delete the index from Redis.
Parameters
options?
DeleteIndexOptions = {}
Deletion options
Returns
Promise<any>
The result from Redis FT.DROPINDEX command
exists()
exists():
Promise<boolean>
Defined in: indexes/search-index.ts:340
Check if the index exists in Redis.
Returns
Promise<boolean>
True if the index exists, false otherwise
fetch()
fetch(
key):Promise<Record<string,unknown> |null>
Defined in: indexes/search-index.ts:460
Fetch a single document by key.
Parameters
key
string
The document key (without prefix)
Returns
Promise<Record<string, unknown> | null>
The document or null if not found
Example
const doc = await index.fetch('123');
***
### fetchMany()
> **fetchMany**(`keys`, `batchSize?`): `Promise`\<(`Record`\<`string`, `unknown`\> \| `null`)[]\>
Defined in: [indexes/search-index.ts:501](https://github.com/redis-developer/redis-vl-typescript/blob/626accc9fac7b35893e035d2f022e625ff263926/src/indexes/search-index.ts#L501)
Fetch multiple documents by keys.
Uses pipelining for efficient batch retrieval.
#### Parameters
##### keys
`string`[]
Array of document keys (without prefix)
##### batchSize?
`number` = `200`
Number of commands per pipeline batch (default: 200)
#### Returns
`Promise`\<(`Record`\<`string`, `unknown`\> \| `null`)[]\>
Array of documents (null for missing keys)
#### Example
```typescript
const docs = await index.fetchMany(['123', '456', '789']);
***
### hybridSearch()
> **hybridSearch**\<`T`\>(`query`): `Promise`\<`HybridSearchResult`\<`T`\>\>
Defined in: [indexes/search-index.ts:696](https://github.com/redis-developer/redis-vl-typescript/blob/626accc9fac7b35893e035d2f022e625ff263926/src/indexes/search-index.ts#L696)
**`Experimental`**
Execute a hybrid (text + vector) search via Redis' built-in `FT.HYBRID`
command. Score fusion happens server-side — no client-side fusion.
Requires Redis Open Source 8.4.0+ on the server (FT.HYBRID was
introduced in that release).
Built on `client.ft.hybrid()` which `@redis/search` flags
experimental. The reply shape may shift between minor releases.
#### Type Parameters
##### T
`T` = `Record`\<`string`, `unknown`\>
#### Parameters
##### query
`HybridQuery`
#### Returns
`Promise`\<`HybridSearchResult`\<`T`\>\>
#### Example
```typescript
import { HybridQuery } from 'redis-vl';
const q = new HybridQuery({
text: 'machine learning',
textFieldName: 'description',
vector: embedding,
vectorField: 'embedding',
combine: { type: 'RRF' },
vsimFilter: '@brand:{nike}',
});
const { total, documents, executionTime } = await index.hybridSearch(q);
info()
info():
Promise<any>
Defined in: indexes/search-index.ts:374
Get information about the index.
Returns
Promise<any>
Index information from Redis
load()
load(
data,options?):Promise<string[]>
Defined in: indexes/search-index.ts:431
Load documents into the index.
This method handles:
- Auto-generating keys using ULID if no idField or keys provided
- Extracting IDs from documents using idField
- Using explicit keys if provided
- Preprocessing documents before storage
- Setting TTL on documents
- Supporting both HASH and JSON storage types
- Batching operations using Redis pipelining for performance
- Optional schema validation
Parameters
data
Record<string, unknown>[]
Array of documents to load
options?
LoadOptions = {}
Load options
Returns
Promise<string[]>
Array of keys that were loaded
Throws
If keys length doesn't match data length
Throws
If idField is not found in a document
Throws
If validation fails when validateOnLoad is enabled
Throws
If there's an error loading data to Redis
Example
// Auto-generate keys
const keys = await index.load([
{ title: 'Doc 1', score: 100 },
{ title: 'Doc 2', score: 200 }
]);
// Use idField
const keys = await index.load(
[{ id: 'user1', name: 'John' }],
{ idField: 'id' }
);
// Use explicit keys
const keys = await index.load(
[{ name: 'John' }],
{ keys: ['user:1'] }
);
// With preprocessing, TTL, and validation
const keys = await index.load(
[{ name: 'John' }],
{
ttl: 3600,
batchSize: 100,
validateOnLoad: true,
preprocess: (doc) => ({ ...doc, timestamp: Date.now() })
}
);
search()
search<
T>(query,options?):Promise<SearchResult<T>>
Defined in: indexes/search-index.ts:571
Execute a search query against the index
Type Parameters
T
T = Record<string, unknown>
Parameters
query
BaseQuery
Query object (VectorQuery, FilterQuery, etc.)
options?
QueryOptions
Optional query execution options
Returns
Promise<SearchResult<T>>
Search results with documents and scores
Examples
import { VectorQuery } from 'redis-vl';
// Vector similarity search
const query = new VectorQuery({
vector: embedding,
vectorField: 'embedding',
topK: 10,
returnFields: ['title', 'content']
});
const results = await index.search(query);
console.log(`Found ${results.total} results`);
results.documents.forEach((doc) => {
console.log(`${doc.value.title} (score: ${doc.score})`);
});
// Vector search with metadata filtering
const query = new VectorQuery({
vector: embedding,
vectorField: 'embedding',
filter: '@category:{electronics}',
topK: 5
});
const results = await index.search(query);
fromExisting()
staticfromExisting(name,client,validateOnLoad?):Promise<SearchIndex>
Defined in: indexes/search-index.ts:212
Load an existing index from Redis by name.
This method fetches the index metadata using FT.INFO and reconstructs the IndexSchema from the stored information.
Parameters
name
string
Name of the existing index in Redis
client
any
Redis client instance
validateOnLoad?
boolean = false
Whether to validate documents on load (default: false)
Returns
Promise<SearchIndex>
SearchIndex instance with reconstructed schema
Throws
If index doesn't exist or cannot be loaded
Example
// Load an existing index
const index = await SearchIndex.fromExisting('my-index', client);
// Use the loaded index
const docs = await index.fetchMany(['key1', 'key2']);
Properties
schema
readonlyschema:IndexSchema
Defined in: indexes/search-index.ts:142
The index schema defining the structure and fields.