Vector Search plugin
Vector Search plugin
Query Databricks Vector Search indexes with hybrid search, reranking, and cursor pagination from your AppKit application.
Key features:
- Named index aliases for multiple Vector Search indexes
- Hybrid, ANN, and full-text query modes
- Optional reranking with column-level control
- Cursor-based pagination for large result sets
- Service principal (default) and on-behalf-of-user auth
- Self-managed embedding indexes via custom
embeddingFn
Basic usage
import { createApp, vectorSearch, server } from "@databricks/appkit";
await createApp({
plugins: [
server(),
vectorSearch({
indexes: {
products: {
indexName: "catalog.schema.products_idx",
columns: ["id", "name", "description"],
queryType: "hybrid",
numResults: 20,
},
},
}),
],
});
Configuration options
Index aliases
Index aliases let you reference multiple Vector Search indexes by name. The alias is used in API routes and programmatic calls:
vectorSearch({
indexes: {
products: {
indexName: "catalog.schema.products_idx",
columns: ["id", "name", "description"],
},
docs: {
indexName: "catalog.schema.docs_idx",
columns: ["id", "title", "content", "url"],
queryType: "full_text",
},
},
});
IndexConfig
Query types
hybrid— Combines vector similarity and keyword search. Best for general-purpose retrieval.ann— Approximate nearest neighbor search using embeddings only. Best for semantic similarity.full_text— Keyword-based search with no embedding required.
Reranking
Reranking improves result relevance by running a second-stage model over the initial candidates:
vectorSearch({
indexes: {
products: {
indexName: "catalog.schema.products_idx",
columns: ["id", "name", "description", "category"],
reranker: { columnsToRerank: ["name", "description"] },
},
},
});
Pass reranker: true to rerank across all returned columns.
On-behalf-of-user auth
By default, queries run as the app's service principal. Set auth: "on-behalf-of-user" to execute queries as the signed-in user instead:
vectorSearch({
indexes: {
documents: {
indexName: "catalog.schema.documents_idx",
columns: ["id", "title", "body"],
auth: "on-behalf-of-user",
},
},
});
Pagination
Enable cursor pagination to page through large result sets:
vectorSearch({
indexes: {
products: {
indexName: "catalog.schema.products_idx",
columns: ["id", "name", "description"],
pagination: true,
endpointName: "my-vector-search-endpoint",
},
},
});
endpointName is required when pagination is true. Use the /:alias/next-page route to fetch subsequent pages.
Self-managed embedding indexes
For indexes that manage their own embeddings, provide an embeddingFn that takes a query string and returns a vector:
import { embed } from "./my-embedding-client";
vectorSearch({
indexes: {
products: {
indexName: "catalog.schema.products_idx",
columns: ["id", "name", "description"],
queryType: "ann",
embeddingFn: (text) => embed(text),
},
},
});
HTTP routes
Routes are mounted at /api/vector-search.
Query an index
POST /api/vector-search/:alias/query
Content-Type: application/json
{
"queryText": "machine learning guide",
"numResults": 10
}
Response:
{
"results": [
{ "id": "42", "name": "Intro to ML", "description": "..." }
],
"nextPageToken": "eyJvZmZzZXQiOjEwfQ=="
}
nextPageToken is only present when pagination is enabled and more results are available.
Fetch the next page
POST /api/vector-search/:alias/next-page
Content-Type: application/json
{
"queryText": "machine learning guide",
"pageToken": "eyJvZmZzZXQiOjEwfQ=="
}
Get index config
GET /api/vector-search/:alias/config
Returns the resolved IndexConfig for the alias (excluding embeddingFn).
Programmatic access
The plugin exposes a query method for server-side use:
const AppKit = await createApp({
plugins: [
server(),
vectorSearch({
indexes: {
products: {
indexName: "catalog.schema.products_idx",
columns: ["id", "name", "description"],
},
},
}),
],
});
const result = await AppKit.vectorSearch.query("products", {
queryText: "machine learning guide",
});
console.log(result.results);
Pass optional overrides as a second argument to query to adjust numResults or other per-call settings.