Skip to content

Commit 30c0108

Browse files
committed
added ordering support for text queries
1 parent 89825a2 commit 30c0108

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

docs/guide/text-indexes.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,7 @@ Next, start a text search using :attr:`QuerySet.search_text` method::
4343
document.title # may be: "MongoEngine 0.9 released"
4444

4545

46+
Ordering by text score
47+
======================
4648

47-
49+
objects = News.objects.search('mongo').order_by('$text_score')

mongoengine/queryset/base.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,6 +1549,13 @@ def _get_order_by(self, keys):
15491549
for key in keys:
15501550
if not key:
15511551
continue
1552+
1553+
if key == '$text_score':
1554+
# automatically set to include text scores
1555+
self._include_text_scores = True
1556+
key_list.append(('text_score', {'$meta': "textScore"}))
1557+
continue
1558+
15521559
direction = pymongo.ASCENDING
15531560
if key[0] == '-':
15541561
direction = pymongo.DESCENDING

tests/queryset/queryset.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2791,6 +2791,28 @@ class News(Document):
27912791

27922792
self.assertTrue(isinstance(new.text_score, float))
27932793

2794+
# count
2795+
query = News.objects.search_text('brasil').order_by('$text_score')
2796+
self.assertTrue(query._include_text_scores)
2797+
2798+
self.assertEqual(query.count(), 3)
2799+
self.assertEqual(query._query, {'$text': {'$search': 'brasil'}})
2800+
cursor_args = query._cursor_args
2801+
self.assertEqual(
2802+
cursor_args['fields'], {'text_score': {'$meta': 'textScore'}})
2803+
2804+
text_scores = [i.text_score for i in query]
2805+
self.assertEqual(len(text_scores), 3)
2806+
2807+
self.assertTrue(text_scores[0] > text_scores[1])
2808+
self.assertTrue(text_scores[1] > text_scores[2])
2809+
max_text_score = text_scores[0]
2810+
2811+
# get item
2812+
item = News.objects.search_text(
2813+
'brasil').order_by('$text_score').first()
2814+
self.assertEqual(item.text_score, max_text_score)
2815+
27942816
@skip_older_mongodb
27952817
def test_distinct_handles_references_to_alias(self):
27962818
register_connection('testdb', 'mongoenginetest2')

0 commit comments

Comments
 (0)