The Vector Database Landscape
|
This content was generated with the assistance of AI and should be verified against the official documentation of each tool and framework before being relied on in production. This section’s bibliography lists the reference material consulted while preparing these pages. |
Examples and version references on this page target LangChain / langchain-core / LangGraph 1.4 / 1.6 / 1.2,
LangChain4j 1.20.1, and Spring Boot 4.1 with Spring AI 2.0.1, alongside the engine versions used throughout this
section (pgvector 0.8.6, sqlite-vec 0.1.9, FAISS 1.15.1). "Vector database" has become a loose umbrella term for
a wide range of very different tools, from a single-file embedded library to a fully managed cloud service. This
page maps that landscape into five overlapping categories, compares their features side by side, and looks at
why a query written against one of them rarely runs unchanged against another. It stops short of scoring the
engines against each other or pricing them out — that evaluation lives on
Comparing Vector Databases.
Five categories, one underlying problem
Every tool below solves the same core problem — given a query vector, find the nearest stored vectors quickly — but each one bolted that capability onto a different starting point, and that starting point still shapes what it is good at.
Libraries
A library has no server, no network protocol and no notion of metadata or persistence beyond what the calling process wires up itself. It is a set of in-process ANN algorithms an application links against directly.
-
FAISS — the reference implementation for ANN research, covered in depth on FAISS. It gives every index family and GPU acceleration, at the cost of every other database feature: no filtering, no concurrency control, no replication.
SQL extensions
A SQL extension adds a vector type and a handful of operators to an existing relational engine, so vector search becomes one more thing SQL can do next to joins, transactions and the rest of the schema.
-
pgvector — a PostgreSQL extension; see PostgreSQL & pgvector.
-
sqlite-vec — an SQLite extension for embedded, single-file use; see Vector Search in SQLite.
-
Oracle AI Vector Search — a
VECTORtype built into the converged Oracle Database, with HNSW and IVF indexes queried through ordinary SQL joins. It is mentioned here for completeness rather than documented in depth on this site.
Purpose-built engines
A purpose-built engine is designed around the vector index as its primary access path, rather than adding one to something else. This is the category most people picture when they hear "vector database."
-
Qdrant — self-hostable, Rust-based; see Qdrant Reference.
-
Milvus — built for billion-scale distributed search, with a disaggregated storage/compute architecture and the widest index choice of any engine here (HNSW, IVF, DiskANN, GPU CAGRA).
-
Weaviate — ships built-in vectorizer and reranker modules so embedding can happen at ingest time, alongside BM25 + vector hybrid search.
-
Chroma — the simplest developer experience of the group, with an embedded/local mode as well as a hosted cloud.
-
LanceDB — embedded, storing vectors in the columnar Lance format directly on object storage.
-
Pinecone — the odd one out in this category: a fully managed serverless service with no self-hosted or local option at all. It is grouped here because its data model and query surface are purpose-built for vectors in the same way, even though "deployment model" for Pinecone is a single point, not a range.
Search engines
A search engine started as a lexical, inverted-index engine and added dense-vector kNN alongside it, so the same system that already scores BM25 relevance can also rank by vector similarity.
-
Elasticsearch — see Vector & semantic search.
-
OpenSearch — Elasticsearch’s Apache-2.0 fork with its own vector engine choices (
faiss,lucene,nmslib); it has no dedicated page in this site’s reference yet, but shares the retriever concepts covered on the Elasticsearch page. -
Apache Solr — see Dense vector search.
-
Apache Lucene — see kNN / HNSW vector search. Lucene is the odd one out here too: it is an embeddable Java library, not a server, and both Solr and Elasticsearch build their vector search on top of it.
Multi-model / NoSQL
A multi-model or NoSQL store added a vector index next to the data model it already had — documents, key-value pairs, or a property graph — so vectors live beside the operational data they describe instead of in a separate system.
-
Redis — see Vector Search: Query Engine & Vector Sets.
-
MongoDB — see Text, wildcard, geospatial & Atlas search.
-
Couchbase — see Full-Text & Vector Search, Analytics & Eventing.
-
Neo4j — see Vector Search and GenAI.
-
Cassandra — added vector search (
CQLVECTORtype, storage-attached indexing) in Cassandra 5.0; it has no dedicated page in this site’s reference yet.
These categories overlap deliberately rather than cleanly: Redis and MongoDB are both credible purpose-built targets for a pure vector workload; OpenSearch and Elasticsearch compete directly with Qdrant and Milvus on RAG pipelines; and pgvector’s whole appeal is that it lets a team stay inside a category (relational SQL) it was already in, rather than adopting a new one.
Feature comparison
The table below compares deployment model, index types, filtering, hybrid search, quantization, licence and framework support across every engine named above. It is a feature inventory, not a verdict — performance, pricing and cloud availability are compared on Comparing Vector Databases, which also carries the per-engine strengths and weaknesses. Framework support was checked against each framework’s own integration list: LangChain’s vector store integrations page, Spring AI’s vector store documentation, and LangChain4j’s embedding stores page.
| Engine | Category | Deployment | Index types | Filter | Hybrid | Quantization | LangChain | Spring AI | LangChain4j | Site page |
|---|---|---|---|---|---|---|---|---|---|---|
FAISS |
Library |
Embedded (in-process) |
Flat, IVF, HNSW, PQ, composite |
No (application-managed) |
No |
Scalar, product, binary |
Yes |
No |
No |
|
pgvector |
SQL extension |
Self-hosted or managed PostgreSQL |
HNSW, IVFFlat |
Yes (SQL |
Yes (SQL + full-text |
|
Yes |
Yes |
Yes |
|
sqlite-vec |
SQL extension |
Embedded (single file) |
Brute-force KNN |
Yes (metadata and partition-key columns; auxiliary columns are not filterable) |
Yes (via FTS5 join) |
|
Yes |
No |
No |
|
Oracle AI Vector Search |
SQL extension |
Self-hosted, OCI, or Oracle Database@AWS/Azure/Google Cloud |
HNSW, IVF |
Yes (SQL joins) |
Yes (SQL) |
Yes |
Yes |
Yes |
Yes |
— |
Qdrant |
Purpose-built engine |
Self-hosted, Qdrant Cloud, or BYOC |
HNSW (filterable) |
Yes (payload-aware, in-graph) |
Yes (sparse vectors + RRF) |
Scalar, product, binary |
Yes |
Yes |
Yes |
|
Milvus |
Purpose-built engine |
Self-hosted (standalone or distributed) or Zilliz Cloud |
HNSW, IVF, DiskANN, GPU CAGRA |
Yes |
Yes (dense + sparse multi-vector) |
Scalar, product, binary |
Yes |
Yes |
Yes |
— |
Weaviate |
Purpose-built engine |
Self-hosted, Weaviate Cloud, or BYOC |
HNSW, flat |
Yes |
Yes (BM25 + vector fusion) |
Product, binary |
Yes |
Yes |
Yes |
— |
Chroma |
Purpose-built engine |
Embedded/local or Chroma Cloud |
HNSW |
Yes |
No (vector-first; metadata filters only) |
No |
Yes |
Yes |
Yes |
— |
LanceDB |
Purpose-built engine |
Embedded (Lance format on object storage) or Enterprise |
IVF-PQ, HNSW |
Yes |
Yes (full-text + vector) |
Product |
Yes |
No |
No |
— |
Pinecone |
Purpose-built engine (managed only) |
Fully managed serverless |
HNSW-family (proprietary) |
Yes (namespaces + metadata filters) |
Yes (dense + sparse) |
No (storage/compute separation instead) |
Yes |
Yes |
Yes |
— |
Elasticsearch |
Search engine |
Self-hosted, Elastic Cloud Hosted, or Serverless |
HNSW ( |
Yes (filtered kNN) |
Yes (retrievers: |
int8, int4, BBQ |
Yes |
Yes |
Yes |
|
OpenSearch |
Search engine |
Self-hosted, Amazon OpenSearch Service/Serverless |
HNSW ( |
Yes |
Yes (hybrid query, neural search) |
Scalar (via |
Yes |
Yes |
Yes |
— |
Apache Solr |
Search engine |
Self-hosted (SolrCloud) or third-party managed |
HNSW (Lucene-backed) |
Yes (pre-filter and post-filter) |
Yes (lexical + vector) |
No |
No |
No |
No |
|
Apache Lucene |
Search engine (library) |
Embedded (Java library) |
HNSW, quantised codecs |
Yes (pre-filtering) |
Yes (application-composed) |
Scalar, binary |
No |
No |
No |
|
Redis |
Multi-model / NoSQL |
Self-hosted, Redis Cloud, or cloud-native (ElastiCache, MemoryDB, Azure Managed Redis, Memorystore) |
FLAT, HNSW, SVS-VAMANA |
Yes (pre-filtered KNN) |
Yes ( |
|
Yes |
Yes |
Yes |
|
MongoDB |
Multi-model / NoSQL |
Self-managed or Atlas |
HNSW ( |
Yes (pre-filters in the aggregation pipeline) |
Yes ( |
Scalar, binary |
Yes |
Yes |
Yes |
|
Couchbase |
Multi-model / NoSQL |
Self-managed or Capella |
Hyperscale Vector Index (Vamana/DiskANN-inspired), Composite Vector Index, Search-service HNSW |
Yes |
Yes (Search service) |
Scalar |
Yes |
Yes |
Yes |
|
Neo4j |
Multi-model / NoSQL |
Self-managed or AuraDB |
HNSW (Lucene-backed) |
Yes (Cypher predicates) |
Yes (vector + full-text, application-composed) |
No |
Yes |
Yes |
Yes |
|
Cassandra |
Multi-model / NoSQL |
Self-managed or Astra DB |
Storage-attached indexing (SAI) over HNSW |
Yes (CQL predicates) |
Yes (application-composed) |
No |
Yes (via Astra DB) |
Yes |
Yes |
— |
Licences follow the same pattern as everywhere else in this section: FAISS, sqlite-vec, Qdrant, Milvus, Chroma, LanceDB, OpenSearch, Solr, Lucene and Cassandra are permissively licensed (MIT or Apache 2.0); Weaviate is BSD-3-Clause; pgvector uses the PostgreSQL licence; Pinecone and Oracle AI Vector Search are proprietary; Elasticsearch, Redis and MongoDB use source-available or dual/triple licences (ELv2/SSPL/AGPLv3, AGPLv3/RSALv2/ SSPLv1, and SSPL respectively); and Neo4j’s Community edition is GPLv3 with a commercial Enterprise tier. The full per-engine breakdown, with dates and links, is on Comparing Vector Databases.
The portability problem
Every row in the table above speaks a different query language for what is conceptually the same operation:
find the k vectors nearest a query vector, optionally filtered, optionally blended with a lexical score. A
SIMILARITY SEARCH written for one engine has to be rewritten by hand for another — there is no SQL-92-style
standard that a vector query compiles against the way relational SQL does.
This gap has been a recurring topic of community and industry discussion for several years, under names such as "Vector Query Language" or "VQL" — a proposed, illustrative idea for what a portable vector query surface could look like, not a ratified standard with a single official specification. No engine implements the sketch below as written; it exists to make the portability problem concrete, not to describe a product.
A conceptual VQL-style data model treats a collection as a named set of records, each with a vector plus arbitrary scalar attributes — deliberately close to what every purpose-built engine and SQL extension above already exposes, just without a shared syntax for expressing it. A similarity search reads, in illustrative pseudo-syntax:
SIMILARITY SEARCH TOP 10
FROM docsassistant_chunks
USING VECTOR {0.012, -0.087, 0.045, ...}
USING METRIC COSINE
Filtered and thresholded search compose the same clause with an ordinary predicate and a distance cutoff, mirroring
what pgvector expresses in a WHERE clause and Qdrant expresses as a payload filter:
SIMILARITY SEARCH TOP 10
FROM docsassistant_chunks
USING VECTOR {...}
USING METRIC COSINE
WHERE component = 'vector-rag'
MINIMUM SIMILARITY 0.75
A HYBRID SEARCH clause would fold lexical and vector scoring into one statement with explicit weights. Today
that fusion is spelled differently everywhere: some engines build it in, each with its own syntax (Qdrant’s RRF
fusion query, Elasticsearch’s rrf retriever, Redis’s FT.HYBRID, MongoDB’s $rankFusion), while the rest — pgvector, sqlite-vec, Lucene and Neo4j among them — leave the two queries and their fusion to the application:
HYBRID SEARCH TOP 10
FROM docsassistant_chunks
MATCHING TEXT 'how does ef_search affect recall' WEIGHT 0.3
USING VECTOR {...} WEIGHT 0.7
RANGE SEARCH would return every vector within a radius rather than a fixed count — the same shape as
FAISS’s range_search, pgvector’s <→ used in a WHERE clause, and Redis’s VECTOR_RANGE:
RANGE SEARCH
FROM docsassistant_chunks
USING VECTOR {...}
USING METRIC COSINE
WITHIN 0.35
Batch search (many query vectors in one call, as FAISS’s search already does for a whole matrix at once) and
vector-valued functions and aggregations round out the sketch: an AVG over a group of vectors would return
their centroid, and a GEOMETRIC_MEDIAN aggregate would return the vector minimizing total distance to the
group — a robustness improvement over the centroid when a group contains outliers — illustrative of the kind of
vector-native aggregation a query language could offer, analogous to AVG/MEDIAN over scalar columns today.
What actually solves this today
In practice, two different layers absorb the portability problem instead of a query language doing it:
-
Framework abstractions. LangChain’s
VectorStoreinterface and LangChain4j’sEmbeddingStoreinterface, and Spring AI’sVectorStoreinterface, give application code oneadd/similaritySearch/delete-shaped surface that each concrete implementation (pgvector, Qdrant, Redis, …) maps onto its own native query language behind the scenes. Swapping the backing engine is a constructor or configuration change, not a rewrite of retrieval code — see In LangChain and Spring AI below. -
SQL extensions. pgvector, sqlite-vec and Oracle AI Vector Search sidestep the problem differently: instead of inventing a new vector query language, they add a type and a few operators to SQL, which is itself already a portable, standardized language for everything except the vector-specific parts (
<→/<⇒,MATCH … AND k = ?, and their Oracle equivalents still differ syntactically per engine).
Neither layer is a complete answer: a framework abstraction hides simple CRUD and search calls uniformly, but advanced features — filter-expression syntax, quantization settings, hybrid-fusion weights, index-tuning parameters — still leak the underlying engine’s own vocabulary through the abstraction, which is exactly the "switching cost" Comparing Vector Databases discusses.
In LangChain and Spring AI
LangChain
LangChain’s VectorStore base class gives every concrete store (FAISS, PGVector, QdrantVectorStore,
RedisVectorStore, and the rest) the same construction, add_documents/similarity_search, and as_retriever()
surface. Choosing an engine from this landscape becomes a choice of which VectorStore subclass to instantiate,
not a change to the surrounding chain or agent code:
from langchain_core.vectorstores import VectorStore
from langchain_ollama import OllamaEmbeddings
from langchain_postgres import PGVector
from langchain_qdrant import QdrantVectorStore
embeddings = OllamaEmbeddings(model="nomic-embed-text")
def docsassistant_store(engine: str) -> VectorStore:
# The only engine-specific code: which VectorStore subclass to build, and how to reach it.
if engine == "pgvector":
return PGVector(
embeddings=embeddings,
collection_name="docsassistant",
connection="postgresql+psycopg://docs:docs@localhost:5432/docsassistant",
)
return QdrantVectorStore.from_existing_collection(
embedding=embeddings, collection_name="docsassistant_chunks", url="http://localhost:6333"
)
# Everything below is identical whichever engine backs the store.
retriever = docsassistant_store("pgvector").as_retriever(search_kwargs={"k": 5})
docs = retriever.invoke("what does ef_search control?")
See LangChain — vector store integrations for
every supported engine, and
Vector stores for the
construction and retrieval patterns on this site. LangChain4j’s EmbeddingStore interface
(LangChain4j) is the equivalent on the
JVM.
Spring AI
Spring AI’s VectorStore interface plays the same role for Spring Boot applications: PgVectorStore,
QdrantVectorStore, RedisVectorStore, ElasticsearchVectorStore and the other implementations listed in the
feature table above all implement the same add/delete/similaritySearch(SearchRequest) contract,
auto-configured from the starter on the classpath and its spring.ai.vectorstore.* properties:
@Service
public class DocsAssistantRetriever {
// Whichever starter is on the classpath (pgvector, Qdrant, Redis, Elasticsearch, ...) supplies this bean.
private final VectorStore vectorStore;
public DocsAssistantRetriever(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
public List<Document> retrieve(String question) {
return this.vectorStore.similaritySearch(SearchRequest.builder()
.query(question)
.topK(5)
.filterExpression("component == 'vector-rag'")
.build());
}
}
See Spring AI — Vector databases for the
VectorStore API and the list of supported stores, and
VectorStore API for the
construction pattern and SearchRequest.builder() usage against the DocsAssistant schema.
Related pages
-
What Is a Vector Database? — the hybrid architecture (vector, metadata, integration layer) every engine on this page implements in its own way.
-
ANN Indexes: Flat, IVF, HNSW and Beyond — the Flat/IVF/HNSW index theory referenced throughout the feature table.
-
Quantization & Compression — the scalar/product/binary quantization column.
-
Comparing Vector Databases — the evaluation this page defers: performance, cloud availability, pricing and per-engine strengths/weaknesses.
-
Choosing the Right Database — when to reach for a vector-capable store at all, versus a PostgreSQL extension on a database you already run.
References
-
pgvector on GitHub — licence and supported operators.
-
sqlite-vec on GitHub — licence and supported types.
-
FAISS on GitHub — licence (MIT) and index catalogue.