diff --git a/mem0/vector_stores/milvus.py b/mem0/vector_stores/milvus.py index 748553ccc..e6e056bf1 100644 --- a/mem0/vector_stores/milvus.py +++ b/mem0/vector_stores/milvus.py @@ -159,7 +159,10 @@ class MilvusDB(VectorStoreBase): for key, value in filters.items(): if not self._SAFE_FILTER_KEY.match(key): raise ValueError(f"Invalid filter key: {key!r}") - if isinstance(value, str): + if value == "*": + # Wildcard - match any value (MilvusDB doesn't have direct wildcard, so we skip this filter) + continue + elif isinstance(value, str): escaped = value.replace("\\", "\\\\").replace('"', '\\"') operands.append(f'(metadata["{key}"] == "{escaped}")') elif isinstance(value, (int, float, bool)): diff --git a/tests/vector_stores/test_milvus.py b/tests/vector_stores/test_milvus.py index e17aa3b67..517b3ad04 100644 --- a/tests/vector_stores/test_milvus.py +++ b/tests/vector_stores/test_milvus.py @@ -107,6 +107,14 @@ class TestMilvusDB: assert 'metadata["category"] == "work"' in filter_str assert ' and ' in filter_str + def test_create_filter_wildcard_conditions(self, milvus_db): + """Test filter creation with wildcard conditions.""" + filters = {"user_id": "alice", "run_id": "*"} + filter_str = milvus_db._create_filter(filters) + + assert 'metadata["user_id"] == "alice"' in filter_str + assert 'metadata["run_id"] == "*"' not in filter_str + def test_search_with_filters(self, milvus_db, mock_milvus_client): """Test search with metadata filters (reproduces user's bug scenario).""" # Setup mock return value