Skip to content

Commit 985a3e3

Browse files
authored
feat: add searchScore field to pages (#320)
1 parent 7c32128 commit 985a3e3

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed

example/example/tests/test_grapple.py

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -440,26 +440,63 @@ def setUpTestData(cls):
440440

441441
@unittest.skipIf(
442442
connection.vendor != "sqlite",
443-
"sqlite doesn't support scoring so natural order will be in the order of defintion",
443+
"sqlite doesn't support annotating scores, so search results order will be in the order of defintion",
444444
)
445-
def test_natural_order_sqlite(self):
445+
def test_searchQuery_order_by_relevance_sqlite(self):
446446
query = """
447447
query($searchQuery: String, $order: String) {
448448
pages(searchQuery: $searchQuery, order: $order) {
449449
title
450+
searchScore
450451
}
451452
}
452453
"""
454+
453455
executed = self.client.execute(query, variables={"searchQuery": "Alpha"})
454456
page_data = executed["data"].get("pages")
455-
456457
self.assertEquals(len(page_data), 6)
457458
self.assertEquals(page_data[0]["title"], "Alpha")
459+
self.assertEquals(page_data[0]["searchScore"], None)
458460
self.assertEquals(page_data[1]["title"], "Alpha Alpha")
461+
self.assertEquals(page_data[1]["searchScore"], None)
459462
self.assertEquals(page_data[2]["title"], "Alpha Beta")
463+
self.assertEquals(page_data[2]["searchScore"], None)
460464
self.assertEquals(page_data[3]["title"], "Alpha Gamma")
465+
self.assertEquals(page_data[3]["searchScore"], None)
461466
self.assertEquals(page_data[4]["title"], "Beta Alpha")
467+
self.assertEquals(page_data[4]["searchScore"], None)
462468
self.assertEquals(page_data[5]["title"], "Gamma Alpha")
469+
self.assertEquals(page_data[5]["searchScore"], None)
470+
471+
@unittest.skipIf(
472+
connection.vendor == "sqlite",
473+
"non-sqlite database backends should support annotating search score, so results should be orderd by score by default",
474+
)
475+
def test_searchQuery_order_by_relevance(self):
476+
query = """
477+
query($searchQuery: String, $order: String) {
478+
pages(searchQuery: $searchQuery, order: $order) {
479+
title
480+
searchScore
481+
}
482+
}
483+
"""
484+
485+
executed = self.client.execute(query, variables={"searchQuery": "Alpha"})
486+
page_data = executed["data"].get("pages")
487+
self.assertEquals(len(page_data), 6)
488+
self.assertEquals(page_data[0]["title"], "Alpha Alpha")
489+
self.assertEquals(page_data[0]["searchScore"], 0.23700128495693207)
490+
self.assertEquals(page_data[1]["title"], "Alpha")
491+
self.assertEquals(page_data[1]["searchScore"], 0.18960101902484894)
492+
self.assertEquals(page_data[2]["title"], "Gamma Alpha")
493+
self.assertEquals(page_data[2]["searchScore"], 0.11060059443116188)
494+
self.assertEquals(page_data[3]["title"], "Beta Alpha")
495+
self.assertEquals(page_data[3]["searchScore"], 0.11060059443116188)
496+
self.assertEquals(page_data[4]["title"], "Alpha Gamma")
497+
self.assertEquals(page_data[4]["searchScore"], 0.11060059443116188)
498+
self.assertEquals(page_data[5]["title"], "Alpha Beta")
499+
self.assertEquals(page_data[5]["searchScore"], 0.10533389945824942)
463500

464501
def test_explicit_order(self):
465502
query = """
@@ -476,9 +513,9 @@ def test_explicit_order(self):
476513

477514
self.assertEquals(len(page_data), 6)
478515
self.assertEquals(page_data[0]["title"], "Gamma Gamma")
479-
self.assertEquals(page_data[3]["title"], "Gamma")
480516
self.assertEquals(page_data[1]["title"], "Gamma Beta")
481517
self.assertEquals(page_data[2]["title"], "Gamma Alpha")
518+
self.assertEquals(page_data[3]["title"], "Gamma")
482519
self.assertEquals(page_data[4]["title"], "Beta Gamma")
483520
self.assertEquals(page_data[5]["title"], "Alpha Gamma")
484521

grapple/types/pages.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ class PageInterface(graphene.Interface):
5656
graphene.NonNull(lambda: PageInterface), enable_search=True, required=True
5757
)
5858

59+
search_score = graphene.Float()
60+
5961
@classmethod
6062
def resolve_type(cls, instance, info, **kwargs):
6163
"""
@@ -149,6 +151,12 @@ def resolve_seo_title(self, info, **kwargs):
149151
"""
150152
return self.seo_title or self.title
151153

154+
def resolve_search_score(self, info, **kwargs):
155+
"""
156+
Get page's search score, will be None if not in a search context.
157+
"""
158+
return getattr(self, "search_score", None)
159+
152160

153161
class Page(DjangoObjectType):
154162
"""

grapple/utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.conf import settings
22
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
3+
from django.db import connection
34
from wagtail.models import Site
45
from wagtail.search.index import class_is_indexed
56
from wagtail.search.models import Query
@@ -112,6 +113,8 @@ def resolve_queryset(
112113
query.add_hit()
113114

114115
qs = qs.search(search_query, order_by_relevance=order_by_relevance)
116+
if connection.vendor != "sqlite":
117+
qs = qs.annotate_score("search_score")
115118

116119
return _sliced_queryset(qs, limit, offset)
117120

@@ -197,6 +200,8 @@ def resolve_paginated_queryset(
197200
query.add_hit()
198201

199202
qs = qs.search(search_query, order_by_relevance=order_by_relevance)
203+
if connection.vendor != "sqlite":
204+
qs = qs.annotate_score("search_score")
200205

201206
return get_paginated_result(qs, page, per_page)
202207

0 commit comments

Comments
 (0)