Add MariaDB Vector DocumentStore integration - #3565
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
Coverage report (tavily)Click to see where and how coverage changed
This report was generated by python-coverage-comment-action |
||||||||||||||||||||||||
Implements MariaDBDocumentStore backed by MariaDB 11.7+ native VECTOR support with MHNSW indexing and full-text keyword search. - Full DocumentStore protocol: write_documents (FAIL/OVERWRITE/SKIP), filter_documents, delete_documents, count_documents - Vector similarity via VEC_DISTANCE_COSINE / VEC_DISTANCE_EUCLIDEAN - Full-text keyword search via MATCH ... AGAINST (NATURAL LANGUAGE MODE) - Haystack metadata filtering converted to JSON_EXTRACT SQL expressions - MariaDBEmbeddingRetriever and MariaDBKeywordRetriever with FilterPolicy - 80 tests: 68 unit + 12 integration (all verified against MariaDB 11.7) - GitHub Actions workflow with MariaDB 11.7 service container Closes deepset-ai#2340
- Make mariadb C extension import lazy so API reference builds without requiring libmariadb-dev in the docs environment - Fix Docker health check to use --su-mysql flag required by MariaDB 11.7 - Add mariadb (LGPL-2.1) to license compliance exclusion list
f71d1cd to
ff12b6a
Compare
- Add skip-install=true to default hatch env so docs build does not attempt to compile the mariadb C extension (libmariadb-dev not available in the API reference runner). The pydoc search_path already points to src/ so modules are importable without installation. - Switch service container health check from healthcheck.sh (unreliable in some MariaDB 11.7 images) to mysqladmin ping which is more robust.
…THCHECK The mariadb:11.7 Docker image ships with a HEALTHCHECK instruction. GitHub Actions automatically waits for it when no custom options override it. Custom health-cmd variants (healthcheck.sh, mysqladmin) were failing because the slim runner environment handles them differently.
anakin87
left a comment
There was a problem hiding this comment.
I took a first look and found some points to address and some others to discuss.
|
Addressed all the straightforward review comments. The HNSW index design ( |
anakin87
left a comment
There was a problem hiding this comment.
There are still some comments to address.
Please request my review when they are fixed. In the meantime, ask questions if needed.
93e2728 to
8f91d92
Compare
|
ruff auto-detects |
|
I mistakently Referenced some PRs here , Well I have cleaned the mess the Code is opened for review |
| filters: dict[str, Any] | None = None, | ||
| top_k: int = 10, | ||
| score_threshold: float | None = None, | ||
| vector_function: str | None = None, |
There was a problem hiding this comment.
Searches using a different distance function will not be able to use a vector index
I'd simply not allow users to change the distance function at runtime, in other words by removing this parameter
There was a problem hiding this comment.
Sorry for the misunderstanding. I meant:
- let's make
distanceconfigurable inMariaDBDocumentStore.__init__and take this parameter into account only when the table is created - do not expose
distancein_embedding_retrieval
anakin87
left a comment
There was a problem hiding this comment.
There are still a few rough edges to address in this PR, including some points that were left unresolved from the previous review.
Since this is a new integration, I'd like to see a more thorough pass: try it yourself, refine the implementation, and make sure to address the existing feedback.
Otherwise, I may need to deprioritize further review.
|
Hi @anakin87 , I've addressed all of your review comments:
I also verified everything against a real MariaDB 11.7 Docker instance all 120 tests are passing (65 unit + 55 integration). |
| # skip-install prevents hatch from installing the project (and thus the mariadb C extension) | ||
| # in the docs environment. The pydoc search_path points to src/ so modules are found directly. | ||
| skip-install = true | ||
| dependencies = ["haystack-pydoc-tools", "ruff", "haystack-ai>=2.28.0"] |
There was a problem hiding this comment.
| # skip-install prevents hatch from installing the project (and thus the mariadb C extension) | |
| # in the docs environment. The pydoc search_path points to src/ so modules are found directly. | |
| skip-install = true | |
| dependencies = ["haystack-pydoc-tools", "ruff", "haystack-ai>=2.28.0"] | |
| dependencies = ["haystack-pydoc-tools", "ruff"] |
| filters: dict[str, Any] | None = None, | ||
| top_k: int = 10, | ||
| score_threshold: float | None = None, | ||
| vector_function: str | None = None, |
There was a problem hiding this comment.
Sorry for the misunderstanding. I meant:
- let's make
distanceconfigurable inMariaDBDocumentStore.__init__and take this parameter into account only when the table is created - do not expose
distancein_embedding_retrieval
| value: Any = condition["value"] | ||
| sql_field = _build_field_expr(field, value) | ||
| clause, val = COMPARISON_OPERATORS[operator](sql_field, value) | ||
| # _in/_not_in return the value list directly; flatten it so params stay flat |
There was a problem hiding this comment.
currently boolean meta filters seem to match nothing.
Try for example the condition {"field": "meta.flag", "operator": "==", "value": True}
| :param score_threshold: Minimum score to include a document. Documents below this score are excluded. | ||
| :returns: List of Documents ordered by similarity (most similar first). | ||
| """ | ||
| _validate_filters(filters) |
There was a problem hiding this comment.
MariaDB does not raise an error if the query_embedding does not match the default embedding dimension but just returns records with null score. I propose raising an error ourselves.
|
I did all the testing against MariaDB 11.7via Docker |
Summary
Part of #2340
Implements a complete MariaDB document store integration using MariaDB 11.7+ native
VECTORsupport.MariaDBDocumentStorefull DocumentStore protocol (write_documents,filter_documents,delete_documents,count_documents)VEC_DISTANCE_COSINE/VEC_DISTANCE_EUCLIDEANwithMHNSWindexingMATCH ... AGAINST (IN NATURAL LANGUAGE MODE)on aFULLTEXTindexJSON_UNQUOTE(JSON_EXTRACT(...))SQL expressions with parameterized queriesMariaDBEmbeddingRetrieverandMariaDBKeywordRetrieverwithFilterPolicysupportDuplicatePolicysupport:FAIL(INSERT),OVERWRITE(upsert viaON DUPLICATE KEY UPDATE),SKIP(INSERT IGNORE)Tests
80 tests total all passing:
CI
Added
.github/workflows/mariadb.ymlwith a MariaDB 11.7 service container, matching the pattern used bypgvector.How to run locally