diff --git a/docs/guide/text-indexes.rst b/docs/guide/text-indexes.rst index 9101b524..b597d957 100644 --- a/docs/guide/text-indexes.rst +++ b/docs/guide/text-indexes.rst @@ -43,5 +43,7 @@ Next, start a text search using :attr:`QuerySet.search_text` method:: document.title # may be: "MongoEngine 0.9 released" +Ordering by text score +====================== - + objects = News.objects.search('mongo').order_by('$text_score') diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 74b99619..c12f9553 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -1549,6 +1549,13 @@ class BaseQuerySet(object): for key in keys: if not key: continue + + if key == '$text_score': + # automatically set to include text scores + self._include_text_scores = True + key_list.append(('text_score', {'$meta': "textScore"})) + continue + direction = pymongo.ASCENDING if key[0] == '-': direction = pymongo.DESCENDING diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index bb24d086..1d3e8048 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -2791,6 +2791,28 @@ class QuerySetTest(unittest.TestCase): self.assertTrue(isinstance(new.text_score, float)) + # count + query = News.objects.search_text('brasil').order_by('$text_score') + self.assertTrue(query._include_text_scores) + + self.assertEqual(query.count(), 3) + self.assertEqual(query._query, {'$text': {'$search': 'brasil'}}) + cursor_args = query._cursor_args + self.assertEqual( + cursor_args['fields'], {'text_score': {'$meta': 'textScore'}}) + + text_scores = [i.text_score for i in query] + self.assertEqual(len(text_scores), 3) + + self.assertTrue(text_scores[0] > text_scores[1]) + self.assertTrue(text_scores[1] > text_scores[2]) + max_text_score = text_scores[0] + + # get item + item = News.objects.search_text( + 'brasil').order_by('$text_score').first() + self.assertEqual(item.text_score, max_text_score) + @skip_older_mongodb def test_distinct_handles_references_to_alias(self): register_connection('testdb', 'mongoenginetest2')