44from wagtail .models import Site
55from wagtail .search .index import class_is_indexed
66from wagtail .search .models import Query
7+ from wagtail .search .utils import parse_query_string
78
89from .settings import grapple_settings
910from .types .structures import BasePaginatedType , PaginationType
@@ -62,6 +63,8 @@ def resolve_queryset(
6263 id = None ,
6364 order = None ,
6465 collection = None ,
66+ search_operator = "and" ,
67+ search_fields = None ,
6568 ** kwargs ,
6669):
6770 """
@@ -112,7 +115,14 @@ def resolve_queryset(
112115 query = Query .get (search_query )
113116 query .add_hit ()
114117
115- qs = qs .search (search_query , order_by_relevance = order_by_relevance )
118+ filters , parsed_query = parse_query_string (search_query , search_operator )
119+
120+ qs = qs .search (
121+ parsed_query ,
122+ order_by_relevance = order_by_relevance ,
123+ operator = search_operator ,
124+ fields = search_fields ,
125+ )
116126 if connection .vendor != "sqlite" :
117127 qs = qs .annotate_score ("search_score" )
118128
@@ -153,7 +163,16 @@ def get_paginated_result(qs, page, per_page):
153163
154164
155165def resolve_paginated_queryset (
156- qs , info , page = None , per_page = None , search_query = None , id = None , order = None , ** kwargs
166+ qs ,
167+ info ,
168+ page = None ,
169+ per_page = None ,
170+ id = None ,
171+ order = None ,
172+ search_query = None ,
173+ search_operator = "and" ,
174+ search_fields = None ,
175+ ** kwargs ,
157176):
158177 """
159178 Add page, per_page and search capabilities to the query. This contains
@@ -167,11 +186,16 @@ def resolve_paginated_queryset(
167186 :type id: int
168187 :param per_page: The maximum number of items to include on a page.
169188 :type per_page: int
189+ :param order: Order the query set using the Django QuerySet order_by format.
190+ :type order: str
170191 :param search_query: Using Wagtail search, exclude objects that do not match
171192 the search query.
172193 :type search_query: str
173- :param order: Order the query set using the Django QuerySet order_by format.
174- :type order: str
194+ :param search_operator: The operator to use when combining search terms.
195+ Defaults to "and".
196+ :type search_operator: "and" | "or"
197+ :param search_fields: A list of fields to search. Defaults to all fields.
198+ :type search_fields: list
175199 """
176200 page = int (page or 1 )
177201 per_page = min (
@@ -199,7 +223,14 @@ def resolve_paginated_queryset(
199223 query = Query .get (search_query )
200224 query .add_hit ()
201225
202- qs = qs .search (search_query , order_by_relevance = order_by_relevance )
226+ filters , parsed_query = parse_query_string (search_query , search_operator )
227+
228+ qs = qs .search (
229+ parsed_query ,
230+ order_by_relevance = order_by_relevance ,
231+ operator = search_operator ,
232+ fields = search_fields ,
233+ )
203234 if connection .vendor != "sqlite" :
204235 qs = qs .annotate_score ("search_score" )
205236
0 commit comments