Skip to main content

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

OptionTypeDefaultDescription
indexesRecord<string, IndexConfig>Required. Map of alias names to index configurations
timeoutnumber30000Query timeout in ms

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

FieldTypeDefaultDescription
indexNamestringRequired. Three-level Unity Catalog name (catalog.schema.index)
columnsstring[]Required. Columns to return in query results
queryType"ann" | "hybrid" | "full_text""hybrid"Search mode
numResultsnumber20Maximum results per query
rerankerboolean | { columnsToRerank: string[] }Enable reranking. Pass true to rerank all result columns, or specify a subset
auth"service-principal" | "on-behalf-of-user""service-principal"Authentication mode for query execution
paginationbooleanEnable cursor-based pagination
endpointNamestringVector Search endpoint name. Required when pagination is true
embeddingFn(text: string) => Promise<number[]>Custom embedding function for self-managed embedding indexes

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.

MethodPathDescription
POST/:alias/queryQuery an index by alias
POST/:alias/next-pageFetch the next page of results (requires pagination: true)
GET/:alias/configReturn the resolved config for an index alias

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.