Skip to content

Commit 036f209

Browse files
authored
milvus: create TextNode if no '_node_content' set (#19772)
1 parent 918b4e1 commit 036f209

File tree

3 files changed

+90
-11
lines changed

3 files changed

+90
-11
lines changed

llama-index-integrations/vector_stores/llama-index-vector-stores-milvus/llama_index/vector_stores/milvus/base.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from llama_index.core.bridge.pydantic import Field, PrivateAttr
1414
from llama_index.core.indices.query.embedding_utils import get_top_k_mmr_embeddings
15-
from llama_index.core.schema import BaseNode
15+
from llama_index.core.schema import BaseNode, TextNode
1616
from llama_index.core.utils import iter_batch
1717
from llama_index.vector_stores.milvus.utils import (
1818
get_default_sparse_embedding_function,
@@ -688,7 +688,17 @@ def get_nodes(
688688
"The passed in text_key value does not exist "
689689
"in the retrieved entity."
690690
)
691-
node = metadata_dict_to_node(item, text=text_content)
691+
if "_node_content" in item:
692+
node = metadata_dict_to_node(item, text=text_content)
693+
elif text_content:
694+
node = TextNode(
695+
text=text_content,
696+
metadata={key: item.get(key) for key in self.output_fields},
697+
)
698+
else:
699+
raise ValueError(
700+
"Node content not found in metadata dict and no text content found."
701+
)
692702
node.embedding = item.get(self.embedding_field, None)
693703
nodes.append(node)
694704
return nodes
@@ -721,7 +731,17 @@ async def aget_nodes(
721731
"The passed in text_key value does not exist "
722732
"in the retrieved entity."
723733
)
724-
node = metadata_dict_to_node(item, text=text_content)
734+
if "_node_content" in item:
735+
node = metadata_dict_to_node(item, text=text_content)
736+
elif text_content:
737+
node = TextNode(
738+
text=text_content,
739+
metadata={key: item.get(key) for key in self.output_fields},
740+
)
741+
else:
742+
raise ValueError(
743+
"Node content not found in metadata dict and no text content found."
744+
)
725745
node.embedding = item.get(self.embedding_field, None)
726746
nodes.append(node)
727747
return nodes
@@ -1412,13 +1432,18 @@ def _parse_from_milvus_results(
14121432
ids = []
14131433
# Parse the results
14141434
for hit in results[0]:
1415-
metadata = {
1416-
"_node_content": hit["entity"].get("_node_content", None),
1417-
"_node_type": hit["entity"].get("_node_type", None),
1418-
}
1419-
for key in self.output_fields:
1420-
metadata[key] = hit["entity"].get(key)
1421-
node = metadata_dict_to_node(metadata)
1435+
if "_node_content" in hit["entity"]:
1436+
metadata = {
1437+
"_node_content": hit["entity"].get("_node_content", None),
1438+
"_node_type": hit["entity"].get("_node_type", None),
1439+
}
1440+
for key in self.output_fields:
1441+
metadata[key] = hit["entity"].get(key)
1442+
node = metadata_dict_to_node(metadata)
1443+
else:
1444+
node = TextNode(
1445+
metadata={key: hit["entity"].get(key) for key in self.output_fields}
1446+
)
14221447

14231448
# Set the text field if it exists
14241449
if self.text_key in hit["entity"]:

llama-index-integrations/vector_stores/llama-index-vector-stores-milvus/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ dev = [
2727

2828
[project]
2929
name = "llama-index-vector-stores-milvus"
30-
version = "0.9.0"
30+
version = "0.9.1"
3131
description = "llama-index vector_stores milvus integration"
3232
authors = []
3333
requires-python = ">=3.9,<4.0"

llama-index-integrations/vector_stores/llama-index-vector-stores-milvus/tests/test_vector_stores_milvus.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import List, Dict
22

3+
import pymilvus
34
import pytest
45

56
from llama_index.core.schema import TextNode, NodeRelationship, RelatedNodeInfo
@@ -765,3 +766,56 @@ def test_query_hybrid_mode():
765766
assert len(result.nodes) == 1
766767
assert result.nodes[0].id_ == "n1"
767768
assert result.nodes[0].text == "n1_text"
769+
770+
771+
def test_custom_node_format():
772+
milvus_db_uri = "./milvus_llamaindex_custom_format.db"
773+
client = pymilvus.MilvusClient(
774+
uri=milvus_db_uri,
775+
)
776+
if COLLECTION_NAME in client.list_collections():
777+
client.drop_collection(COLLECTION_NAME)
778+
client.create_collection(
779+
collection_name=COLLECTION_NAME,
780+
dimension=DIM,
781+
primary_field_name="id",
782+
vector_field_name="embedding",
783+
metric_type="COSINE",
784+
auto_id=True,
785+
)
786+
vector_store = MilvusVectorStore(
787+
uri=milvus_db_uri,
788+
collection_name=COLLECTION_NAME,
789+
dim=DIM,
790+
doc_id_field="id",
791+
embedding_field="embedding",
792+
text_key="custom_text",
793+
output_fields=["custom_meta"],
794+
)
795+
vector_store.client.insert(
796+
COLLECTION_NAME,
797+
data=[
798+
{
799+
"embedding": [0.5] * DIM,
800+
"custom_text": "n1_text",
801+
"custom_meta": "n1_meta",
802+
},
803+
{
804+
"embedding": [-0.5] * DIM,
805+
"custom_text": "n2_text",
806+
"custom_meta": "n2_meta",
807+
},
808+
],
809+
)
810+
811+
query = VectorStoreQuery(query_embedding=[0.5] * DIM, similarity_top_k=1)
812+
result = vector_store.query(query=query)
813+
assert len(result.nodes) == 1
814+
assert result.nodes[0].text == "n1_text"
815+
assert result.nodes[0].metadata.get("custom_meta") == "n1_meta"
816+
817+
query = VectorStoreQuery(query_embedding=[-0.5] * DIM, similarity_top_k=1)
818+
result = vector_store.query(query=query)
819+
assert len(result.nodes) == 1
820+
assert result.nodes[0].text == "n2_text"
821+
assert result.nodes[0].metadata.get("custom_meta") == "n2_meta"

0 commit comments

Comments
 (0)