@@ -112,11 +112,39 @@ def insert_one(cls, doc_id: int, vector, meta_conditions):
112112 else :
113113 vec_param = vector
114114
115- doc = {"vector" : vec_param }
116- if meta_conditions :
117- for k , v in meta_conditions .items ():
118- doc [k ] = str (v )
115+ # Process metadata exactly like upload_batch does
116+ meta = meta_conditions if meta_conditions else {}
117+ geopoints = {}
118+ payload = {}
119+
120+ if meta is not None :
121+ for k , v in meta .items ():
122+ # This is a patch for arxiv-titles dataset where we have a list of "labels", and
123+ # we want to index all of them under the same TAG field (whose separator is ';').
124+ if k == "labels" :
125+ payload [k ] = ";" .join (v )
126+ if (
127+ v is not None
128+ and not isinstance (v , dict )
129+ and not isinstance (v , list )
130+ ):
131+ payload [k ] = v
132+ # Redis treats geopoints differently and requires putting them as
133+ # a comma-separated string with lat and lon coordinates
134+ from engine .clients .redis .helper import convert_to_redis_coords
135+ geopoints = {
136+ k : "," .join (map (str , convert_to_redis_coords (v ["lon" ], v ["lat" ])))
137+ for k , v in meta .items ()
138+ if isinstance (v , dict )
139+ }
119140
120- print (f"DEBUG: Redis inserting doc_id={ doc_id } , vector_size={ len (vec_param )} bytes" )
121- cls .client .hset (str (doc_id ), mapping = doc )
122- print (f"DEBUG: Redis insert complete for doc_id={ doc_id } " )
141+ #print(f"DEBUG: Redis inserting doc_id={doc_id}, vector_size={len(vec_param)} bytes")
142+ cls .client .hset (
143+ str (doc_id ),
144+ mapping = {
145+ "vector" : vec_param ,
146+ ** payload ,
147+ ** geopoints ,
148+ },
149+ )
150+ #print(f"DEBUG: Redis insert complete for doc_id={doc_id}")
0 commit comments