diff --git a/addons/web/static/src/js/control_panel/custom_filter_item.js b/addons/web/static/src/js/control_panel/custom_filter_item.js
index 6682b660b78..b2ff23344d9 100644
--- a/addons/web/static/src/js/control_panel/custom_filter_item.js
+++ b/addons/web/static/src/js/control_panel/custom_filter_item.js
@@ -180,6 +180,10 @@ odoo.define('web.CustomFilterItem', function (require) {
                         [field.name, '>=', domainValue[0]],
                         [field.name, '<=', domainValue[1]]
                     );
+                } else if (operator.symbol === 'startswith') {
+                    domainArray.push([field.name, '=ilike', domainValue[0] + '%']);
+                } else if (operator.symbol === 'endswith') {
+                    domainArray.push([field.name, '=ilike', '%' + domainValue[0]]);
                 } else {
                     domainArray.push([field.name, operator.symbol, domainValue[0]]);
                 }
diff --git a/addons/web/static/src/js/control_panel/search_utils.js b/addons/web/static/src/js/control_panel/search_utils.js
index 8fce5b23ef6..d240d2e1fb2 100644
--- a/addons/web/static/src/js/control_panel/search_utils.js
+++ b/addons/web/static/src/js/control_panel/search_utils.js
@@ -18,6 +18,8 @@ odoo.define('web.searchUtils', function (require) {
         char: [
             { symbol: "ilike", description: _lt("contains") },
             { symbol: "not ilike", description: _lt("doesn't contain") },
+            { symbol: "startswith", description: _lt("starts with") },
+            { symbol: "endswith", description: _lt("ends with") },
             { symbol: "=", description: _lt("is equal to") },
             { symbol: "!=", description: _lt("is not equal to") },
             { symbol: "!=", description: _lt("is set"), value: false },
