Skip to content

Commit d086416

Browse files
Perform adds with field updates using JSON
1 parent 76c77e3 commit d086416

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

pysolr.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)