Skip to content

Commit da665f6

Browse files
committed
fix: partial matches on searches
Wagtail 5.0 removed the partial match feature of Page.objects.search but it still exists under objects.autocomplete though we also need to change how fields are indexed ref #168
1 parent f0d99cc commit da665f6

File tree

6 files changed

+28
-28
lines changed

6 files changed

+28
-28
lines changed

libraries/blog/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class Meta:
119119
verbose_name = "News article"
120120

121121
search_fields = Page.search_fields + [
122-
index.SearchField("imported_body"),
122+
index.AutocompleteField("imported_body"),
123123
]
124124

125125
content_panels = Page.content_panels + [

libraries/categories/models/pages.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ class ServicePage(Page):
107107
help_text="Defines the sort order in the parent row (lower numbers go first).",
108108
)
109109
search_fields = Page.search_fields + [
110-
index.SearchField("body"),
111-
index.SearchField("sidebar_cards"),
112-
index.SearchField("resources"),
110+
index.AutocompleteField("body"),
111+
index.AutocompleteField("sidebar_cards"),
112+
index.AutocompleteField("resources"),
113113
]
114114

115115
def category(self):
@@ -160,6 +160,7 @@ class RowComponent(Page):
160160
summary = RichTextField(features=settings.RICHTEXT_BASIC)
161161
# no need for a promote tab since slug & search_desc aren't used
162162
promote_panels = []
163+
search_fields = []
163164

164165
content_panels = Page.content_panels + [
165166
FieldPanel("summary"),
@@ -247,9 +248,9 @@ class AboutUsPage(Page):
247248
help_text="Defines the sort order in the parent row (lower numbers go first).",
248249
)
249250
search_fields = Page.search_fields + [
250-
index.SearchField("body"),
251-
index.SearchField("sidebar_cards"),
252-
index.SearchField("resources"),
251+
index.AutocompleteField("body"),
252+
index.AutocompleteField("sidebar_cards"),
253+
index.AutocompleteField("resources"),
253254
]
254255

255256
content_panels = Page.content_panels + [

libraries/categories/models/special_collections.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ def clean(self):
5858
index.RelatedFields(
5959
"special_collections",
6060
[
61-
index.SearchField("title"),
62-
index.SearchField("blurb"),
61+
index.AutocompleteField("title"),
62+
index.AutocompleteField("blurb"),
6363
],
6464
),
6565
]

libraries/exhibitions/models.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -257,19 +257,19 @@ def clean(self):
257257

258258
# index related ExhibitArtworks
259259
search_fields = Page.search_fields + [
260-
index.SearchField("description"),
261-
index.SearchField("location"),
262-
index.SearchField("dates"),
263-
index.SearchField("reception"),
264-
index.SearchField("creators"),
265-
index.SearchField("epilogue"),
260+
index.AutocompleteField("description"),
261+
index.AutocompleteField("location"),
262+
index.AutocompleteField("dates"),
263+
index.AutocompleteField("reception"),
264+
index.AutocompleteField("creators"),
265+
index.AutocompleteField("epilogue"),
266266
index.RelatedFields(
267267
"exhibit_artwork",
268268
[
269-
index.SearchField("title"),
270-
index.SearchField("creator"),
271-
index.SearchField("description"),
272-
index.SearchField("link"),
269+
index.AutocompleteField("title"),
270+
index.AutocompleteField("creator"),
271+
index.AutocompleteField("description"),
272+
index.AutocompleteField("link"),
273273
],
274274
),
275275
]

libraries/search/views.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
from wagtail.models import Page
77
from wagtail.search.models import Query
8+
from wagtail.search.query import Fuzzy
89

9-
from categories.models import RowComponent
1010
from exhibitions.models import ExhibitPage
1111

1212
logger = logging.getLogger(__name__)
@@ -53,20 +53,19 @@ def search(request):
5353
# decided against Fuzzy matching, returns too many irrelevant results
5454
# every search returns almost every page on the site
5555
# https://docs.wagtail.org/en/stable/topics/search/searching.html#fuzzy-matching
56-
search_results = (
57-
# exclude RowComponent pages
58-
Page.objects.not_type(RowComponent)
59-
.live()
60-
.search(search_query, operator="and")
61-
)
56+
# Wagtail 5.0 disabled partial matches in ES so we switched to use .autocomplete
57+
# https://docs.wagtail.org/en/stable/releases/5.0.html#elasticsearch-backend-no-longer-performs-partial-matching-on-search
58+
search_results = Page.objects.live().autocomplete(search_query, operator="and")
6259
query = Query.get(search_query)
6360
# Record hit
6461
query.add_hit()
6562
elif type == "exhibits" and search_query:
6663
# ! we don't expose exhibits search anywhere
6764
logger.info("Exhibits search, query: {}".format(search_query))
6865
search_results = (
69-
Page.objects.type(ExhibitPage).live().search(search_query, operator="and")
66+
Page.objects.type(ExhibitPage)
67+
.live()
68+
.autocomplete(search_query, operator="and")
7069
)
7170
query = Query.get(search_query)
7271
query.add_hit()

libraries/staff/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def get_related_staff_for_search(self):
131131
return "\n".join(staff_fields)
132132

133133
search_fields = Page.search_fields + [
134-
index.SearchField("get_related_staff_for_search")
134+
index.AutocompleteField("get_related_staff_for_search")
135135
]
136136

137137
class Meta:

0 commit comments

Comments
 (0)