fix(milvus): guard text field in update() with _has_bm25_schema check (#5705)
This commit is contained in:
@@ -298,10 +298,12 @@ class MilvusDB(VectorStoreBase):
|
|||||||
if payload is None:
|
if payload is None:
|
||||||
payload = existing[0].get("metadata")
|
payload = existing[0].get("metadata")
|
||||||
|
|
||||||
text = ""
|
schema = {"id": vector_id, "vectors": vector, "metadata": payload}
|
||||||
if payload:
|
if self._has_bm25_schema:
|
||||||
text = (payload.get("text_lemmatized") or payload.get("data", ""))[:65535]
|
text = ""
|
||||||
schema = {"id": vector_id, "vectors": vector, "metadata": payload, "text": text}
|
if payload:
|
||||||
|
text = (payload.get("text_lemmatized") or payload.get("data", ""))[:65535]
|
||||||
|
schema["text"] = text
|
||||||
self.client.upsert(collection_name=self.collection_name, data=schema)
|
self.client.upsert(collection_name=self.collection_name, data=schema)
|
||||||
|
|
||||||
def get(self, vector_id) -> Optional[OutputData]:
|
def get(self, vector_id) -> Optional[OutputData]:
|
||||||
|
|||||||
@@ -345,6 +345,40 @@ class TestMilvusDB:
|
|||||||
assert '(metadata["active"] == True)' in result
|
assert '(metadata["active"] == True)' in result
|
||||||
assert '(metadata["deleted"] == False)' in result
|
assert '(metadata["deleted"] == False)' in result
|
||||||
|
|
||||||
|
def test_update_omits_text_field_on_pre_v3_collection(self, mock_milvus_client):
|
||||||
|
"""update() must not include 'text' for collections without BM25 schema."""
|
||||||
|
mock_milvus_client.has_collection.return_value = True
|
||||||
|
mock_milvus_client.describe_collection.return_value = {
|
||||||
|
"fields": [
|
||||||
|
{"name": "id"},
|
||||||
|
{"name": "vectors"},
|
||||||
|
{"name": "metadata"},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
db = MilvusDB(
|
||||||
|
url="http://localhost:19530",
|
||||||
|
token="test_token",
|
||||||
|
collection_name="legacy_collection",
|
||||||
|
embedding_model_dims=1536,
|
||||||
|
metric_type=MetricType.COSINE,
|
||||||
|
db_name="test_db",
|
||||||
|
)
|
||||||
|
assert db._has_bm25_schema is False
|
||||||
|
|
||||||
|
db.update(vector_id="id1", vector=[0.1] * 1536, payload={"data": "hello"})
|
||||||
|
|
||||||
|
upserted = mock_milvus_client.upsert.call_args[1]["data"]
|
||||||
|
assert "text" not in upserted
|
||||||
|
|
||||||
|
def test_update_includes_text_field_on_v3_collection(self, milvus_db, mock_milvus_client):
|
||||||
|
"""update() must include 'text' for collections with BM25 schema."""
|
||||||
|
assert milvus_db._has_bm25_schema is True
|
||||||
|
|
||||||
|
milvus_db.update(vector_id="id1", vector=[0.1] * 1536, payload={"data": "hello"})
|
||||||
|
|
||||||
|
upserted = mock_milvus_client.upsert.call_args[1]["data"]
|
||||||
|
assert upserted["text"] == "hello"
|
||||||
|
|
||||||
def test_collection_already_exists(self, mock_milvus_client):
|
def test_collection_already_exists(self, mock_milvus_client):
|
||||||
"""Test that existing collection is not recreated."""
|
"""Test that existing collection is not recreated."""
|
||||||
mock_milvus_client.has_collection.return_value = True
|
mock_milvus_client.has_collection.return_value = True
|
||||||
|
|||||||
Reference in New Issue
Block a user