Skip to main content
This example walks through a complete Geneva workflow on LanceDB Enterprise: creating a raw table, adding computed columns with a distributed backfill, and materializing a view with embeddings for downstream search. The dataset is a product catalog with titles and descriptions. We’ll compute a word_count feature column, then create a materialized view that adds text embeddings.

0. What you need to run this

All you need is an existing LanceDB Enterprise deployment. Distributed job execution, clusters, and dependency manifests are managed for you — there is no Kubernetes or cluster setup in this example.

1. Connect and create a table

2. Define UDFs

3. Register columns and run a backfill

Register the UDFs as virtual columns and trigger a backfill. The job runs on your deployment’s default distributed execution environment — no cluster or context to configure.

4. Create a materialized view with embeddings

The embedding model needs extra Python dependencies (sentence-transformers, torch). Rather than configuring a deployment-wide environment, we bundle those dependencies with the UDF using @udf(manifest=...). The manifest is snapshotted onto the view, so refreshes use it automatically. The materialized view selects a subset of columns from the source table — here we drop price and price_tier, keeping only what’s needed for search — plus a derived embedding column.

5. Query the enriched table

6. Incremental refresh

As new products are added to the source table, backfill the new rows and refresh the view to compute embeddings for them — only the new rows are processed:
To keep source columns in sync automatically, mark their UDFs with @udf(auto_backfill=True). See Backfilling.