mirror of
https://github.com/django/django.git
synced 2025-07-16 01:35:15 +00:00
Fixed #28194 -- Added support for normalization and cover density to SearchRank.
This commit is contained in:
parent
4ed534758c
commit
0b51a4f894
4 changed files with 106 additions and 3 deletions
|
@ -6,7 +6,7 @@ All text copyright Python (Monty) Pictures. Thanks to sacred-texts.com for the
|
|||
transcript.
|
||||
"""
|
||||
from django.db import connection
|
||||
from django.db.models import F
|
||||
from django.db.models import F, Value
|
||||
from django.test import modify_settings, skipUnlessDBFeature
|
||||
|
||||
from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase
|
||||
|
@ -449,6 +449,66 @@ class TestRankingAndWeights(GrailTestData, PostgreSQLTestCase):
|
|||
).filter(rank__gt=0.3)
|
||||
self.assertSequenceEqual(searched, [self.verse0])
|
||||
|
||||
def test_cover_density_ranking(self):
|
||||
not_dense_verse = Line.objects.create(
|
||||
scene=self.robin,
|
||||
character=self.minstrel,
|
||||
dialogue=(
|
||||
'Bravely taking to his feet, he beat a very brave retreat. '
|
||||
'A brave retreat brave Sir Robin.'
|
||||
)
|
||||
)
|
||||
searched = Line.objects.filter(character=self.minstrel).annotate(
|
||||
rank=SearchRank(
|
||||
SearchVector('dialogue'),
|
||||
SearchQuery('brave robin'),
|
||||
cover_density=True,
|
||||
),
|
||||
).order_by('rank', '-pk')
|
||||
self.assertSequenceEqual(
|
||||
searched,
|
||||
[self.verse2, not_dense_verse, self.verse1, self.verse0],
|
||||
)
|
||||
|
||||
def test_ranking_with_normalization(self):
|
||||
short_verse = Line.objects.create(
|
||||
scene=self.robin,
|
||||
character=self.minstrel,
|
||||
dialogue='A brave retreat brave Sir Robin.',
|
||||
)
|
||||
searched = Line.objects.filter(character=self.minstrel).annotate(
|
||||
rank=SearchRank(
|
||||
SearchVector('dialogue'),
|
||||
SearchQuery('brave sir robin'),
|
||||
# Divide the rank by the document length.
|
||||
normalization=2,
|
||||
),
|
||||
).order_by('rank')
|
||||
self.assertSequenceEqual(
|
||||
searched,
|
||||
[self.verse2, self.verse1, self.verse0, short_verse],
|
||||
)
|
||||
|
||||
def test_ranking_with_masked_normalization(self):
|
||||
short_verse = Line.objects.create(
|
||||
scene=self.robin,
|
||||
character=self.minstrel,
|
||||
dialogue='A brave retreat brave Sir Robin.',
|
||||
)
|
||||
searched = Line.objects.filter(character=self.minstrel).annotate(
|
||||
rank=SearchRank(
|
||||
SearchVector('dialogue'),
|
||||
SearchQuery('brave sir robin'),
|
||||
# Divide the rank by the document length and by the number of
|
||||
# unique words in document.
|
||||
normalization=Value(2).bitor(Value(8)),
|
||||
),
|
||||
).order_by('rank')
|
||||
self.assertSequenceEqual(
|
||||
searched,
|
||||
[self.verse2, self.verse1, self.verse0, short_verse],
|
||||
)
|
||||
|
||||
|
||||
class SearchVectorIndexTests(PostgreSQLTestCase):
|
||||
def test_search_vector_index(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue