Skip to content

Commit 2b3af23

Browse files
committed
feat: add ensure payload index exists in qdrant
1 parent 521b27f commit 2b3af23

File tree

3 files changed

+33
-16
lines changed

3 files changed

+33
-16
lines changed

src/memos/graph_dbs/neo4j_community.py

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -270,24 +270,14 @@ def _create_basic_property_indexes(self) -> None:
270270
except Exception as e:
271271
logger.warning(f"Failed to create basic property indexes: {e}")
272272

273-
# Step 2: Qdrant payload indexes
273+
# Step 2: VectorDB indexes
274274
try:
275-
# Qdrant supports `create_payload_index`, which is idempotent
276-
self.vec_db.client.create_payload_index(
277-
collection_name=self.vec_db.config.collection_name,
278-
field_name="user_name",
279-
field_schema="keyword",
280-
)
281-
logger.debug("Qdrant payload index on 'user_name' ensured.")
282-
283-
self.vec_db.client.create_payload_index(
284-
collection_name=self.vec_db.config.collection_name,
285-
field_name="memory_type",
286-
field_schema="keyword",
287-
)
288-
logger.debug("Qdrant payload index on 'memory_type' ensured.")
275+
if hasattr(self.vec_db, "ensure_payload_indexes"):
276+
self.vec_db.ensure_payload_indexes(["user_name", "memory_type"])
277+
else:
278+
logger.debug("VecDB does not support payload index creation; skipping.")
289279
except Exception as e:
290-
logger.warning(f"Failed to create Qdrant payload indexes: {e}")
280+
logger.warning(f"Failed to create VecDB payload indexes: {e}")
291281

292282
def _parse_node(self, node_data: dict[str, Any]) -> dict[str, Any]:
293283
"""Parse Neo4j node and optionally fetch embedding from vector DB."""

src/memos/vec_dbs/base.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,11 @@ def upsert(self, data: list[VecDBItem | dict[str, Any]]) -> None:
107107
@abstractmethod
108108
def delete(self, ids: list[str]) -> None:
109109
"""Delete items from the vector database."""
110+
111+
@abstractmethod
112+
def ensure_payload_indexes(self, fields: list[str]) -> None:
113+
"""
114+
Create payload indexes for specified fields in the collection.
115+
Args:
116+
fields (list[str]): List of field names to index (as keyword).
117+
"""

src/memos/vec_dbs/qdrant.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,25 @@ def update(self, id: str, data: VecDBItem | dict[str, Any]) -> None:
278278
collection_name=self.config.collection_name, payload=data.payload, points=[id]
279279
)
280280

281+
def ensure_payload_indexes(self, fields: list[str]) -> None:
282+
"""
283+
Create payload indexes for specified fields in the collection.
284+
This is idempotent: it will skip if index already exists.
285+
286+
Args:
287+
fields (list[str]): List of field names to index (as keyword).
288+
"""
289+
for field in fields:
290+
try:
291+
self.client.create_payload_index(
292+
collection_name=self.config.collection_name,
293+
field_name=field,
294+
field_schema="keyword", # Could be extended in future
295+
)
296+
logger.debug(f"Qdrant payload index on '{field}' ensured.")
297+
except Exception as e:
298+
logger.warning(f"Failed to create payload index on '{field}': {e}")
299+
281300
def upsert(self, data: list[VecDBItem | dict[str, Any]]) -> None:
282301
"""
283302
Add or update data in the vector database.

0 commit comments

Comments
 (0)