diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 017993755a1..c4fc144f33e 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -1587,7 +1587,8 @@ class Website(models.Model): :return: term on which a search can be performed instead of the initial search """ - if len(search) < 4 or ' ' in search: + # No fuzzy search for less that 4 characters, multi-words nor 80%+ numbers. + if len(search) < 4 or ' ' in search or len(re.findall(r'\d', search)) / len(search) >= 0.8: return search search = search.lower() words = set() diff --git a/addons/website/tests/test_fuzzy.py b/addons/website/tests/test_fuzzy.py index 48827fa304c..8655e25ae2a 100644 --- a/addons/website/tests/test_fuzzy.py +++ b/addons/website/tests/test_fuzzy.py @@ -222,3 +222,26 @@ class TestAutoComplete(TransactionCase): for result in suggestions['results']: self._check_highlight("many", result['name']) self._check_highlight("many", result['description']) + + def test_07_no_fuzzy_for_mostly_number(self): + """ Ensures exact match is used when search contains mostly numbers. """ + self._create_page('Product P7935432254U7 page', 'Product P7935432254U7', '/numberpage') + suggestions = self._autocomplete("54321") + self.assertEqual(0, suggestions['results_count'], "Test data contains no exact match") + suggestions = self._autocomplete("54322") + self.assertEqual(1, suggestions['results_count'], "Test data contains one exact match") + suggestions = self._autocomplete("P79355") + self.assertEqual(0, suggestions['results_count'], "Test data contains no exact match") + suggestions = self._autocomplete("P79354") + self.assertEqual(1, suggestions['results_count'], "Test data contains one exact match") + self.assertFalse(suggestions['fuzzy_search'], "Expects an exact match") + suggestions = self._autocomplete("produkt") + self.assertEqual(1, suggestions['results_count'], "Test data contains one fuzzy match") + self.assertTrue(suggestions['fuzzy_search'], "Expects a fuzzy match") + + def test_08_fuzzy_classic_numbers(self): + """ Ensures fuzzy match is used when search contains a few numbers. """ + self._create_page('iPhone 6', 'iPhone6', '/iphone6') + suggestions = self._autocomplete("iphone7") + self.assertEqual(1, suggestions['results_count'], "Test data contains one fuzzy match") + self.assertTrue(suggestions['fuzzy_search'], "Expects an fuzzy match")