From ccf4227af12e07bd6127c7f7f3d5abd8efb4baf9 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 10 Nov 2023 00:38:16 +0000 Subject: [PATCH] Don't add _all_text fields to remapped_fields if explicit fields are specified Also fix previously-masked issues with _compile_fuzzy_query - pass field boost, and use field_name as key instead of the Field object --- wagtail/search/backends/elasticsearch6.py | 53 +++++++++---------- .../tests/test_elasticsearch6_backend.py | 53 ++++++++----------- .../tests/test_elasticsearch7_backend.py | 53 ++++++++----------- 3 files changed, 68 insertions(+), 91 deletions(-) diff --git a/wagtail/search/backends/elasticsearch6.py b/wagtail/search/backends/elasticsearch6.py index 009e2e34a1..4a9613e3f5 100644 --- a/wagtail/search/backends/elasticsearch6.py +++ b/wagtail/search/backends/elasticsearch6.py @@ -107,41 +107,36 @@ class Elasticsearch6SearchQueryCompiler(Elasticsearch5SearchQueryCompiler): else: remapped_fields = [Field(self.mapping.all_field_name)] - models = get_indexed_models() - unique_boosts = set() - for model in models: - if not issubclass(model, self.queryset.model): - continue - for field in model.get_searchable_search_fields(): - if field.boost: - unique_boosts.add(float(field.boost)) + models = get_indexed_models() + unique_boosts = set() + for model in models: + if not issubclass(model, self.queryset.model): + continue + for field in model.get_searchable_search_fields(): + if field.boost: + unique_boosts.add(float(field.boost)) - remapped_fields.extend( - [ - Field(self.mapping.get_boost_field_name(boost), boost) - for boost in unique_boosts - ] - ) + remapped_fields.extend( + [ + Field(self.mapping.get_boost_field_name(boost), boost) + for boost in unique_boosts + ] + ) return remapped_fields def _compile_fuzzy_query(self, query, fields): - if len(fields) == 1: - return { - "match": { - fields[0]: { - "query": query.query_string, - "fuzziness": "AUTO", - } - } - } - return { - "multi_match": { - "query": query.query_string, - "fields": [field.field_name_with_boost for field in fields], - "fuzziness": "AUTO", - } + match_query = { + "query": query.query_string, + "fuzziness": "AUTO", } + if len(fields) == 1: + if fields[0].boost != 1.0: + match_query["boost"] = fields[0].boost + return {"match": {fields[0].field_name: match_query}} + else: + match_query["fields"] = [field.field_name_with_boost for field in fields] + return {"multi_match": match_query} def _compile_plaintext_query(self, query, fields, boost=1.0): match_query = {"query": query.query_string} diff --git a/wagtail/search/tests/test_elasticsearch6_backend.py b/wagtail/search/tests/test_elasticsearch6_backend.py index 8a341664fc..e0ab656cca 100644 --- a/wagtail/search/tests/test_elasticsearch6_backend.py +++ b/wagtail/search/tests/test_elasticsearch6_backend.py @@ -278,12 +278,11 @@ class TestElasticsearch6SearchQuery(TestCase): "bool": { "filter": {"match": {"content_type": "searchtests.Book"}}, "must": { - "multi_match": { - "fields": [ - "title^2.0", - "_all_text_boost_2_0^2.0", - ], - "query": "Hello", + "match": { + "title": { + "query": "Hello", + "boost": 2.0, + }, }, }, } @@ -301,13 +300,12 @@ class TestElasticsearch6SearchQuery(TestCase): "bool": { "filter": {"match": {"content_type": "searchtests.Book"}}, "must": { - "multi_match": { - "fields": [ - "title^2.0", - "_all_text_boost_2_0^2.0", - ], - "query": "Hello", - "operator": "and", + "match": { + "title": { + "query": "Hello", + "boost": 2.0, + "operator": "and", + }, }, }, } @@ -329,7 +327,6 @@ class TestElasticsearch6SearchQuery(TestCase): "fields": [ "title^2.0", "content", - "_all_text_boost_2_0^2.0", ], "query": "Hello", }, @@ -356,7 +353,6 @@ class TestElasticsearch6SearchQuery(TestCase): "fields": [ "title^2.0", "content", - "_all_text_boost_2_0^2.0", ], "query": "Hello", "operator": "and", @@ -723,7 +719,6 @@ class TestElasticsearch6SearchQuery(TestCase): "fields": [ "title^2.0", "content", - "_all_text_boost_2_0^2.0", ], "query": "Hello world", "type": "phrase", @@ -739,13 +734,11 @@ class TestElasticsearch6SearchQuery(TestCase): # Check it expected_result = { - "multi_match": { - "fields": [ - "title^2.0", - "_all_text_boost_2_0^2.0", - ], - "query": "Hello world", - "type": "phrase", + "match_phrase": { + "title": { + "query": "Hello world", + "boost": 2.0, + }, }, } self.assertDictEqual(query_compiler.get_inner_query(), expected_result) @@ -780,13 +773,12 @@ class TestElasticsearch6SearchQuery(TestCase): # Check it expected_result = { - "multi_match": { - "fields": [ - "title^2.0", - "_all_text_boost_2_0^2.0", - ], - "query": "Hello world", - "fuzziness": "AUTO", + "match": { + "title": { + "query": "Hello world", + "fuzziness": "AUTO", + "boost": 2.0, + }, }, } self.assertDictEqual(query_compiler.get_inner_query(), expected_result) @@ -804,7 +796,6 @@ class TestElasticsearch6SearchQuery(TestCase): "fields": [ "title^2.0", "body", - "_all_text_boost_2_0^2.0", ], "query": "Hello world", "fuzziness": "AUTO", diff --git a/wagtail/search/tests/test_elasticsearch7_backend.py b/wagtail/search/tests/test_elasticsearch7_backend.py index 521cba3fdd..3fb3db2c50 100644 --- a/wagtail/search/tests/test_elasticsearch7_backend.py +++ b/wagtail/search/tests/test_elasticsearch7_backend.py @@ -290,12 +290,11 @@ class TestElasticsearch7SearchQuery(TestCase): "bool": { "filter": {"match": {"content_type": "searchtests.Book"}}, "must": { - "multi_match": { - "fields": [ - "title^2.0", - "_all_text_boost_2_0^2.0", - ], - "query": "Hello", + "match": { + "title": { + "query": "Hello", + "boost": 2.0, + }, }, }, } @@ -313,13 +312,12 @@ class TestElasticsearch7SearchQuery(TestCase): "bool": { "filter": {"match": {"content_type": "searchtests.Book"}}, "must": { - "multi_match": { - "fields": [ - "title^2.0", - "_all_text_boost_2_0^2.0", - ], - "query": "Hello", - "operator": "and", + "match": { + "title": { + "query": "Hello", + "boost": 2.0, + "operator": "and", + } }, }, } @@ -341,7 +339,6 @@ class TestElasticsearch7SearchQuery(TestCase): "fields": [ "title^2.0", "content", - "_all_text_boost_2_0^2.0", ], "query": "Hello", } @@ -368,7 +365,6 @@ class TestElasticsearch7SearchQuery(TestCase): "fields": [ "title^2.0", "content", - "_all_text_boost_2_0^2.0", ], "query": "Hello", "operator": "and", @@ -736,7 +732,6 @@ class TestElasticsearch7SearchQuery(TestCase): "fields": [ "title^2.0", "content", - "_all_text_boost_2_0^2.0", ], "type": "phrase", } @@ -751,13 +746,11 @@ class TestElasticsearch7SearchQuery(TestCase): # Check it expected_result = { - "multi_match": { - "fields": [ - "title^2.0", - "_all_text_boost_2_0^2.0", - ], - "query": "Hello world", - "type": "phrase", + "match_phrase": { + "title": { + "query": "Hello world", + "boost": 2.0, + }, }, } self.assertDictEqual(query_compiler.get_inner_query(), expected_result) @@ -792,13 +785,12 @@ class TestElasticsearch7SearchQuery(TestCase): # Check it expected_result = { - "multi_match": { - "fields": [ - "title^2.0", - "_all_text_boost_2_0^2.0", - ], - "query": "Hello world", - "fuzziness": "AUTO", + "match": { + "title": { + "query": "Hello world", + "fuzziness": "AUTO", + "boost": 2.0, + }, } } self.assertDictEqual(query_compiler.get_inner_query(), expected_result) @@ -816,7 +808,6 @@ class TestElasticsearch7SearchQuery(TestCase): "fields": [ "title^2.0", "body", - "_all_text_boost_2_0^2.0", ], "query": "Hello world", "fuzziness": "AUTO",