diff --git a/vendor/magento/module-sales/Plugin/SearchCriteria/FulltextFilterPlugin.php b/vendor/magento/module-sales/Plugin/SearchCriteria/FulltextFilterPlugin.php
deleted file mode 100644
index fa3127361aa02..0000000000000
--- a/vendor/magento/module-sales/Plugin/SearchCriteria/FulltextFilterPlugin.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Copyright 2025 Adobe
- * All Rights Reserved.
- */
-declare(strict_types=1);
-
-namespace Magento\Sales\Plugin\SearchCriteria;
-
-use Magento\Framework\Api\Filter;
-use Magento\Framework\Data\Collection;
-use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as OrderGridCollection;
-use Magento\Framework\View\Element\UiComponent\DataProvider\FulltextFilter as UiFulltextFilter;
-
-class FulltextFilterPlugin
-{
-
-    /**
-     * Use LIKE instead of MATCH AGAINST in sales order grid to bypass MySQL stopword limitations
-     *
-     * @param UiFulltextFilter $subject
-     * @param \Closure $proceed
-     * @param Collection $collection
-     * @param Filter $filter
-     * @return void
-     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
-     */
-    public function aroundApply(
-        UiFulltextFilter $subject,
-        \Closure $proceed,
-        Collection $collection,
-        Filter $filter
-    ): void {
-        if ($collection instanceof OrderGridCollection) {
-            $raw = trim((string) $filter->getValue());
-            if ($raw === '') {
-                return;
-            }
-
-            $normalized = preg_replace('/^\{+|\}+$/', '', $raw);
-            $normalized = ltrim($normalized);
-            $normalized = ltrim($normalized, '#');
-
-            // Exact increment_id search when normalized is all digits
-            if ($normalized !== '' && ctype_digit($normalized)) {
-                $collection->addFieldToFilter('increment_id', ['eq' => $normalized]);
-                return;
-            }
-
-            // LIKE across key columns (for names, emails, non-digit terms)
-            $valueForLike = trim($raw, '{}');
-            $valueForLike = ltrim($valueForLike);
-            $valueForLike = ltrim($valueForLike, '#');
-
-            $like = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $valueForLike) . '%';
-
-            $fields = ['increment_id', 'billing_name', 'shipping_name', 'customer_email'];
-            $conditions = array_fill(0, count($fields), ['like' => $like]);
-
-            $collection->addFieldToFilter($fields, $conditions);
-            return;
-        }
-        $proceed($collection, $filter);
-    }
-}
diff --git a/vendor/magento/module-sales/Ui/Component/Listing/FulltextFilter.php b/vendor/magento/module-sales/Ui/Component/Listing/FulltextFilter.php
new file mode 100644
index 0000000000000..754a19ae73a88
--- /dev/null
+++ b/vendor/magento/module-sales/Ui/Component/Listing/FulltextFilter.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * Copyright 2026 Adobe
+ * All Rights Reserved.
+ */
+declare(strict_types=1);
+
+namespace Magento\Sales\Ui\Component\Listing;
+
+use Magento\Framework\Api\Filter;
+use Magento\Framework\Data\Collection;
+use Magento\Framework\Data\Collection\AbstractDb;
+use Magento\Framework\DB\Helper;
+use Magento\Framework\DB\Select;
+use Magento\Framework\View\Element\UiComponent\DataProvider\FulltextFilter as BaseFulltextFilter;
+
+/**
+ * Fulltext keyword search for the admin Sales Order grid.
+ *
+ * Delegates to the parent's MATCH...AGAINST search unchanged, restoring index-backed performance and
+ * multi-term OR semantics for the common case, and additionally matches via LIKE any search term InnoDB's
+ * fulltext engine would silently drop from its index: stopwords and tokens shorter than the minimum indexed
+ * token size.
+ */
+class FulltextFilter extends BaseFulltextFilter
+{
+    /**
+     * InnoDB's built-in default fulltext stopword list: SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
+     */
+    private const DEFAULT_STOPWORDS = [
+        'a','about','an','are','as','at','be','by','com','de','en','for','from','how','i','in','is','it','la','of','on',
+        'or','that','the','this','to','was','what','when','where','who','will','with','und','the','www'
+    ];
+
+    /**
+     * Matches InnoDB's innodb_ft_min_token_size default.
+     */
+    private const DEFAULT_MIN_TOKEN_SIZE = 3;
+
+    /**
+     * @param Helper $dbHelper
+     * @param string[] $stopwords Search terms to exclude from MATCH...AGAINST and match via LIKE instead.
+     * @param int $minTokenSize Minimum term length eligible for MATCH...AGAINST; shorter terms use LIKE.
+     */
+    public function __construct(
+        private readonly Helper $dbHelper,
+        private readonly array  $stopwords = self::DEFAULT_STOPWORDS,
+        private readonly int    $minTokenSize = self::DEFAULT_MIN_TOKEN_SIZE
+    ) {
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public function apply(Collection $collection, Filter $filter): void
+    {
+        if (!$collection instanceof AbstractDb) {
+            throw new \InvalidArgumentException('Database collection required.');
+        }
+
+        $raw = trim((string) $filter->getValue());
+        if ($raw === '') {
+            return;
+        }
+
+        $tokens = preg_split('/[\s,]+/', $raw, -1, PREG_SPLIT_NO_EMPTY);
+        $ignoredTokens = array_filter($tokens, fn (string $token): bool => $this->isTokenIgnored($token));
+
+        if (!$ignoredTokens) {
+            // nothing InnoDB's fulltext index would drop, so no LIKE fallback
+            parent::apply($collection, $filter);
+            return;
+        }
+
+        $select = $collection->getSelect();
+        $baseline = $select->getPart(Select::WHERE);
+
+        parent::apply($collection, $filter);
+
+        $addedParts = array_map(
+            fn (string $part): string => $this->stripLeadingBoolean($part),
+            array_diff($select->getPart(Select::WHERE), $baseline)
+        );
+        $select->reset(Select::WHERE);
+        $select->setPart(Select::WHERE, $baseline);
+
+        $addedParts = array_merge($addedParts, $this->buildLikeConditions($collection, $ignoredTokens));
+
+        if ($addedParts) {
+            $select->where('(' . implode(') ' . Select::SQL_OR . ' (', $addedParts) . ')');
+        }
+    }
+
+    /**
+     * Build a LIKE condition per ignored token, per fulltext-indexed column.
+     *
+     * @param AbstractDb $collection
+     * @param string[] $tokens
+     * @return string[]
+     */
+    private function buildLikeConditions(AbstractDb $collection, array $tokens): array
+    {
+        $mainTable = $collection->getMainTable();
+        $columns = $this->getFulltextIndexColumns($collection, $mainTable);
+        if (!$columns) {
+            return [];
+        }
+        $columns = $this->addTableAliasToColumns($columns, $collection, $mainTable);
+
+        $connection = $collection->getConnection();
+        $conditions = array_map(
+            fn (string $token) => array_map(
+                fn (string $column) => $connection->prepareSqlCondition(
+                    $column,
+                    ['like' => $this->dbHelper->escapeLikeValue($token, ['position' => 'any'])]
+                ),
+                $columns
+            ),
+            $tokens
+        );
+
+        return array_merge(...$conditions);
+    }
+
+    /**
+     * Whether a search term would be silently dropped by InnoDB's fulltext index (stopword or too short).
+     *
+     * @param string $token
+     * @return bool
+     */
+    private function isTokenIgnored(string $token): bool
+    {
+        return mb_strlen($token) < $this->minTokenSize || in_array(mb_strtolower($token), $this->stopwords, true);
+    }
+
+    /**
+     * Strip a leading boolean keyword (AND/OR) Zend_Db_Select prefixes WHERE parts with.
+     *
+     * @param string $part
+     * @return string
+     */
+    private function stripLeadingBoolean(string $part): string
+    {
+        return preg_replace('/^(' . Select::SQL_OR . '|' . Select::SQL_AND . ')\s+/i', '', trim($part), 1);
+    }
+}
diff --git a/vendor/magento/module-sales/etc/adminhtml/di.xml b/vendor/magento/module-sales/etc/adminhtml/di.xml
index 3a25a8386e839..33e311302929b 100644
--- a/vendor/magento/module-sales/etc/adminhtml/di.xml
+++ b/vendor/magento/module-sales/etc/adminhtml/di.xml
@@ -86,14 +86,27 @@
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\FulltextFilter">
-        <plugin name="ordergrid_fulltext_fallback"
-                type="Magento\Sales\Plugin\SearchCriteria\FulltextFilterPlugin"
-                sortOrder="10"/>
-    </type>
     <type name="Magento\Sales\Model\ResourceModel\Order\Grid\Collection">
         <plugin name="custom_sales_grid_country_name_to_code_filter"
                 type="Magento\Sales\Plugin\OrderGrid\CountryNameToCodeFilter"
                 sortOrder="10"/>
     </type>
+    <virtualType name="SalesOrderGridFilterPool" type="Magento\Framework\View\Element\UiComponent\DataProvider\FilterPool">
+        <arguments>
+            <argument name="appliers" xsi:type="array">
+                <item name="regular" xsi:type="object">Magento\Framework\View\Element\UiComponent\DataProvider\RegularFilter</item>
+                <item name="fulltext" xsi:type="object">Magento\Sales\Ui\Component\Listing\FulltextFilter</item>
+            </argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="SalesOrderGridReporting" type="Magento\Framework\View\Element\UiComponent\DataProvider\Reporting">
+        <arguments>
+            <argument name="filterPool" xsi:type="object">SalesOrderGridFilterPool</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="SalesOrderGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
+        <arguments>
+            <argument name="reporting" xsi:type="object" shared="false">SalesOrderGridReporting</argument>
+        </arguments>
+    </virtualType>
 </config>
diff --git a/vendor/magento/module-sales/view/adminhtml/ui_component/sales_order_grid.xml b/vendor/magento/module-sales/view/adminhtml/ui_component/sales_order_grid.xml
index 7485c8ac0af26..74302917065cb 100644
--- a/vendor/magento/module-sales/view/adminhtml/ui_component/sales_order_grid.xml
+++ b/vendor/magento/module-sales/view/adminhtml/ui_component/sales_order_grid.xml
@@ -30,7 +30,7 @@
             <updateUrl path="mui/index/render"/>
         </settings>
         <aclResource>Magento_Sales::sales_order</aclResource>
-        <dataProvider class="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider" name="sales_order_grid_data_source">
+        <dataProvider class="SalesOrderGridDataProvider" name="sales_order_grid_data_source">
             <settings>
                 <requestFieldName>id</requestFieldName>
                 <primaryFieldName>main_table.entity_id</primaryFieldName>
