From 7f618bc2ef2a662f3fe5b56e29147c3687f3f65e Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Thu, 4 Jun 2026 16:17:15 +0200 Subject: [PATCH 1/9] adding logos + draft new doc stores page --- .../choosing-a-document-store.mdx | 193 ++++++++++++------ .../static/img/document-stores-overview.svg | 87 ++++++++ .../img/logos/document-stores/alloydb.svg | 1 + .../img/logos/document-stores/couchbase.svg | 1 + .../logos/document-stores/elasticsearch.svg | 1 + .../img/logos/document-stores/faiss.svg | 1 + .../img/logos/document-stores/milvus.svg | 1 + .../img/logos/document-stores/mongodb.svg | 1 + .../img/logos/document-stores/neo4j.svg | 1 + .../img/logos/document-stores/opensearch.svg | 1 + .../img/logos/document-stores/postgresql.svg | 1 + .../img/logos/document-stores/qdrant.svg | 1 + .../img/logos/document-stores/redis.svg | 1 + .../img/logos/document-stores/singlestore.svg | 1 + .../img/logos/document-stores/supabase.svg | 1 + .../img/logos/document-stores/valkey.svg | 1 + .../img/logos/document-stores/vespa.svg | 1 + 17 files changed, 234 insertions(+), 61 deletions(-) create mode 100644 docs-website/static/img/document-stores-overview.svg create mode 100644 docs-website/static/img/logos/document-stores/alloydb.svg create mode 100644 docs-website/static/img/logos/document-stores/couchbase.svg create mode 100644 docs-website/static/img/logos/document-stores/elasticsearch.svg create mode 100644 docs-website/static/img/logos/document-stores/faiss.svg create mode 100644 docs-website/static/img/logos/document-stores/milvus.svg create mode 100644 docs-website/static/img/logos/document-stores/mongodb.svg create mode 100644 docs-website/static/img/logos/document-stores/neo4j.svg create mode 100644 docs-website/static/img/logos/document-stores/opensearch.svg create mode 100644 docs-website/static/img/logos/document-stores/postgresql.svg create mode 100644 docs-website/static/img/logos/document-stores/qdrant.svg create mode 100644 docs-website/static/img/logos/document-stores/redis.svg create mode 100644 docs-website/static/img/logos/document-stores/singlestore.svg create mode 100644 docs-website/static/img/logos/document-stores/supabase.svg create mode 100644 docs-website/static/img/logos/document-stores/valkey.svg create mode 100644 docs-website/static/img/logos/document-stores/vespa.svg diff --git a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx index c0c544dae2..d01359e120 100644 --- a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx +++ b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx @@ -11,101 +11,172 @@ import ClickableImage from "@site/src/components/ClickableImage"; This article goes through different types of Document Stores and explains their advantages and disadvantages. -### Introduction +## Introduction -Whether you are developing a chatbot, a RAG system, or an image captioner, at some point, it’ll be likely for your AI application to compare the input it gets with the information it already knows. Most of the time, this comparison is performed through vector similarity search. +Whether you are developing a chatbot, a RAG system, or an image captioner, at some point, it's likely for your AI application to compare the input it gets with the information it already knows. Most of the time, this comparison is performed through vector similarity search. -If you’re unfamiliar with vectors, think about them as a way to represent text, images, or audio/video in a numerical form called vector embeddings. Vector databases are specifically designed to store such vectors efficiently, providing all the functionalities an AI application needs to implement data retrieval and similarity search. +If you're unfamiliar with vectors, think about them as a way to represent text, images, or audio/video in a numerical form called vector embeddings. Vector databases are specifically designed to store such vectors efficiently, providing all the functionalities an AI application needs to implement data retrieval and similarity search. Document Stores are special objects in Haystack that abstract all the different vector databases into a common interface that can be easily integrated into a pipeline, most commonly through a Retriever component. Normally, you will find specialized Document Store and Retriever objects for each vector database Haystack supports. -### Types of vector databases + + +## DocumentStore Integrations Available in Haystack + +#### Core integrations + +| Integration | Class | Category | Engine Type | Open Source | Async Support | Retrievers | +| --- | --- | --- | --- | --- | --- | --- | +| ArcadeDB | `ArcadeDBDocumentStore` | Multi-model Database | Multi-model database (graph, document, key-value) with HNSW vector search via HTTP/JSON API | Yes | No | Embedding | +| AlloyDB | `AlloyDBDocumentStore` | Relational Database | Managed PostgreSQL-compatible database (Google Cloud) with pgvector extension | No | Yes | Embedding, Keyword | +| Astra | `AstraDocumentStore` | Document / NoSQL Database | Cloud-native managed NoSQL (Apache Cassandra-based) with vector search via DataStax JSON API | No | No | Embedding | +| Azure AI Search | `AzureAISearchDocumentStore` | Search Engine | Managed cloud search service (Microsoft Azure AI Search) with HNSW vector search | No | No | BM25, Embedding, Hybrid | +| Chroma | `ChromaDocumentStore` | Vector Database | Purpose-built vector database | Yes | Yes | Embedding | +| Elasticsearch | `ElasticsearchDocumentStore` | Search Engine | Distributed search & analytics engine with BM25 + vector (kNN) search | Partial | Yes | BM25, Embedding, SQL | +| FAISS | `FAISSDocumentStore` | Vector Index Library | In-memory vector similarity search library (Meta/Facebook) with JSON file for metadata | Yes | No | Embedding | +| FalkorDB | `FalkorDBDocumentStore` | Graph Database | OpenCypher graph database with ANN vector search | Yes (SSPL) | No | Embedding, Cypher | +| MongoDB Atlas | `MongoDBAtlasDocumentStore` | Document / NoSQL Database | Cloud document database with Atlas Vector Search and full-text search | No | Yes | Embedding, Full-text | +| Oracle | `OracleDocumentStore` | Relational Database | Oracle with native AI Vector Search, HNSW vector index and DBMS_SEARCH full-text keyword index | No | Yes | Embedding, Keyword | +| OpenSearch | `OpenSearchDocumentStore` | Search Engine | Distributed search engine (AWS fork of Elasticsearch) with BM25 + kNN vector search | Yes | Yes | BM25, Embedding, Hybrid, Metadata, SQL | +| PGVector | `PgvectorDocumentStore` | Relational Database | Relational database (PostgreSQL) with the `pgvector` extension for vector similarity search | Yes | Yes | Embedding, Keyword | +| Pinecone | `PineconeDocumentStore` | Vector Database | Managed cloud vector database | No | Yes | Embedding | +| Qdrant | `QdrantDocumentStore` | Vector Database | Purpose-built vector database with dense + sparse embedding support | Yes | Yes | Embedding, Sparse Embedding, Hybrid | +| Supabase | `SupabasePgvectorDocumentStore` | Relational Database | Managed cloud Supabase — a wrapper over PgvectorDocumentStore with Supabase-specific defaults | Yes | Yes | Embedding, Keyword | +| Valkey | `ValkeyDocumentStore` | In-memory Key-Value Store | In-memory key-value store (Redis fork) with HNSW vector search via `glide` client | Yes | Yes | Embedding | +| Vespa | `VespaDocumentStore` | Search Engine | Distributed search & serving engine with BM25 lexical + HNSW vector (ANN) search | Yes | No | BM25, Embedding | +| Weaviate | `WeaviateDocumentStore` | Vector Database | Purpose-built vector database with hybrid search support | Yes | Yes | BM25, Embedding, Hybrid | + +#### External integrations + +| Integration | Class | Category | Engine Type | Open Source | Async Support | Retrievers | +| --- | --- | --- | --- | --- | --- | --- | +| Couchbase | `CouchbaseDocumentStore` | Document / NoSQL Database | Distributed NoSQL document database with vector search via Search Service | Partial | Yes | Embedding, Full-text | +| LanceDB | `LanceDBDocumentStore` | Vector Database | Embedded vector database built on the Lance columnar format, optimized for multimodal data | Yes | Yes | Embedding, Full-text, Hybrid | +| Milvus | `MilvusDocumentStore` | Vector Database | Open-source vector database built for scalable similarity search | Yes | No | Embedding | +| Needle | `NeedleDocumentStore` | Search Engine | Managed RAG-as-a-service platform with built-in document storage and vector search | No | Yes | Embedding, Sparse Embedding, Hybrid | +| Neo4j | `Neo4jDocumentStore` | Multi-model Database | Graph database with native vector index support for combined graph traversal and similarity search | Partial | No | Embedding | +| SingleStore | `SingleStoreDocumentStore` | Relational Database | Distributed SQL database with native vector search and full-text search support | No | Yes | Embedding, Full-text, Keyword | + +## Types of Document Stores + +- **Vector Databases** — purpose-built for embedding search and semantic retrieval +- **Search Engines** — full-text search engines extended with vector (kNN) capabilities +- **Relational Databases** — SQL databases with vector search via plugins or extensions +- **Document / NoSQL Databases** — flexible document stores with vector search added on top +- **In-memory Key-Value Stores** — ultra-low-latency stores with HNSW vector search +- **Vector Index Libraries** — lightweight in-process vector similarity search, no external service +- **Multi-model Databases** — single engine supporting graph, document, and vector data models + +## Vector Databases + +- Purpose-built for vector and embedding search +- Advanced indexing techniques for efficient similarity search +- Designed for high scalability and availability with large volumes of high-dimensional data +- Most support metadata filtering alongside vector search +- Increasingly adding hybrid (vector + keyword) search support +- Mostly open source, widely available as managed cloud services + +**Best for** semantic search over large document corpora — e.g. a knowledge base where users search by meaning rather than exact keywords. -But why are vector databases so different, and which one should you use in your Haystack pipeline? - -We can group vector databases into five categories, from more specialized to general purpose: - -- Vector libraries -- Pure vector databases -- Vector-capable SQL databases -- Vector-capable NoSQL databases -- Full-text search databases +- [Chroma](../../document-stores/chromadocumentstore.mdx) +- [Pinecone](../../document-stores/pinecone-document-store.mdx) +- [Qdrant](../../document-stores/qdrant-document-store.mdx) +- [Weaviate](../../document-stores/weaviatedocumentstore.mdx) +- LanceDB ([external integration](https://haystack.deepset.ai/integrations/lancedb-document-store)) +- Milvus ([external integration](https://haystack.deepset.ai/integrations/milvus-document-store)) -We are working on supporting all these types in Haystack. +## Search Engines -In the meantime, here’s the most recent overview of available integrations: - +- Originally built for full-text (BM25) search, with vector (kNN) capabilities added later +- Excellent support for text data, tokenisation, and language-aware querying +- Scale both horizontally and vertically in production environments +- Strong foundation for hybrid search combining keyword and semantic retrieval +- Battle-tested in enterprise environments with mature tooling and observability -#### Summary +**Best for** enterprise search or log analytics where both full-text (BM25) and vector search are needed — e.g. an e-commerce product search with filters. -Here is a quick summary of different Document Stores available in Haystack. +- Azure AI Search ([AzureAISearchDocumentStore](../../document-stores/azureaisearchdocumentstore.mdx)) +- [Elasticsearch](../../document-stores/elasticsearch-document-store.mdx) +- [OpenSearch](../../document-stores/opensearch-document-store.mdx) +- Needle ([external integration](https://haystack.deepset.ai/integrations/needle-document-store)) +- [Vespa](../../document-stores/vespadocumentstore.mdx) -Continue further down the article for a more complex explanation of the strengths and disadvantages of each type. +## Relational Databases -
+- Standard SQL databases extended with vector search via plugins or extensions +- Vectors live alongside relational data, enabling combined vector + SQL queries in a single store +- Lower operational overhead when PostgreSQL is already part of the stack +- Vector search performance is lower than purpose-built databases, but sufficient for many use cases +- Familiar tooling, transactions, and data integrity guarantees of a relational database -| | | -| --- | --- | -| Type | Best for | -| Vector libraries | Managing hardware resources effectively. | -| Pure vector DBs | Managing lots of high-dimensional data. | -| Vector-capable SQL DBs | Lower maintenance costs with focus on structured data and less on vectors. | -| Vector-capable NoSQL DBs | Combining vectors with structured data without the limitations of the traditional relational model. | -| Full-text search DBs | Superior full-text search, reliable for production. | -| In-memory | Fast, minimal prototypes on small datasets. | +**Best for** use cases where documents live alongside structured relational data — e.g. a product catalogue where vector search and SQL JOINs are both needed. -
+- [AlloyDB](../../document-stores/alloydbdocumentstore.mdx) +- Oracle ([OracleDocumentStore](../../document-stores/oracledocumentstore.mdx)) +- [PGVector](../../document-stores/pgvectordocumentstore.mdx) +- [Supabase](../../document-stores/supabasedocumentstore.mdx) +- SingleStore ([external integration](https://haystack.deepset.ai/integrations/singlestore-document-store)) -#### Vector libraries +## Document / NoSQL Databases -Vector libraries are often included in the “vector database” category improperly, as they are limited to handling only vectors, are designed to work in-memory, and normally don’t have a clean way to store data on disk. Still, they are the way to go every time performance and speed are the top requirements for your AI application, as these libraries can use hardware resources very effectively. +- General-purpose document stores with vector search added on top +- Flexible, schema-less data model suited for heterogeneous document collections +- Horizontal scaling and high availability inherited from the underlying NoSQL engine +- Good choice when the database is already in use and adding a separate vector store is undesirable +- Vector search performance may trail behind purpose-built databases -:::warning[In progress] +**Best for** applications already using MongoDB or Cassandra that want to add RAG capabilities without introducing a new infrastructure component. -We are currently developing the support for vector libraries in Haystack. -::: +- Astra ([AstraDocumentStore](../../document-stores/astradocumentstore.mdx)) +- [MongoDB Atlas](../../document-stores/mongodbatlasdocumentstore.mdx) +- Couchbase ([external integration](https://haystack.deepset.ai/integrations/couchbase-document-store)) -#### Pure vector databases +## In-memory Key-Value Stores -Pure vector databases, also known as just “vector databases”, offer efficient similarity search capabilities through advanced indexing techniques. Most of them support metadata, and despite a recent trend to add more text-search features on top of it, you should consider pure vector databases closer to vector libraries than a regular database. Pick a pure vector database when your application needs to manage huge amounts of high-dimensional data effectively: they are designed to be highly scalable and highly available. Most are open source, but companies usually provide them “as a service” through paid subscriptions. +- In-memory architecture delivers extremely low read/write latency +- Vector search (HNSW) layered on top of an existing caching infrastructure +- Ideal when the stack already includes Redis or Valkey as a cache or session store +- Data is ephemeral by default; persistence requires explicit configuration +- Less suited for large corpora where memory cost becomes significant -- [Chroma](../../document-stores/chromadocumentstore.mdx) -- [Pinecone](../../document-stores/pinecone-document-store.mdx) -- [Qdrant](../../document-stores/qdrant-document-store.mdx) -- [Weaviate](../../document-stores/weaviatedocumentstore.mdx) -- [Milvus](https://haystack.deepset.ai/integrations/milvus-document-store) (external integration) +**Best for** low-latency, real-time retrieval — e.g. a chatbot that needs sub-millisecond response times. -#### Vector-capable SQL databases +- [Valkey](../../document-stores/valkeydocumentstore.mdx) -This category is relatively small but growing fast and includes well-known relational databases where vector capabilities were added through plugins or extensions. They are not as performant as the previous categories, but the main advantage of these databases is the opportunity to easily combine vectors with structured data, having a one-stop data shop for your application. You should pick a vector-capable SQL database when the performance trade-off is paid off by the lower cost of maintaining a single database instance for your application or when the structured data plays a more fundamental role in your business logic, with vectors being more of a nice-to-have. +## Vector Index Libraries -- [Oracle](../../document-stores/oracledocumentstore.mdx) -- [Pgvector](../../document-stores/pgvectordocumentstore.mdx) -- [Supabase](../../document-stores/supabasedocumentstore.mdx) +- Low-level, in-process vector similarity search — not a full database +- No network overhead; runs entirely within the application process +- Very efficient use of hardware resources (CPU/GPU) +- Limited to vectors only; metadata must be managed separately (e.g. via a JSON file) +- No built-in persistence, replication, or multi-client access -#### Vector-capable NoSQL databases +**Best for** local prototyping, research, or small-scale applications where a lightweight in-process solution is preferred over running an external database server. -Historically, the killer features of NoSQL databases were the ability to scale horizontally and the adoption of a flexible data model to overcome certain limitations of the traditional relational model. This stays true for databases in this category, where the vector capabilities are added on top of the existing features. Similarly to the previous category, vector support might not be as good as pure vector databases, but once again, there is a tradeoff that might be convenient to bear depending on the use case. For example, if a certain NoSQL database is already part of the stack of your application and a lower performance is not a show-stopper, you might give it a shot. +- [FAISS](../../document-stores/faissdocumentstore.mdx) -- [Astra](../../document-stores/astradocumentstore.mdx) -- [MongoDB](../../document-stores/mongodbatlasdocumentstore.mdx) -- [Neo4j](https://haystack.deepset.ai/integrations/neo4j-document-store) (external) +## Multi-model Databases -#### Full-text search databases +- Single engine supporting multiple data models: graph, document, key-value, and vector +- Eliminates the need to maintain separate databases for different data representations +- Suited for knowledge graphs or applications with complex entity relationships +- Vector search (HNSW) available alongside graph traversal and document queries +- Smaller community and ecosystem compared to more established categories -The main advantage of full-text search databases is they are already designed to work with text, so you can expect a high level of support for text data along with good performance and the opportunity to scale both horizontally and vertically. Initially, vector capabilities were subpar and provided through plugins or extensions, but this is rapidly changing. You can see how the market leaders in this category have recently added first-class support for vectors. Pick a full-text search database if text data plays a central role in your business logic so that you can easily and effectively implement techniques like hybrid search with a good level of support for similarity search and state-of-the-art support for full-text search. +**Best for** applications requiring multiple data models in a single engine — e.g. a knowledge graph where entities are connected by relationships and also need vector similarity search. -- [Elasticsearch](../../document-stores/elasticsearch-document-store.mdx) -- [OpenSearch](../../document-stores/opensearch-document-store.mdx) +- [ArcadeDB](../../document-stores/arcadedbdocumentstore.mdx) +- [FalkorDB](../../document-stores/falkordbdocumentstore.mdx) +- Neo4j ([external integration](https://haystack.deepset.ai/integrations/neo4j-document-store)) -#### The in-memory Document Store +## The In-memory Document Store -Haystack ships with an ephemeral document store that relies on pure Python data structures stored in memory, so it doesn’t fall into any of the vector database categories above. This special Document Store is ideal for creating quick prototypes with small datasets. It doesn’t require any special setup, and it can be used right away without installing additional dependencies. +Haystack ships with an ephemeral document store that relies on pure Python data structures stored in memory, so it doesn't fall into any of the vector database categories above. This special Document Store is ideal for creating quick prototypes with small datasets. It doesn't require any special setup, and it can be used right away without installing additional dependencies. -- [InMemory](../../document-stores/inmemorydocumentstore.mdx) +- [InMemoryDocumentStore](../../document-stores/inmemorydocumentstore.mdx) -### Final considerations +## Final Considerations It can be very challenging to pick one vector database over another by only looking at pure performance, as even the slightest difference in the benchmark can produce a different leaderboard (for example, some benchmarks test the cloud services while others work on a reference machine). Thinking about including features like filtering or not can bring in a whole new set of complexities that make the comparison even harder. -What’s important for you to know is that the Document Store interface doesn’t add much to the costs, and the relative performance of one vector database over another should stay the same when used within Haystack pipelines. +What's important for you to know is that the Document Store interface doesn't add much to the costs, and the relative performance of one vector database over another should stay the same when used within Haystack pipelines. diff --git a/docs-website/static/img/document-stores-overview.svg b/docs-website/static/img/document-stores-overview.svg new file mode 100644 index 0000000000..d97f958b7c --- /dev/null +++ b/docs-website/static/img/document-stores-overview.svg @@ -0,0 +1,87 @@ + + + DocumentStore Integrations in Haystack + * External integrations (community-maintained) + + + +Vector Databases + +Chroma + +Pinecone + +Qdrant + +Weaviate + +LanceDB * + +Milvus * + + + +Search Engines + +Azure AI Search + +Elasticsearch + +OpenSearch + +Needle * + +Vespa + + + +Relational Databases + +AlloyDB + +Oracle + +PGVector + +Supabase + +SingleStore * + + + +Document / NoSQL + +Astra + +MongoDB Atlas + +Couchbase * + + + +In-memory Key-Value + +Valkey + + + +Vector Index Libraries + +FAISS + + + +Multi-model Databases + +ArcadeDB + +FalkorDB + +Neo4j * + + + +In-memory Document Store + +InMemoryDocumentStore (built-in) + diff --git a/docs-website/static/img/logos/document-stores/alloydb.svg b/docs-website/static/img/logos/document-stores/alloydb.svg new file mode 100644 index 0000000000..dd1188f1c4 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/alloydb.svg @@ -0,0 +1 @@ +Google Cloud diff --git a/docs-website/static/img/logos/document-stores/couchbase.svg b/docs-website/static/img/logos/document-stores/couchbase.svg new file mode 100644 index 0000000000..e66a38f154 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/couchbase.svg @@ -0,0 +1 @@ +Couchbase diff --git a/docs-website/static/img/logos/document-stores/elasticsearch.svg b/docs-website/static/img/logos/document-stores/elasticsearch.svg new file mode 100644 index 0000000000..d1b51bee06 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/elasticsearch.svg @@ -0,0 +1 @@ +Elasticsearch diff --git a/docs-website/static/img/logos/document-stores/faiss.svg b/docs-website/static/img/logos/document-stores/faiss.svg new file mode 100644 index 0000000000..37a2129bdf --- /dev/null +++ b/docs-website/static/img/logos/document-stores/faiss.svg @@ -0,0 +1 @@ +Meta diff --git a/docs-website/static/img/logos/document-stores/milvus.svg b/docs-website/static/img/logos/document-stores/milvus.svg new file mode 100644 index 0000000000..fa6368b356 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/milvus.svg @@ -0,0 +1 @@ +Milvus diff --git a/docs-website/static/img/logos/document-stores/mongodb.svg b/docs-website/static/img/logos/document-stores/mongodb.svg new file mode 100644 index 0000000000..5950fa0392 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/mongodb.svg @@ -0,0 +1 @@ +MongoDB diff --git a/docs-website/static/img/logos/document-stores/neo4j.svg b/docs-website/static/img/logos/document-stores/neo4j.svg new file mode 100644 index 0000000000..d7345416a8 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/neo4j.svg @@ -0,0 +1 @@ +Neo4j diff --git a/docs-website/static/img/logos/document-stores/opensearch.svg b/docs-website/static/img/logos/document-stores/opensearch.svg new file mode 100644 index 0000000000..cd77653110 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/opensearch.svg @@ -0,0 +1 @@ +OpenSearch diff --git a/docs-website/static/img/logos/document-stores/postgresql.svg b/docs-website/static/img/logos/document-stores/postgresql.svg new file mode 100644 index 0000000000..d7ccd9e3a6 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/postgresql.svg @@ -0,0 +1 @@ +PostgreSQL diff --git a/docs-website/static/img/logos/document-stores/qdrant.svg b/docs-website/static/img/logos/document-stores/qdrant.svg new file mode 100644 index 0000000000..726a78b9a7 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/qdrant.svg @@ -0,0 +1 @@ +Qdrant diff --git a/docs-website/static/img/logos/document-stores/redis.svg b/docs-website/static/img/logos/document-stores/redis.svg new file mode 100644 index 0000000000..4bcedd4242 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/redis.svg @@ -0,0 +1 @@ +Redis diff --git a/docs-website/static/img/logos/document-stores/singlestore.svg b/docs-website/static/img/logos/document-stores/singlestore.svg new file mode 100644 index 0000000000..b613fe292f --- /dev/null +++ b/docs-website/static/img/logos/document-stores/singlestore.svg @@ -0,0 +1 @@ +SingleStore diff --git a/docs-website/static/img/logos/document-stores/supabase.svg b/docs-website/static/img/logos/document-stores/supabase.svg new file mode 100644 index 0000000000..4957947fa2 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/supabase.svg @@ -0,0 +1 @@ +Supabase diff --git a/docs-website/static/img/logos/document-stores/valkey.svg b/docs-website/static/img/logos/document-stores/valkey.svg new file mode 100644 index 0000000000..4bcedd4242 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/valkey.svg @@ -0,0 +1 @@ +Redis diff --git a/docs-website/static/img/logos/document-stores/vespa.svg b/docs-website/static/img/logos/document-stores/vespa.svg new file mode 100644 index 0000000000..372065983d --- /dev/null +++ b/docs-website/static/img/logos/document-stores/vespa.svg @@ -0,0 +1 @@ +Vespa From 2124fc19551ffb084bdcec2bbbb51ca41a6a5ed1 Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Thu, 4 Jun 2026 16:41:27 +0200 Subject: [PATCH 2/9] removing columns from tables --- .../choosing-a-document-store.mdx | 66 +++++++++---------- docs-website/src/css/custom.css | 8 +++ 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx index d01359e120..df6c3d63bf 100644 --- a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx +++ b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx @@ -9,10 +9,6 @@ import ClickableImage from "@site/src/components/ClickableImage"; # Choosing a Document Store -This article goes through different types of Document Stores and explains their advantages and disadvantages. - -## Introduction - Whether you are developing a chatbot, a RAG system, or an image captioner, at some point, it's likely for your AI application to compare the input it gets with the information it already knows. Most of the time, this comparison is performed through vector similarity search. If you're unfamiliar with vectors, think about them as a way to represent text, images, or audio/video in a numerical form called vector embeddings. Vector databases are specifically designed to store such vectors efficiently, providing all the functionalities an AI application needs to implement data retrieval and similarity search. @@ -25,37 +21,37 @@ Document Stores are special objects in Haystack that abstract all the different #### Core integrations -| Integration | Class | Category | Engine Type | Open Source | Async Support | Retrievers | -| --- | --- | --- | --- | --- | --- | --- | +| Integration | Category | Engine Type | Open Source | Async Support | Retrievers | +| --- | --- | --- | --- | --- | --- | | ArcadeDB | `ArcadeDBDocumentStore` | Multi-model Database | Multi-model database (graph, document, key-value) with HNSW vector search via HTTP/JSON API | Yes | No | Embedding | -| AlloyDB | `AlloyDBDocumentStore` | Relational Database | Managed PostgreSQL-compatible database (Google Cloud) with pgvector extension | No | Yes | Embedding, Keyword | +| AlloyDB | `AlloyDBDocumentStore` | Relational Database | Managed PostgreSQL-compatible database (Google Cloud) with pgvector extension | No | Yes | Embedding, Keyword | | Astra | `AstraDocumentStore` | Document / NoSQL Database | Cloud-native managed NoSQL (Apache Cassandra-based) with vector search via DataStax JSON API | No | No | Embedding | | Azure AI Search | `AzureAISearchDocumentStore` | Search Engine | Managed cloud search service (Microsoft Azure AI Search) with HNSW vector search | No | No | BM25, Embedding, Hybrid | | Chroma | `ChromaDocumentStore` | Vector Database | Purpose-built vector database | Yes | Yes | Embedding | -| Elasticsearch | `ElasticsearchDocumentStore` | Search Engine | Distributed search & analytics engine with BM25 + vector (kNN) search | Partial | Yes | BM25, Embedding, SQL | +| Elasticsearch | `ElasticsearchDocumentStore` | Search Engine | Distributed search & analytics engine with BM25 + vector (kNN) search | Partial | Yes | BM25, Embedding, SQL | | FAISS | `FAISSDocumentStore` | Vector Index Library | In-memory vector similarity search library (Meta/Facebook) with JSON file for metadata | Yes | No | Embedding | | FalkorDB | `FalkorDBDocumentStore` | Graph Database | OpenCypher graph database with ANN vector search | Yes (SSPL) | No | Embedding, Cypher | -| MongoDB Atlas | `MongoDBAtlasDocumentStore` | Document / NoSQL Database | Cloud document database with Atlas Vector Search and full-text search | No | Yes | Embedding, Full-text | +| MongoDB Atlas | `MongoDBAtlasDocumentStore` | Document / NoSQL Database | Cloud document database with Atlas Vector Search and full-text search | No | Yes | Embedding, Full-text | | Oracle | `OracleDocumentStore` | Relational Database | Oracle with native AI Vector Search, HNSW vector index and DBMS_SEARCH full-text keyword index | No | Yes | Embedding, Keyword | -| OpenSearch | `OpenSearchDocumentStore` | Search Engine | Distributed search engine (AWS fork of Elasticsearch) with BM25 + kNN vector search | Yes | Yes | BM25, Embedding, Hybrid, Metadata, SQL | -| PGVector | `PgvectorDocumentStore` | Relational Database | Relational database (PostgreSQL) with the `pgvector` extension for vector similarity search | Yes | Yes | Embedding, Keyword | +| OpenSearch | `OpenSearchDocumentStore` | Search Engine | Distributed search engine (AWS fork of Elasticsearch) with BM25 + kNN vector search | Yes | Yes | BM25, Embedding, Hybrid, Metadata, SQL | +| PGVector | `PgvectorDocumentStore` | Relational Database | Relational database (PostgreSQL) with the `pgvector` extension for vector similarity search | Yes | Yes | Embedding, Keyword | | Pinecone | `PineconeDocumentStore` | Vector Database | Managed cloud vector database | No | Yes | Embedding | -| Qdrant | `QdrantDocumentStore` | Vector Database | Purpose-built vector database with dense + sparse embedding support | Yes | Yes | Embedding, Sparse Embedding, Hybrid | -| Supabase | `SupabasePgvectorDocumentStore` | Relational Database | Managed cloud Supabase — a wrapper over PgvectorDocumentStore with Supabase-specific defaults | Yes | Yes | Embedding, Keyword | -| Valkey | `ValkeyDocumentStore` | In-memory Key-Value Store | In-memory key-value store (Redis fork) with HNSW vector search via `glide` client | Yes | Yes | Embedding | -| Vespa | `VespaDocumentStore` | Search Engine | Distributed search & serving engine with BM25 lexical + HNSW vector (ANN) search | Yes | No | BM25, Embedding | +| Qdrant | `QdrantDocumentStore` | Vector Database | Purpose-built vector database with dense + sparse embedding support | Yes | Yes | Embedding, Sparse Embedding, Hybrid | +| Supabase | `SupabasePgvectorDocumentStore` | Relational Database | Managed cloud Supabase — a wrapper over PgvectorDocumentStore with Supabase-specific defaults | Yes | Yes | Embedding, Keyword | +| Valkey | `ValkeyDocumentStore` | In-memory Key-Value Store | In-memory key-value store (Redis fork) with HNSW vector search via `glide` client | Yes | Yes | Embedding | +| Vespa | `VespaDocumentStore` | Search Engine | Distributed search & serving engine with BM25 lexical + HNSW vector (ANN) search | Yes | No | BM25, Embedding | | Weaviate | `WeaviateDocumentStore` | Vector Database | Purpose-built vector database with hybrid search support | Yes | Yes | BM25, Embedding, Hybrid | #### External integrations -| Integration | Class | Category | Engine Type | Open Source | Async Support | Retrievers | -| --- | --- | --- | --- | --- | --- | --- | -| Couchbase | `CouchbaseDocumentStore` | Document / NoSQL Database | Distributed NoSQL document database with vector search via Search Service | Partial | Yes | Embedding, Full-text | +| Integration | Category | Engine Type | Open Source | Async Support | Retrievers | +| --- | --- | --- | --- | --- | --- | +| Couchbase | `CouchbaseDocumentStore` | Document / NoSQL Database | Distributed NoSQL document database with vector search via Search Service | Partial | Yes | Embedding, Full-text | | LanceDB | `LanceDBDocumentStore` | Vector Database | Embedded vector database built on the Lance columnar format, optimized for multimodal data | Yes | Yes | Embedding, Full-text, Hybrid | -| Milvus | `MilvusDocumentStore` | Vector Database | Open-source vector database built for scalable similarity search | Yes | No | Embedding | +| Milvus | `MilvusDocumentStore` | Vector Database | Open-source vector database built for scalable similarity search | Yes | No | Embedding | | Needle | `NeedleDocumentStore` | Search Engine | Managed RAG-as-a-service platform with built-in document storage and vector search | No | Yes | Embedding, Sparse Embedding, Hybrid | -| Neo4j | `Neo4jDocumentStore` | Multi-model Database | Graph database with native vector index support for combined graph traversal and similarity search | Partial | No | Embedding | -| SingleStore | `SingleStoreDocumentStore` | Relational Database | Distributed SQL database with native vector search and full-text search support | No | Yes | Embedding, Full-text, Keyword | +| Neo4j | `Neo4jDocumentStore` | Multi-model Database | Graph database with native vector index support for combined graph traversal and similarity search | Partial | No | Embedding | +| SingleStore | `SingleStoreDocumentStore` | Relational Database | Distributed SQL database with native vector search and full-text search support | No | Yes | Embedding, Full-text, Keyword | ## Types of Document Stores @@ -80,10 +76,10 @@ Document Stores are special objects in Haystack that abstract all the different - [Chroma](../../document-stores/chromadocumentstore.mdx) - [Pinecone](../../document-stores/pinecone-document-store.mdx) -- [Qdrant](../../document-stores/qdrant-document-store.mdx) +- [Qdrant](../../document-stores/qdrant-document-store.mdx) - [Weaviate](../../document-stores/weaviatedocumentstore.mdx) - LanceDB ([external integration](https://haystack.deepset.ai/integrations/lancedb-document-store)) -- Milvus ([external integration](https://haystack.deepset.ai/integrations/milvus-document-store)) +- Milvus ([external integration](https://haystack.deepset.ai/integrations/milvus-document-store)) ## Search Engines @@ -96,10 +92,10 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** enterprise search or log analytics where both full-text (BM25) and vector search are needed — e.g. an e-commerce product search with filters. - Azure AI Search ([AzureAISearchDocumentStore](../../document-stores/azureaisearchdocumentstore.mdx)) -- [Elasticsearch](../../document-stores/elasticsearch-document-store.mdx) -- [OpenSearch](../../document-stores/opensearch-document-store.mdx) +- [Elasticsearch](../../document-stores/elasticsearch-document-store.mdx) +- [OpenSearch](../../document-stores/opensearch-document-store.mdx) - Needle ([external integration](https://haystack.deepset.ai/integrations/needle-document-store)) -- [Vespa](../../document-stores/vespadocumentstore.mdx) +- [Vespa](../../document-stores/vespadocumentstore.mdx) ## Relational Databases @@ -111,11 +107,11 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** use cases where documents live alongside structured relational data — e.g. a product catalogue where vector search and SQL JOINs are both needed. -- [AlloyDB](../../document-stores/alloydbdocumentstore.mdx) +- [AlloyDB](../../document-stores/alloydbdocumentstore.mdx) - Oracle ([OracleDocumentStore](../../document-stores/oracledocumentstore.mdx)) -- [PGVector](../../document-stores/pgvectordocumentstore.mdx) -- [Supabase](../../document-stores/supabasedocumentstore.mdx) -- SingleStore ([external integration](https://haystack.deepset.ai/integrations/singlestore-document-store)) +- [PGVector](../../document-stores/pgvectordocumentstore.mdx) +- [Supabase](../../document-stores/supabasedocumentstore.mdx) +- SingleStore ([external integration](https://haystack.deepset.ai/integrations/singlestore-document-store)) ## Document / NoSQL Databases @@ -128,8 +124,8 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** applications already using MongoDB or Cassandra that want to add RAG capabilities without introducing a new infrastructure component. - Astra ([AstraDocumentStore](../../document-stores/astradocumentstore.mdx)) -- [MongoDB Atlas](../../document-stores/mongodbatlasdocumentstore.mdx) -- Couchbase ([external integration](https://haystack.deepset.ai/integrations/couchbase-document-store)) +- [MongoDB Atlas](../../document-stores/mongodbatlasdocumentstore.mdx) +- Couchbase ([external integration](https://haystack.deepset.ai/integrations/couchbase-document-store)) ## In-memory Key-Value Stores @@ -141,7 +137,7 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** low-latency, real-time retrieval — e.g. a chatbot that needs sub-millisecond response times. -- [Valkey](../../document-stores/valkeydocumentstore.mdx) +- [Valkey](../../document-stores/valkeydocumentstore.mdx) ## Vector Index Libraries @@ -153,7 +149,7 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** local prototyping, research, or small-scale applications where a lightweight in-process solution is preferred over running an external database server. -- [FAISS](../../document-stores/faissdocumentstore.mdx) +- [FAISS](../../document-stores/faissdocumentstore.mdx) ## Multi-model Databases @@ -167,7 +163,7 @@ Document Stores are special objects in Haystack that abstract all the different - [ArcadeDB](../../document-stores/arcadedbdocumentstore.mdx) - [FalkorDB](../../document-stores/falkordbdocumentstore.mdx) -- Neo4j ([external integration](https://haystack.deepset.ai/integrations/neo4j-document-store)) +- Neo4j ([external integration](https://haystack.deepset.ai/integrations/neo4j-document-store)) ## The In-memory Document Store diff --git a/docs-website/src/css/custom.css b/docs-website/src/css/custom.css index 6570bd63ff..63f723ddcd 100644 --- a/docs-website/src/css/custom.css +++ b/docs-website/src/css/custom.css @@ -996,3 +996,11 @@ html[data-theme='dark'] .navbar-version-badge-dropdown:hover > a::after { display: none !important; } } + +/* Inline logos next to integration names */ +.ds-logo { + height: 14px; + vertical-align: middle; + margin-right: 5px; + display: inline; +} From c7898e1a572cfbd669a53b6bc5dbfb6a29e29d8a Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Thu, 4 Jun 2026 16:43:21 +0200 Subject: [PATCH 3/9] removing columns from tables --- .../choosing-a-document-store.mdx | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx index df6c3d63bf..4ec87e0ff3 100644 --- a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx +++ b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx @@ -23,35 +23,35 @@ Document Stores are special objects in Haystack that abstract all the different | Integration | Category | Engine Type | Open Source | Async Support | Retrievers | | --- | --- | --- | --- | --- | --- | -| ArcadeDB | `ArcadeDBDocumentStore` | Multi-model Database | Multi-model database (graph, document, key-value) with HNSW vector search via HTTP/JSON API | Yes | No | Embedding | -| AlloyDB | `AlloyDBDocumentStore` | Relational Database | Managed PostgreSQL-compatible database (Google Cloud) with pgvector extension | No | Yes | Embedding, Keyword | -| Astra | `AstraDocumentStore` | Document / NoSQL Database | Cloud-native managed NoSQL (Apache Cassandra-based) with vector search via DataStax JSON API | No | No | Embedding | -| Azure AI Search | `AzureAISearchDocumentStore` | Search Engine | Managed cloud search service (Microsoft Azure AI Search) with HNSW vector search | No | No | BM25, Embedding, Hybrid | -| Chroma | `ChromaDocumentStore` | Vector Database | Purpose-built vector database | Yes | Yes | Embedding | -| Elasticsearch | `ElasticsearchDocumentStore` | Search Engine | Distributed search & analytics engine with BM25 + vector (kNN) search | Partial | Yes | BM25, Embedding, SQL | -| FAISS | `FAISSDocumentStore` | Vector Index Library | In-memory vector similarity search library (Meta/Facebook) with JSON file for metadata | Yes | No | Embedding | -| FalkorDB | `FalkorDBDocumentStore` | Graph Database | OpenCypher graph database with ANN vector search | Yes (SSPL) | No | Embedding, Cypher | -| MongoDB Atlas | `MongoDBAtlasDocumentStore` | Document / NoSQL Database | Cloud document database with Atlas Vector Search and full-text search | No | Yes | Embedding, Full-text | -| Oracle | `OracleDocumentStore` | Relational Database | Oracle with native AI Vector Search, HNSW vector index and DBMS_SEARCH full-text keyword index | No | Yes | Embedding, Keyword | -| OpenSearch | `OpenSearchDocumentStore` | Search Engine | Distributed search engine (AWS fork of Elasticsearch) with BM25 + kNN vector search | Yes | Yes | BM25, Embedding, Hybrid, Metadata, SQL | -| PGVector | `PgvectorDocumentStore` | Relational Database | Relational database (PostgreSQL) with the `pgvector` extension for vector similarity search | Yes | Yes | Embedding, Keyword | -| Pinecone | `PineconeDocumentStore` | Vector Database | Managed cloud vector database | No | Yes | Embedding | -| Qdrant | `QdrantDocumentStore` | Vector Database | Purpose-built vector database with dense + sparse embedding support | Yes | Yes | Embedding, Sparse Embedding, Hybrid | -| Supabase | `SupabasePgvectorDocumentStore` | Relational Database | Managed cloud Supabase — a wrapper over PgvectorDocumentStore with Supabase-specific defaults | Yes | Yes | Embedding, Keyword | -| Valkey | `ValkeyDocumentStore` | In-memory Key-Value Store | In-memory key-value store (Redis fork) with HNSW vector search via `glide` client | Yes | Yes | Embedding | -| Vespa | `VespaDocumentStore` | Search Engine | Distributed search & serving engine with BM25 lexical + HNSW vector (ANN) search | Yes | No | BM25, Embedding | -| Weaviate | `WeaviateDocumentStore` | Vector Database | Purpose-built vector database with hybrid search support | Yes | Yes | BM25, Embedding, Hybrid | +| ArcadeDB | Multi-model Database | Multi-model database (graph, document, key-value) with HNSW vector search via HTTP/JSON API | Yes | No | Embedding | +| AlloyDB | Relational Database | Managed PostgreSQL-compatible database (Google Cloud) with pgvector extension | No | Yes | Embedding, Keyword | +| Astra | Document / NoSQL Database | Cloud-native managed NoSQL (Apache Cassandra-based) with vector search via DataStax JSON API | No | No | Embedding | +| Azure AI Search | Search Engine | Managed cloud search service (Microsoft Azure AI Search) with HNSW vector search | No | No | BM25, Embedding, Hybrid | +| Chroma | Vector Database | Purpose-built vector database | Yes | Yes | Embedding | +| Elasticsearch | Search Engine | Distributed search & analytics engine with BM25 + vector (kNN) search | Partial | Yes | BM25, Embedding, SQL | +| FAISS | Vector Index Library | In-memory vector similarity search library (Meta/Facebook) with JSON file for metadata | Yes | No | Embedding | +| FalkorDB | Graph Database | OpenCypher graph database with ANN vector search | Yes (SSPL) | No | Embedding, Cypher | +| MongoDB Atlas | Document / NoSQL Database | Cloud document database with Atlas Vector Search and full-text search | No | Yes | Embedding, Full-text | +| Oracle | Relational Database | Oracle with native AI Vector Search, HNSW vector index and DBMS_SEARCH full-text keyword index | No | Yes | Embedding, Keyword | +| OpenSearch | Search Engine | Distributed search engine (AWS fork of Elasticsearch) with BM25 + kNN vector search | Yes | Yes | BM25, Embedding, Hybrid, Metadata, SQL | +| PGVector | Relational Database | Relational database (PostgreSQL) with the `pgvector` extension for vector similarity search | Yes | Yes | Embedding, Keyword | +| Pinecone | Vector Database | Managed cloud vector database | No | Yes | Embedding | +| Qdrant | Vector Database | Purpose-built vector database with dense + sparse embedding support | Yes | Yes | Embedding, Sparse Embedding, Hybrid | +| Supabase | Relational Database | Managed cloud Supabase — a wrapper over PgvectorDocumentStore with Supabase-specific defaults | Yes | Yes | Embedding, Keyword | +| Valkey | In-memory Key-Value Store | In-memory key-value store (Redis fork) with HNSW vector search via `glide` client | Yes | Yes | Embedding | +| Vespa | Search Engine | Distributed search & serving engine with BM25 lexical + HNSW vector (ANN) search | Yes | No | BM25, Embedding | +| Weaviate | Vector Database | Purpose-built vector database with hybrid search support | Yes | Yes | BM25, Embedding, Hybrid | #### External integrations | Integration | Category | Engine Type | Open Source | Async Support | Retrievers | | --- | --- | --- | --- | --- | --- | -| Couchbase | `CouchbaseDocumentStore` | Document / NoSQL Database | Distributed NoSQL document database with vector search via Search Service | Partial | Yes | Embedding, Full-text | -| LanceDB | `LanceDBDocumentStore` | Vector Database | Embedded vector database built on the Lance columnar format, optimized for multimodal data | Yes | Yes | Embedding, Full-text, Hybrid | -| Milvus | `MilvusDocumentStore` | Vector Database | Open-source vector database built for scalable similarity search | Yes | No | Embedding | -| Needle | `NeedleDocumentStore` | Search Engine | Managed RAG-as-a-service platform with built-in document storage and vector search | No | Yes | Embedding, Sparse Embedding, Hybrid | -| Neo4j | `Neo4jDocumentStore` | Multi-model Database | Graph database with native vector index support for combined graph traversal and similarity search | Partial | No | Embedding | -| SingleStore | `SingleStoreDocumentStore` | Relational Database | Distributed SQL database with native vector search and full-text search support | No | Yes | Embedding, Full-text, Keyword | +| Couchbase | Document / NoSQL Database | Distributed NoSQL document database with vector search via Search Service | Partial | Yes | Embedding, Full-text | +| LanceDB | Vector Database | Embedded vector database built on the Lance columnar format, optimized for multimodal data | Yes | Yes | Embedding, Full-text, Hybrid | +| Milvus | Vector Database | Open-source vector database built for scalable similarity search | Yes | No | Embedding | +| Needle | Search Engine | Managed RAG-as-a-service platform with built-in document storage and vector search | No | Yes | Embedding, Sparse Embedding, Hybrid | +| Neo4j | Multi-model Database | Graph database with native vector index support for combined graph traversal and similarity search | Partial | No | Embedding | +| SingleStore | Relational Database | Distributed SQL database with native vector search and full-text search support | No | Yes | Embedding, Full-text, Keyword | ## Types of Document Stores From 0992f19237796015efd5baad11e7760d34d411ad Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Fri, 5 Jun 2026 12:08:14 +0200 Subject: [PATCH 4/9] improving Doc Stores page --- .../choosing-a-document-store.mdx | 91 ++-- .../static/img/document-stores-overview.svg | 149 +++--- .../img/logos/document-stores/alloydb.svg | 105 +++- .../img/logos/document-stores/arcadedb.png | Bin 0 -> 26886 bytes .../img/logos/document-stores/astra.png | Bin 0 -> 32524 bytes .../img/logos/document-stores/azure.svg | 1 + .../img/logos/document-stores/chroma.svg | 83 +++ .../img/logos/document-stores/couchbase.svg | 2 +- .../logos/document-stores/elasticsearch.svg | 4 +- .../img/logos/document-stores/faiss.png | Bin 0 -> 29798 bytes .../img/logos/document-stores/faiss.svg | 1 - .../img/logos/document-stores/falkordb.svg | 1 + .../img/logos/document-stores/lancedb.svg | 9 + .../img/logos/document-stores/milvus.svg | 12 +- .../img/logos/document-stores/mongodb.svg | 12 +- .../img/logos/document-stores/needle.png | Bin 0 -> 51891 bytes .../img/logos/document-stores/neo4j.svg | 30 +- .../img/logos/document-stores/opensearch.svg | 8 +- .../img/logos/document-stores/oracle.svg | 1 + .../img/logos/document-stores/pinecone.svg | 1 + .../img/logos/document-stores/postgresql.svg | 251 ++++++++- .../img/logos/document-stores/qdrant.svg | 28 +- .../img/logos/document-stores/redis.svg | 1 - .../img/logos/document-stores/singlestore.svg | 222 +++++++- .../img/logos/document-stores/supabase.svg | 16 +- .../img/logos/document-stores/valkey.svg | 2 +- .../img/logos/document-stores/vespa.svg | 2 +- .../img/logos/document-stores/weaviate.svg | 504 ++++++++++++++++++ pyproject.toml | 2 +- 29 files changed, 1392 insertions(+), 146 deletions(-) create mode 100644 docs-website/static/img/logos/document-stores/arcadedb.png create mode 100644 docs-website/static/img/logos/document-stores/astra.png create mode 100644 docs-website/static/img/logos/document-stores/azure.svg create mode 100644 docs-website/static/img/logos/document-stores/chroma.svg create mode 100644 docs-website/static/img/logos/document-stores/faiss.png delete mode 100644 docs-website/static/img/logos/document-stores/faiss.svg create mode 100644 docs-website/static/img/logos/document-stores/falkordb.svg create mode 100644 docs-website/static/img/logos/document-stores/lancedb.svg create mode 100644 docs-website/static/img/logos/document-stores/needle.png create mode 100644 docs-website/static/img/logos/document-stores/oracle.svg create mode 100644 docs-website/static/img/logos/document-stores/pinecone.svg delete mode 100644 docs-website/static/img/logos/document-stores/redis.svg create mode 100644 docs-website/static/img/logos/document-stores/weaviate.svg diff --git a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx index 4ec87e0ff3..7bcc77c07d 100644 --- a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx +++ b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx @@ -9,59 +9,62 @@ import ClickableImage from "@site/src/components/ClickableImage"; # Choosing a Document Store -Whether you are developing a chatbot, a RAG system, or an image captioner, at some point, it's likely for your AI application to compare the input it gets with the information it already knows. Most of the time, this comparison is performed through vector similarity search. +Whether you are developing a chatbot, a RAG system, or an image captioner, at some point, it's likely for your AI +application to compare the input it gets with the information it already knows. -If you're unfamiliar with vectors, think about them as a way to represent text, images, or audio/video in a numerical form called vector embeddings. Vector databases are specifically designed to store such vectors efficiently, providing all the functionalities an AI application needs to implement data retrieval and similarity search. +Haystack currently has integrations with seven categories of Document Stores: -Document Stores are special objects in Haystack that abstract all the different vector databases into a common interface that can be easily integrated into a pipeline, most commonly through a Retriever component. Normally, you will find specialized Document Store and Retriever objects for each vector database Haystack supports. +- **Vector Databases** — purpose-built for embedding search and semantic retrieval +- **Search Engines** — full-text search engines extended with vector (kNN) capabilities +- **Relational Databases** — SQL databases with vector search via plugins or extensions +- **Document / NoSQL Databases** — flexible document stores with vector search added on top +- **In-memory Key-Value Stores** — ultra-low-latency stores with HNSW vector search +- **Vector Index Libraries** — lightweight in-process vector similarity search, no external service +- **Multi-model Databases** — single engine supporting graph, document, and vector data models + +Here is an overview of all the integrations currently available, grouped by category: - + ## DocumentStore Integrations Available in Haystack +Haystack integrations come in two tiers. **Core integrations** are built and maintained by the Haystack team — they are tested against every release, follow the same API conventions, and come with full documentation and support. **External integrations** are contributed and maintained by the community; they extend Haystack's reach but are not covered by the core release cycle. + +The tables below list every available integration alongside the key properties you need to choose the right one for your use case: the underlying **Engine Type** gives you a sense of what the database is optimised for; **Open Source** tells you whether you can self-host it; **Async Support** matters for high-throughput pipelines; and **Retrievers** shows which retrieval strategies are available out of the box — BM25 for keyword search, Embedding for semantic search, Hybrid for both, and specialised options such as Sparse Embedding or SQL where supported. + #### Core integrations | Integration | Category | Engine Type | Open Source | Async Support | Retrievers | | --- | --- | --- | --- | --- | --- | | ArcadeDB | Multi-model Database | Multi-model database (graph, document, key-value) with HNSW vector search via HTTP/JSON API | Yes | No | Embedding | -| AlloyDB | Relational Database | Managed PostgreSQL-compatible database (Google Cloud) with pgvector extension | No | Yes | Embedding, Keyword | +| AlloyDB | Relational Database | Managed PostgreSQL-compatible database (Google Cloud) with pgvector extension | No | Yes | Embedding, Keyword | | Astra | Document / NoSQL Database | Cloud-native managed NoSQL (Apache Cassandra-based) with vector search via DataStax JSON API | No | No | Embedding | | Azure AI Search | Search Engine | Managed cloud search service (Microsoft Azure AI Search) with HNSW vector search | No | No | BM25, Embedding, Hybrid | | Chroma | Vector Database | Purpose-built vector database | Yes | Yes | Embedding | -| Elasticsearch | Search Engine | Distributed search & analytics engine with BM25 + vector (kNN) search | Partial | Yes | BM25, Embedding, SQL | +| Elasticsearch | Search Engine | Distributed search & analytics engine with BM25 + vector (kNN) search | Partial | Yes | BM25, Embedding, SQL | | FAISS | Vector Index Library | In-memory vector similarity search library (Meta/Facebook) with JSON file for metadata | Yes | No | Embedding | | FalkorDB | Graph Database | OpenCypher graph database with ANN vector search | Yes (SSPL) | No | Embedding, Cypher | -| MongoDB Atlas | Document / NoSQL Database | Cloud document database with Atlas Vector Search and full-text search | No | Yes | Embedding, Full-text | +| MongoDB Atlas | Document / NoSQL Database | Cloud document database with Atlas Vector Search and full-text search | No | Yes | Embedding, Full-text | | Oracle | Relational Database | Oracle with native AI Vector Search, HNSW vector index and DBMS_SEARCH full-text keyword index | No | Yes | Embedding, Keyword | -| OpenSearch | Search Engine | Distributed search engine (AWS fork of Elasticsearch) with BM25 + kNN vector search | Yes | Yes | BM25, Embedding, Hybrid, Metadata, SQL | -| PGVector | Relational Database | Relational database (PostgreSQL) with the `pgvector` extension for vector similarity search | Yes | Yes | Embedding, Keyword | +| OpenSearch | Search Engine | Distributed search engine (AWS fork of Elasticsearch) with BM25 + kNN vector search | Yes | Yes | BM25, Embedding, Hybrid, Metadata, SQL | +| PGVector | Relational Database | Relational database (PostgreSQL) with the `pgvector` extension for vector similarity search | Yes | Yes | Embedding, Keyword | | Pinecone | Vector Database | Managed cloud vector database | No | Yes | Embedding | -| Qdrant | Vector Database | Purpose-built vector database with dense + sparse embedding support | Yes | Yes | Embedding, Sparse Embedding, Hybrid | -| Supabase | Relational Database | Managed cloud Supabase — a wrapper over PgvectorDocumentStore with Supabase-specific defaults | Yes | Yes | Embedding, Keyword | -| Valkey | In-memory Key-Value Store | In-memory key-value store (Redis fork) with HNSW vector search via `glide` client | Yes | Yes | Embedding | -| Vespa | Search Engine | Distributed search & serving engine with BM25 lexical + HNSW vector (ANN) search | Yes | No | BM25, Embedding | +| Qdrant | Vector Database | Purpose-built vector database with dense + sparse embedding support | Yes | Yes | Embedding, Sparse Embedding, Hybrid | +| Supabase | Relational Database | Managed cloud Supabase — a wrapper over PgvectorDocumentStore with Supabase-specific defaults | Yes | Yes | Embedding, Keyword | +| Valkey | In-memory Key-Value Store | In-memory key-value store (Redis fork) with HNSW vector search via `glide` client | Yes | Yes | Embedding | +| Vespa | Search Engine | Distributed search & serving engine with BM25 lexical + HNSW vector (ANN) search | Yes | No | BM25, Embedding | | Weaviate | Vector Database | Purpose-built vector database with hybrid search support | Yes | Yes | BM25, Embedding, Hybrid | #### External integrations | Integration | Category | Engine Type | Open Source | Async Support | Retrievers | | --- | --- | --- | --- | --- | --- | -| Couchbase | Document / NoSQL Database | Distributed NoSQL document database with vector search via Search Service | Partial | Yes | Embedding, Full-text | +| Couchbase | Document / NoSQL Database | Distributed NoSQL document database with vector search via Search Service | Partial | Yes | Embedding, Full-text | | LanceDB | Vector Database | Embedded vector database built on the Lance columnar format, optimized for multimodal data | Yes | Yes | Embedding, Full-text, Hybrid | -| Milvus | Vector Database | Open-source vector database built for scalable similarity search | Yes | No | Embedding | +| Milvus | Vector Database | Open-source vector database built for scalable similarity search | Yes | No | Embedding | | Needle | Search Engine | Managed RAG-as-a-service platform with built-in document storage and vector search | No | Yes | Embedding, Sparse Embedding, Hybrid | -| Neo4j | Multi-model Database | Graph database with native vector index support for combined graph traversal and similarity search | Partial | No | Embedding | -| SingleStore | Relational Database | Distributed SQL database with native vector search and full-text search support | No | Yes | Embedding, Full-text, Keyword | - -## Types of Document Stores - -- **Vector Databases** — purpose-built for embedding search and semantic retrieval -- **Search Engines** — full-text search engines extended with vector (kNN) capabilities -- **Relational Databases** — SQL databases with vector search via plugins or extensions -- **Document / NoSQL Databases** — flexible document stores with vector search added on top -- **In-memory Key-Value Stores** — ultra-low-latency stores with HNSW vector search -- **Vector Index Libraries** — lightweight in-process vector similarity search, no external service -- **Multi-model Databases** — single engine supporting graph, document, and vector data models +| Neo4j | Multi-model Database | Graph database with native vector index support for combined graph traversal and similarity search | Partial | No | Embedding | +| SingleStore | Relational Database | Distributed SQL database with native vector search and full-text search support | No | Yes | Embedding, Full-text, Keyword | ## Vector Databases @@ -76,10 +79,10 @@ Document Stores are special objects in Haystack that abstract all the different - [Chroma](../../document-stores/chromadocumentstore.mdx) - [Pinecone](../../document-stores/pinecone-document-store.mdx) -- [Qdrant](../../document-stores/qdrant-document-store.mdx) +- [Qdrant](../../document-stores/qdrant-document-store.mdx) - [Weaviate](../../document-stores/weaviatedocumentstore.mdx) -- LanceDB ([external integration](https://haystack.deepset.ai/integrations/lancedb-document-store)) -- Milvus ([external integration](https://haystack.deepset.ai/integrations/milvus-document-store)) +- [LanceDB](https://haystack.deepset.ai/integrations/lancedb) (external integration) +- [Milvus](https://haystack.deepset.ai/integrations/milvus-document-store) (external integration) ## Search Engines @@ -92,10 +95,10 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** enterprise search or log analytics where both full-text (BM25) and vector search are needed — e.g. an e-commerce product search with filters. - Azure AI Search ([AzureAISearchDocumentStore](../../document-stores/azureaisearchdocumentstore.mdx)) -- [Elasticsearch](../../document-stores/elasticsearch-document-store.mdx) -- [OpenSearch](../../document-stores/opensearch-document-store.mdx) -- Needle ([external integration](https://haystack.deepset.ai/integrations/needle-document-store)) -- [Vespa](../../document-stores/vespadocumentstore.mdx) +- [Elasticsearch](../../document-stores/elasticsearch-document-store.mdx) +- [OpenSearch](../../document-stores/opensearch-document-store.mdx) +- [Needle](https://haystack.deepset.ai/integrations/needle) (external integration) +- [Vespa](../../document-stores/vespadocumentstore.mdx) ## Relational Databases @@ -107,11 +110,11 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** use cases where documents live alongside structured relational data — e.g. a product catalogue where vector search and SQL JOINs are both needed. -- [AlloyDB](../../document-stores/alloydbdocumentstore.mdx) -- Oracle ([OracleDocumentStore](../../document-stores/oracledocumentstore.mdx)) -- [PGVector](../../document-stores/pgvectordocumentstore.mdx) -- [Supabase](../../document-stores/supabasedocumentstore.mdx) -- SingleStore ([external integration](https://haystack.deepset.ai/integrations/singlestore-document-store)) +- [AlloyDB](../../document-stores/alloydbdocumentstore.mdx) +- [Oracle](../../document-stores/oracledocumentstore.mdx) +- [PGVector](../../document-stores/pgvectordocumentstore.mdx) +- [Supabase](../../document-stores/supabasedocumentstore.mdx) +- [SingleStore](https://haystack.deepset.ai/integrations/singlestore) (external integration) ## Document / NoSQL Databases @@ -124,8 +127,8 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** applications already using MongoDB or Cassandra that want to add RAG capabilities without introducing a new infrastructure component. - Astra ([AstraDocumentStore](../../document-stores/astradocumentstore.mdx)) -- [MongoDB Atlas](../../document-stores/mongodbatlasdocumentstore.mdx) -- Couchbase ([external integration](https://haystack.deepset.ai/integrations/couchbase-document-store)) +- [MongoDB Atlas](../../document-stores/mongodbatlasdocumentstore.mdx) +- [Couchbase](https://haystack.deepset.ai/integrations/couchbase-document-store) (external integration) ## In-memory Key-Value Stores @@ -137,7 +140,7 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** low-latency, real-time retrieval — e.g. a chatbot that needs sub-millisecond response times. -- [Valkey](../../document-stores/valkeydocumentstore.mdx) +- [Valkey](../../document-stores/valkeydocumentstore.mdx) ## Vector Index Libraries @@ -149,7 +152,7 @@ Document Stores are special objects in Haystack that abstract all the different **Best for** local prototyping, research, or small-scale applications where a lightweight in-process solution is preferred over running an external database server. -- [FAISS](../../document-stores/faissdocumentstore.mdx) +- [FAISS](../../document-stores/faissdocumentstore.mdx) ## Multi-model Databases @@ -163,7 +166,7 @@ Document Stores are special objects in Haystack that abstract all the different - [ArcadeDB](../../document-stores/arcadedbdocumentstore.mdx) - [FalkorDB](../../document-stores/falkordbdocumentstore.mdx) -- Neo4j ([external integration](https://haystack.deepset.ai/integrations/neo4j-document-store)) +- [Neo4j](https://haystack.deepset.ai/integrations/neo4j-document-store) (external integration) ## The In-memory Document Store diff --git a/docs-website/static/img/document-stores-overview.svg b/docs-website/static/img/document-stores-overview.svg index d97f958b7c..ea984b95f8 100644 --- a/docs-website/static/img/document-stores-overview.svg +++ b/docs-website/static/img/document-stores-overview.svg @@ -1,87 +1,64 @@ - - - DocumentStore Integrations in Haystack - * External integrations (community-maintained) - - - -Vector Databases - -Chroma - -Pinecone - -Qdrant - -Weaviate - -LanceDB * - -Milvus * - - - -Search Engines - -Azure AI Search - -Elasticsearch - -OpenSearch - -Needle * - -Vespa - - - -Relational Databases - -AlloyDB - -Oracle - -PGVector - -Supabase - -SingleStore * - - - -Document / NoSQL - -Astra - -MongoDB Atlas - -Couchbase * - - - -In-memory Key-Value - -Valkey - - - -Vector Index Libraries - -FAISS - - - -Multi-model Databases - -ArcadeDB - -FalkorDB - -Neo4j * - - - -In-memory Document Store - -InMemoryDocumentStore (built-in) + + + + + +Vector Databases + + + + + + + + + +Search Engines + +Azure +AI Search + + + +Needle +* + + + + +Relational Databases + + + + +Supabase + + + + +Document / NoSQL + +Astra + + + + + +In-memory Key-Value + + + + +Vector Index Libraries + +FAISS + + + +Multi-model Databases + +ArcadeDB + + +* External (community-maintained) integration diff --git a/docs-website/static/img/logos/document-stores/alloydb.svg b/docs-website/static/img/logos/document-stores/alloydb.svg index dd1188f1c4..ecb11c6067 100644 --- a/docs-website/static/img/logos/document-stores/alloydb.svg +++ b/docs-website/static/img/logos/document-stores/alloydb.svg @@ -1 +1,104 @@ -Google Cloud + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/arcadedb.png b/docs-website/static/img/logos/document-stores/arcadedb.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe49c85912690bf0f907c81d0f5a247572ce740 GIT binary patch literal 26886 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

xE-@|+@+;Akf!wK}P3B=v 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 diff --git a/docs-website/static/img/logos/document-stores/chroma.svg b/docs-website/static/img/logos/document-stores/chroma.svg new file mode 100644 index 0000000000..473026c206 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/chroma.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/couchbase.svg b/docs-website/static/img/logos/document-stores/couchbase.svg index e66a38f154..44fe6f1b63 100644 --- a/docs-website/static/img/logos/document-stores/couchbase.svg +++ b/docs-website/static/img/logos/document-stores/couchbase.svg @@ -1 +1 @@ -Couchbase +logo diff --git a/docs-website/static/img/logos/document-stores/elasticsearch.svg b/docs-website/static/img/logos/document-stores/elasticsearch.svg index d1b51bee06..fffaffaa93 100644 --- a/docs-website/static/img/logos/document-stores/elasticsearch.svg +++ b/docs-website/static/img/logos/document-stores/elasticsearch.svg @@ -1 +1,3 @@ -Elasticsearch + + + diff --git a/docs-website/static/img/logos/document-stores/faiss.png b/docs-website/static/img/logos/document-stores/faiss.png new file mode 100644 index 0000000000000000000000000000000000000000..b95daefa25656489d8542958edd0f2c6537de8b9 GIT binary patch literal 29798 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 LNkvXXu0mjfxnCu? literal 0 HcmV?d00001 diff --git a/docs-website/static/img/logos/document-stores/faiss.svg b/docs-website/static/img/logos/document-stores/faiss.svg deleted file mode 100644 index 37a2129bdf..0000000000 --- a/docs-website/static/img/logos/document-stores/faiss.svg +++ /dev/null @@ -1 +0,0 @@ -Meta diff --git a/docs-website/static/img/logos/document-stores/falkordb.svg b/docs-website/static/img/logos/document-stores/falkordb.svg new file mode 100644 index 0000000000..81a10cfe20 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/falkordb.svg @@ -0,0 +1 @@ + diff --git a/docs-website/static/img/logos/document-stores/lancedb.svg b/docs-website/static/img/logos/document-stores/lancedb.svg new file mode 100644 index 0000000000..f44bf3b187 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/lancedb.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/milvus.svg b/docs-website/static/img/logos/document-stores/milvus.svg index fa6368b356..4c2e866cb1 100644 --- a/docs-website/static/img/logos/document-stores/milvus.svg +++ b/docs-website/static/img/logos/document-stores/milvus.svg @@ -1 +1,11 @@ -Milvus + + + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/mongodb.svg b/docs-website/static/img/logos/document-stores/mongodb.svg index 5950fa0392..57321296bf 100644 --- a/docs-website/static/img/logos/document-stores/mongodb.svg +++ b/docs-website/static/img/logos/document-stores/mongodb.svg @@ -1 +1,11 @@ -MongoDB + + + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/needle.png b/docs-website/static/img/logos/document-stores/needle.png new file mode 100644 index 0000000000000000000000000000000000000000..5f88be079342d5969f6297c1ec51f117ca5715a5 GIT binary patch literal 51891 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/opensearch.svg b/docs-website/static/img/logos/document-stores/opensearch.svg index cd77653110..a59dc45372 100644 --- a/docs-website/static/img/logos/document-stores/opensearch.svg +++ b/docs-website/static/img/logos/document-stores/opensearch.svg @@ -1 +1,7 @@ -OpenSearch + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/oracle.svg b/docs-website/static/img/logos/document-stores/oracle.svg new file mode 100644 index 0000000000..bad99882dd --- /dev/null +++ b/docs-website/static/img/logos/document-stores/oracle.svg @@ -0,0 +1 @@ + diff --git a/docs-website/static/img/logos/document-stores/pinecone.svg b/docs-website/static/img/logos/document-stores/pinecone.svg new file mode 100644 index 0000000000..e051115721 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/pinecone.svg @@ -0,0 +1 @@ + diff --git a/docs-website/static/img/logos/document-stores/postgresql.svg b/docs-website/static/img/logos/document-stores/postgresql.svg index d7ccd9e3a6..c9ecc078fd 100644 --- a/docs-website/static/img/logos/document-stores/postgresql.svg +++ b/docs-website/static/img/logos/document-stores/postgresql.svg @@ -1 +1,250 @@ -PostgreSQL + + + +image/svg+xml diff --git a/docs-website/static/img/logos/document-stores/qdrant.svg b/docs-website/static/img/logos/document-stores/qdrant.svg index 726a78b9a7..82fb8b3938 100644 --- a/docs-website/static/img/logos/document-stores/qdrant.svg +++ b/docs-website/static/img/logos/document-stores/qdrant.svg @@ -1 +1,27 @@ -Qdrant + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/redis.svg b/docs-website/static/img/logos/document-stores/redis.svg deleted file mode 100644 index 4bcedd4242..0000000000 --- a/docs-website/static/img/logos/document-stores/redis.svg +++ /dev/null @@ -1 +0,0 @@ -Redis diff --git a/docs-website/static/img/logos/document-stores/singlestore.svg b/docs-website/static/img/logos/document-stores/singlestore.svg index b613fe292f..64504f7e4c 100644 --- a/docs-website/static/img/logos/document-stores/singlestore.svg +++ b/docs-website/static/img/logos/document-stores/singlestore.svg @@ -1 +1,221 @@ -SingleStore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/supabase.svg b/docs-website/static/img/logos/document-stores/supabase.svg index 4957947fa2..574f67eca7 100644 --- a/docs-website/static/img/logos/document-stores/supabase.svg +++ b/docs-website/static/img/logos/document-stores/supabase.svg @@ -1 +1,15 @@ -Supabase + + + + + + + + + + + + + + + diff --git a/docs-website/static/img/logos/document-stores/valkey.svg b/docs-website/static/img/logos/document-stores/valkey.svg index 4bcedd4242..1581bbd4fa 100644 --- a/docs-website/static/img/logos/document-stores/valkey.svg +++ b/docs-website/static/img/logos/document-stores/valkey.svg @@ -1 +1 @@ -Redis + diff --git a/docs-website/static/img/logos/document-stores/vespa.svg b/docs-website/static/img/logos/document-stores/vespa.svg index 372065983d..e9285326e7 100644 --- a/docs-website/static/img/logos/document-stores/vespa.svg +++ b/docs-website/static/img/logos/document-stores/vespa.svg @@ -1 +1 @@ -Vespa +VespaLogo copy diff --git a/docs-website/static/img/logos/document-stores/weaviate.svg b/docs-website/static/img/logos/document-stores/weaviate.svg new file mode 100644 index 0000000000..e432c21c61 --- /dev/null +++ b/docs-website/static/img/logos/document-stores/weaviate.svg @@ -0,0 +1,504 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pyproject.toml b/pyproject.toml index 43bd669416..afbab59cd8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -199,7 +199,7 @@ packages = ["haystack"] [tool.codespell] ignore-words-list = "ans,astroid,nd,ned,nin,ue,rouge,ist, Claus,SME" quiet-level = 3 -skip = "./test,./e2e" +skip = "./test,./e2e,*.svg" [tool.pytest.ini_options] minversion = "6.0" From 385b9b2f4b6f6ff7da4bd344924464b30cc120f9 Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Tue, 9 Jun 2026 17:17:00 +0200 Subject: [PATCH 5/9] Update docs-website/docs/concepts/document-store/choosing-a-document-store.mdx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kacper Łukawski --- .../docs/concepts/document-store/choosing-a-document-store.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx index 7bcc77c07d..9f1c9dcc20 100644 --- a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx +++ b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx @@ -30,7 +30,7 @@ Here is an overview of all the integrations currently available, grouped by cate Haystack integrations come in two tiers. **Core integrations** are built and maintained by the Haystack team — they are tested against every release, follow the same API conventions, and come with full documentation and support. **External integrations** are contributed and maintained by the community; they extend Haystack's reach but are not covered by the core release cycle. -The tables below list every available integration alongside the key properties you need to choose the right one for your use case: the underlying **Engine Type** gives you a sense of what the database is optimised for; **Open Source** tells you whether you can self-host it; **Async Support** matters for high-throughput pipelines; and **Retrievers** shows which retrieval strategies are available out of the box — BM25 for keyword search, Embedding for semantic search, Hybrid for both, and specialised options such as Sparse Embedding or SQL where supported. +The tables below list every available integration alongside the key properties you need to choose the right one for your use case. #### Core integrations From 6bf88da1b1bcc648bd9b8957916049dccc7cf983 Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Tue, 9 Jun 2026 17:18:07 +0200 Subject: [PATCH 6/9] Update docs-website/docs/concepts/document-store/choosing-a-document-store.mdx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kacper Łukawski --- .../docs/concepts/document-store/choosing-a-document-store.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx index 9f1c9dcc20..eef33c03c4 100644 --- a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx +++ b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx @@ -176,6 +176,6 @@ Haystack ships with an ephemeral document store that relies on pure Python data ## Final Considerations -It can be very challenging to pick one vector database over another by only looking at pure performance, as even the slightest difference in the benchmark can produce a different leaderboard (for example, some benchmarks test the cloud services while others work on a reference machine). Thinking about including features like filtering or not can bring in a whole new set of complexities that make the comparison even harder. +It can be very challenging to pick one Document Store over another by only looking at pure performance, as even the slightest difference in the benchmark can produce a different leaderboard (for example, some benchmarks test the cloud services while others work on a reference machine). Thinking about including features like filtering or not can bring in a whole new set of complexities that make the comparison even harder. What's important for you to know is that the Document Store interface doesn't add much to the costs, and the relative performance of one vector database over another should stay the same when used within Haystack pipelines. From c293e127c8f128e814589d4af6b6942acbc3ee45 Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Tue, 9 Jun 2026 17:28:17 +0200 Subject: [PATCH 7/9] some more refinements --- .../concepts/document-store/choosing-a-document-store.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx index eef33c03c4..29f40952dd 100644 --- a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx +++ b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx @@ -124,7 +124,7 @@ The tables below list every available integration alongside the key properties y - Good choice when the database is already in use and adding a separate vector store is undesirable - Vector search performance may trail behind purpose-built databases -**Best for** applications already using MongoDB or Cassandra that want to add RAG capabilities without introducing a new infrastructure component. +**Best for** applications already that want to add RAG capabilities without introducing a new infrastructure component. - Astra ([AstraDocumentStore](../../document-stores/astradocumentstore.mdx)) - [MongoDB Atlas](../../document-stores/mongodbatlasdocumentstore.mdx) @@ -134,7 +134,7 @@ The tables below list every available integration alongside the key properties y - In-memory architecture delivers extremely low read/write latency - Vector search (HNSW) layered on top of an existing caching infrastructure -- Ideal when the stack already includes Redis or Valkey as a cache or session store +- Ideal when the stack already includes Valkey as a cache or session store - Data is ephemeral by default; persistence requires explicit configuration - Less suited for large corpora where memory cost becomes significant From 54609946d5a12ecb2439822d94d8235bbab88e2c Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Wed, 10 Jun 2026 15:36:06 +0200 Subject: [PATCH 8/9] updating SVG image --- .../choosing-a-document-store.mdx | 2 +- docs-website/src/css/custom.css | 5 +++++ .../static/img/document-stores-overview.svg | 18 +++++++++--------- .../img/logos/document-stores/postgresql.svg | 1 + 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx index 29f40952dd..dfe33b9346 100644 --- a/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx +++ b/docs-website/docs/concepts/document-store/choosing-a-document-store.mdx @@ -24,7 +24,7 @@ Haystack currently has integrations with seven categories of Document Stores: Here is an overview of all the integrations currently available, grouped by category: - + ## DocumentStore Integrations Available in Haystack diff --git a/docs-website/src/css/custom.css b/docs-website/src/css/custom.css index 63f723ddcd..953f4f5816 100644 --- a/docs-website/src/css/custom.css +++ b/docs-website/src/css/custom.css @@ -1004,3 +1004,8 @@ html[data-theme='dark'] .navbar-version-badge-dropdown:hover > a::after { margin-right: 5px; display: inline; } + +/* Allow a ClickableImage to expand to full content width */ +.img-full-width { + max-width: 100% !important; +} diff --git a/docs-website/static/img/document-stores-overview.svg b/docs-website/static/img/document-stores-overview.svg index ea984b95f8..10b7a5fac5 100644 --- a/docs-website/static/img/document-stores-overview.svg +++ b/docs-website/static/img/document-stores-overview.svg @@ -29,7 +29,7 @@ Relational Databases - + Supabase @@ -52,13 +52,13 @@ Vector Index Libraries FAISS - - - + + + Multi-model Databases - -ArcadeDB - - -* External (community-maintained) integration + +ArcadeDB + + + diff --git a/docs-website/static/img/logos/document-stores/postgresql.svg b/docs-website/static/img/logos/document-stores/postgresql.svg index c9ecc078fd..46d8ab8b11 100644 --- a/docs-website/static/img/logos/document-stores/postgresql.svg +++ b/docs-website/static/img/logos/document-stores/postgresql.svg @@ -12,6 +12,7 @@ id="svg3039" version="1.1" inkscape:version="0.91 r13725" + viewBox="0 0 772.09882 129.37642" width="772.09882" height="129.37642" xml:space="preserve" From bd017f6f2ca3f460f698203380a2372fba2d488b Mon Sep 17 00:00:00 2001 From: "David S. Batista" Date: Wed, 10 Jun 2026 15:41:47 +0200 Subject: [PATCH 9/9] updating SVG image --- docs-website/static/img/document-stores-overview.svg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs-website/static/img/document-stores-overview.svg b/docs-website/static/img/document-stores-overview.svg index 10b7a5fac5..70f4e1d1b3 100644 --- a/docs-website/static/img/document-stores-overview.svg +++ b/docs-website/static/img/document-stores-overview.svg @@ -19,10 +19,10 @@ AI Search - -Needle -* - + +Needle + +