Skip to content

Commit 74ed600

Browse files
author
Cosimo Streppone
committed
delete(): allow batch delete by id
In order to speed up batch deletes, Solr supports sending multiple document id values in a single command: <doc> <id>3</id> <id>14</id> <id>15</id> <id>62</id> </doc>
1 parent e8b0c0a commit 74ed600

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

README.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,12 @@ Basic usage looks like:
9292
# correctly.
9393
similar = solr.more_like_this(q='id:doc_2', mltfl='text')
9494
95-
# Finally, you can delete either individual documents...
95+
# Finally, you can delete either individual documents,
9696
solr.delete(id='doc_1')
9797
98+
# also in batches...
99+
solr.delete(id=['doc_1', 'doc_2'])
100+
98101
# ...or all documents.
99102
solr.delete(q='*:*')
100103

pysolr.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,8 @@ def delete(self, id=None, q=None, commit=True, waitFlush=None, waitSearcher=None
803803
Deletes documents.
804804
805805
Requires *either* ``id`` or ``query``. ``id`` is if you know the
806-
specific document id to remove. ``query`` is a Lucene-style query
806+
specific document id to remove. Note that ``id`` can also be a list of
807+
document ids to be deleted. ``query`` is a Lucene-style query
807808
indicating a collection of documents to delete.
808809
809810
Optionally accepts ``commit``. Default is ``True``.
@@ -815,6 +816,7 @@ def delete(self, id=None, q=None, commit=True, waitFlush=None, waitSearcher=None
815816
Usage::
816817
817818
solr.delete(id='doc_12')
819+
solr.delete(id=['doc_1', 'doc_3'])
818820
solr.delete(q='*:*')
819821
820822
"""
@@ -823,7 +825,12 @@ def delete(self, id=None, q=None, commit=True, waitFlush=None, waitSearcher=None
823825
elif id is not None and q is not None:
824826
raise ValueError('You many only specify "id" OR "q", not both.')
825827
elif id is not None:
826-
m = '<delete><id>%s</id></delete>' % id
828+
m = '<delete>'
829+
if type(id) not in (list, set):
830+
id = [ id ]
831+
for i in id:
832+
m += '<id>%s</id>' % i
833+
m += '</delete>'
827834
elif q is not None:
828835
m = '<delete><query>%s</query></delete>' % q
829836

tests/client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,14 @@ def test_delete(self):
455455
self.solr.delete(q='*:*')
456456
self.assertEqual(len(self.solr.search('*:*')), 0)
457457

458+
# Try delete with a list of document ids
459+
self.solr.add(self.docs)
460+
self.solr.commit()
461+
self.assertEqual(len(self.solr.search('*:*')), len(self.docs))
462+
to_delete = [doc['id'] for doc in self.docs]
463+
self.solr.delete(id=to_delete)
464+
self.assertEqual(len(self.solr.search('*:*')), 0)
465+
458466
# Need at least one.
459467
self.assertRaises(ValueError, self.solr.delete)
460468
# Can't have both.

0 commit comments

Comments
 (0)