From 120e836f4ec50c08fdd184af00fa277dc07d3b18 Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Fri, 12 Jul 2024 16:18:23 +0200 Subject: [PATCH 1/2] don't allow queries for both normal and advanced search to be combined fixes #1861 --- peachjam_search/views.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/peachjam_search/views.py b/peachjam_search/views.py index 504913272..a1e9a230b 100644 --- a/peachjam_search/views.py +++ b/peachjam_search/views.py @@ -109,14 +109,18 @@ def filter_queryset(self, request, queryset, view): must_queries.extend(self.build_per_field_queries(request, view)) should_queries = [] - should_queries.extend(self.build_basic_queries(request, view)) - should_queries.extend(self.build_content_phrase_queries(request, view)) - should_queries.extend(self.build_nested_page_queries(request, view)) - should_queries.extend(self.build_nested_provision_queries(request, view)) - - # these handle advanced search - must_queries.extend(self.build_advanced_all_queries(request, view)) - must_queries.extend(self.build_advanced_content_queries(request, view)) + if self.is_advanced_search(request, view): + # these handle advanced search, and can't be combined with advanced search because they both + # build queries to return nested content, and ES complains if multiple queries try to return the + # same nested content fields + must_queries.extend(self.build_advanced_all_queries(request, view)) + must_queries.extend(self.build_advanced_content_queries(request, view)) + else: + # these handle basic search + should_queries.extend(self.build_basic_queries(request, view)) + should_queries.extend(self.build_content_phrase_queries(request, view)) + should_queries.extend(self.build_nested_page_queries(request, view)) + should_queries.extend(self.build_nested_provision_queries(request, view)) return queryset.query( "bool", @@ -125,6 +129,13 @@ def filter_queryset(self, request, queryset, view): minimum_should_match=1 if should_queries else 0, ) + def is_advanced_search(self, request, view): + # it's an advanced search if any of the search__* query parameters are present + return any( + request.query_params.get(self.search_param + "__" + field) + for field in list(view.search_fields.keys()) + ["all"] + ) + def build_rank_feature_queries(self, request, view): """Apply a rank_feature query to boost the score based on the ranking field.""" if pj_settings().pagerank_boost_value: From bb5b5bd91a787191c50383ec95d83683fb3c00b8 Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Mon, 15 Jul 2024 09:18:12 +0200 Subject: [PATCH 2/2] Update peachjam_search/views.py Co-authored-by: actlikewill --- peachjam_search/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/peachjam_search/views.py b/peachjam_search/views.py index a1e9a230b..f22d1def2 100644 --- a/peachjam_search/views.py +++ b/peachjam_search/views.py @@ -110,7 +110,7 @@ def filter_queryset(self, request, queryset, view): should_queries = [] if self.is_advanced_search(request, view): - # these handle advanced search, and can't be combined with advanced search because they both + # these handle advanced search, and can't be combined with normal search because they both # build queries to return nested content, and ES complains if multiple queries try to return the # same nested content fields must_queries.extend(self.build_advanced_all_queries(request, view))