@@ -916,9 +916,19 @@ def suggest_terms(self, fields, prefix, handler="terms", **kwargs):
916916 )
917917 return res
918918
919- def _build_json_doc (self , doc ):
920- cleaned_doc = {k : v for k , v in doc .items () if not self ._is_null_value (v )}
919+ def _build_json_doc (self , doc , fieldUpdates = None ):
920+ if fieldUpdates is None :
921+ cleaned_doc = {k : v for k , v in doc .items () if not self ._is_null_value (v )}
922+ else :
923+ # id must be added without a modifier
924+ # if using field updates, all other fields should have a modifier
925+ cleaned_doc = {
926+ k : {fieldUpdates [k ]: v } if k in fieldUpdates else v
927+ for k , v in doc .items ()
928+ }
929+
921930 return cleaned_doc
931+
922932
923933 def _build_xml_doc (self , doc , boost = None , fieldUpdates = None ):
924934 doc_elem = ElementTree .Element ("doc" )
@@ -1026,10 +1036,10 @@ def add(
10261036 start_time = time .time ()
10271037 self .log .debug ("Starting to build add request..." )
10281038 solrapi = "XML"
1029- # if no commands (no boost, no atomic updates ) needed use json multidocument api
1039+ # if no commands (no boost) needed use json multidocument api
10301040 # The JSON API skips the XML conversion and speedup load from 15 to 20 times.
10311041 # CPU Usage is drastically lower.
1032- if boost is None and fieldUpdates is None :
1042+ if boost is None :
10331043 solrapi = "JSON"
10341044 message = docs
10351045 # single doc convert to array of docs
@@ -1039,7 +1049,7 @@ def add(
10391049 # json array of docs
10401050 if isinstance (message , list ):
10411051 # convert to string
1042- cleaned_message = [self ._build_json_doc (doc ) for doc in message ]
1052+ cleaned_message = [self ._build_json_doc (doc , fieldUpdates = fieldUpdates ) for doc in message ]
10431053 m = self .encoder .encode (cleaned_message ).encode ("utf-8" )
10441054 else :
10451055 raise ValueError ("wrong message type" )
0 commit comments