diff --git a/airflow-core/newsfragments/64963.significant.rst b/airflow-core/newsfragments/64963.significant.rst
deleted file mode 100644
index a005bb0004941..0000000000000
--- a/airflow-core/newsfragments/64963.significant.rst
+++ /dev/null
@@ -1 +0,0 @@
-The Airflow UI now uses the new index-friendly ``*_prefix_pattern`` REST API query parameters instead of the existing full-match ``*_pattern`` parameters on list endpoints. This is a behavioral change for search-as-you-type filters in the UI: matches are now prefix-based (``LIKE 'term%'`` via a range scan) instead of substring-based (``ILIKE '%term%'``), which means the database can use B-tree indexes and search stays fast on large deployments. The REST API itself keeps both forms: existing ``*_pattern`` parameters still behave exactly as before.
diff --git a/airflow-core/newsfragments/66015.significant.rst b/airflow-core/newsfragments/66015.significant.rst
new file mode 100644
index 0000000000000..d7060a4c81426
--- /dev/null
+++ b/airflow-core/newsfragments/66015.significant.rst
@@ -0,0 +1,3 @@
+In #64963, the Airflow UI switched from full-match ``*_pattern`` REST API query parameters to the new index-friendly ``*_prefix_pattern`` parameters on list endpoints. This is a behavioral change for search-as-you-type filters in the UI: matches are prefix-based (``LIKE 'term%'`` via a range scan) instead of substring-based (``ILIKE '%term%'``), which means the database can use B-tree indexes and search stays fast on large deployments. The REST API itself keeps both forms: existing ``*_pattern`` parameters still behave exactly as before.
+
+In #66015, a per-searchbar "Match anywhere" toggle was added so users who relied on the previous substring behavior can opt back into it from the UI. Each search input and each text filter pill now has a small regex-icon toggle next to the value; flipping it on switches that input from ``*_prefix_pattern`` to ``*_pattern``.
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/en/common.json b/airflow-core/src/airflow/ui/public/i18n/locales/en/common.json
index e44f9cc3856e1..2236f249593ab 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/en/common.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/en/common.json
@@ -193,6 +193,12 @@
     },
     "tooltip": "Press {{hotkey}} to scroll to {{direction}}"
   },
+  "search": {
+    "advanced": {
+      "description": "Match anywhere in the value (substring search). Slower on large deployments because it can't use the default B-tree index. See the docs section on custom metadata indexes for details.",
+      "title": "Match anywhere"
+    }
+  },
   "security": {
     "actions": "Actions",
     "permissions": "Permissions",
diff --git a/airflow-core/src/airflow/ui/src/components/AdvancedSearchToggle.tsx b/airflow-core/src/airflow/ui/src/components/AdvancedSearchToggle.tsx
new file mode 100644
index 0000000000000..2681a295c336f
--- /dev/null
+++ b/airflow-core/src/airflow/ui/src/components/AdvancedSearchToggle.tsx
@@ -0,0 +1,95 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Box, IconButton, Stack, Text } from "@chakra-ui/react";
+import { useTranslation } from "react-i18next";
+import { LuRegex } from "react-icons/lu";
+
+import { Tooltip } from "src/components/ui";
+
+export type AdvancedSearchToggleProps = {
+  readonly enabled: boolean;
+  readonly onToggle: (enabled: boolean) => void;
+  readonly size?: "2xs" | "sm" | "xs";
+  // "standalone" → free-floating IconButton next to a SearchBar.
+  // "addon"      → flush right addon inside a rounded pill input, mirroring the label on the left.
+  readonly variant?: "addon" | "standalone";
+};
+
+export const AdvancedSearchToggle = ({
+  enabled,
+  onToggle,
+  size = "sm",
+  variant = "standalone",
+}: AdvancedSearchToggleProps) => {
+  const { t: translate } = useTranslation("common");
+
+  const button =
+    variant === "addon" ? (
+      <Box
+        alignItems="center"
+        alignSelf="stretch"
+        aria-label="Toggle match-anywhere search"
+        aria-pressed={enabled}
+        as="button"
+        bg={enabled ? "colorPalette.solid" : "gray.muted"}
+        borderRightRadius="full"
+        color={enabled ? "colorPalette.contrast" : "colorPalette.fg"}
+        colorPalette={enabled ? "brand" : "gray"}
+        cursor="pointer"
+        data-testid="advanced-search-toggle"
+        display="flex"
+        onClick={() => onToggle(!enabled)}
+        // Keep focus on the FilterPill input so toggling does not collapse the pill.
+        onMouseDown={(event) => event.preventDefault()}
+        px={3}
+      >
+        <LuRegex />
+      </Box>
+    ) : (
+      <IconButton
+        aria-label="Toggle match-anywhere search"
+        aria-pressed={enabled}
+        colorPalette="brand"
+        data-testid="advanced-search-toggle"
+        flexShrink={0}
+        onClick={() => onToggle(!enabled)}
+        onMouseDown={(event) => event.preventDefault()}
+        size={size}
+        variant={enabled ? "solid" : "outline"}
+      >
+        <LuRegex />
+      </IconButton>
+    );
+
+  return (
+    <Tooltip
+      content={
+        <Stack gap={1} maxW="320px">
+          <Text fontWeight="semibold">{translate("search.advanced.title")}</Text>
+          <Text>{translate("search.advanced.description")}</Text>
+        </Stack>
+      }
+      openDelay={200}
+      portalled
+      showArrow
+    >
+      {button}
+    </Tooltip>
+  );
+};
diff --git a/airflow-core/src/airflow/ui/src/components/FilterBar/filters/TextSearchFilter.tsx b/airflow-core/src/airflow/ui/src/components/FilterBar/filters/TextSearchFilter.tsx
index 3015b582382a7..32bfa29231849 100644
--- a/airflow-core/src/airflow/ui/src/components/FilterBar/filters/TextSearchFilter.tsx
+++ b/airflow-core/src/airflow/ui/src/components/FilterBar/filters/TextSearchFilter.tsx
@@ -16,8 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import { HStack } from "@chakra-ui/react";
 import { useRef } from "react";
 import { useHotkeys } from "react-hotkeys-hook";
+import { LuRegex } from "react-icons/lu";
+
+import { AdvancedSearchToggle } from "src/components/AdvancedSearchToggle";
+import { useAdvancedSearch } from "src/hooks/useAdvancedSearch";
 
 import { InputWithAddon } from "../../ui";
 import { FilterPill } from "../FilterPill";
@@ -26,6 +31,8 @@ import { isValidFilterValue } from "../utils";
 
 export const TextSearchFilter = ({ filter, onChange, onRemove }: FilterPluginProps) => {
   const hotkeyInputRef = useRef<HTMLInputElement>(null);
+  const advanced = useAdvancedSearch(filter.config.key);
+  const showAdvancedToggle = filter.config.supportsAdvancedSearch === true;
 
   const hasValue = isValidFilterValue(filter.config.type, filter.value);
 
@@ -45,15 +52,32 @@ export const TextSearchFilter = ({ filter, onChange, onRemove }: FilterPluginPro
     { enabled: !filter.config.hotkeyDisabled, preventDefault: true },
   );
 
+  const isAdvanced = showAdvancedToggle && advanced.enabled;
+  const stringValue = hasValue && typeof filter.value === "string" ? filter.value : "";
+
   return (
     <FilterPill
-      displayValue={hasValue && typeof filter.value === "string" ? filter.value : ""}
+      displayValue={
+        isAdvanced && stringValue !== "" ? (
+          <HStack as="span" gap={1}>
+            <LuRegex aria-label="match anywhere" />
+            {stringValue}
+          </HStack>
+        ) : (
+          stringValue
+        )
+      }
       filter={filter}
       hasValue={hasValue}
       onRemove={onRemove}
       renderInput={(props) => (
         <InputWithAddon
           {...props}
+          endAddon={
+            showAdvancedToggle ? (
+              <AdvancedSearchToggle enabled={advanced.enabled} onToggle={advanced.onToggle} variant="addon" />
+            ) : undefined
+          }
           label={filter.config.label}
           onChange={handleInputChange}
           placeholder={filter.config.placeholder}
diff --git a/airflow-core/src/airflow/ui/src/components/FilterBar/types.ts b/airflow-core/src/airflow/ui/src/components/FilterBar/types.ts
index c1654f6c9af95..8e04bf53c720b 100644
--- a/airflow-core/src/airflow/ui/src/components/FilterBar/types.ts
+++ b/airflow-core/src/airflow/ui/src/components/FilterBar/types.ts
@@ -38,6 +38,10 @@ export type FilterConfig = {
   readonly placeholder?: string;
   readonly required?: boolean;
   readonly startKey?: string;
+  // Set on text filters whose API endpoint exposes both ``*_pattern`` (substring)
+  // and ``*_prefix_pattern`` (prefix) variants. The pill renders a toggle that
+  // controls which one the consuming page uses, via ``useAdvancedSearch``.
+  readonly supportsAdvancedSearch?: boolean;
   readonly type: "date" | "daterange" | "number" | "select" | "text";
 };
 
diff --git a/airflow-core/src/airflow/ui/src/components/SearchBar.test.tsx b/airflow-core/src/airflow/ui/src/components/SearchBar.test.tsx
index 65f3c4f75d278..9d981a483a0c9 100644
--- a/airflow-core/src/airflow/ui/src/components/SearchBar.test.tsx
+++ b/airflow-core/src/airflow/ui/src/components/SearchBar.test.tsx
@@ -115,4 +115,48 @@ describe("Test SearchBar", () => {
 
     expect((input as HTMLInputElement).value).toBe("user-typing");
   });
+
+  it("does not render advanced toggle by default", () => {
+    render(<SearchBar defaultValue="" onChange={vi.fn()} placeholder="Search" />, {
+      wrapper: Wrapper,
+    });
+
+    expect(screen.queryByTestId("advanced-search-toggle")).toBeNull();
+  });
+
+  it("renders advanced toggle and reflects enabled state", () => {
+    const onToggle = vi.fn();
+
+    render(
+      <SearchBar
+        advancedSearch={{ enabled: false, onToggle }}
+        defaultValue=""
+        onChange={vi.fn()}
+        placeholder="Search"
+      />,
+      { wrapper: Wrapper },
+    );
+
+    const toggle = screen.getByTestId("advanced-search-toggle");
+
+    expect(toggle.getAttribute("aria-pressed")).toBe("false");
+
+    fireEvent.click(toggle);
+
+    expect(onToggle).toHaveBeenCalledWith(true);
+  });
+
+  it("shows advanced toggle as pressed when enabled", () => {
+    render(
+      <SearchBar
+        advancedSearch={{ enabled: true, onToggle: vi.fn() }}
+        defaultValue=""
+        onChange={vi.fn()}
+        placeholder="Search"
+      />,
+      { wrapper: Wrapper },
+    );
+
+    expect(screen.getByTestId("advanced-search-toggle").getAttribute("aria-pressed")).toBe("true");
+  });
 });
diff --git a/airflow-core/src/airflow/ui/src/components/SearchBar.tsx b/airflow-core/src/airflow/ui/src/components/SearchBar.tsx
index f935a847ef591..115ade95b1084 100644
--- a/airflow-core/src/airflow/ui/src/components/SearchBar.tsx
+++ b/airflow-core/src/airflow/ui/src/components/SearchBar.tsx
@@ -16,18 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { CloseButton, Input, InputGroup, Kbd, type InputGroupProps } from "@chakra-ui/react";
+import { CloseButton, HStack, Input, InputGroup, Kbd, type InputGroupProps } from "@chakra-ui/react";
 import { useEffect, useRef, useState, type ChangeEvent } from "react";
 import { useHotkeys } from "react-hotkeys-hook";
 import { useTranslation } from "react-i18next";
 import { FiSearch } from "react-icons/fi";
 import { useDebouncedCallback } from "use-debounce";
 
+import { AdvancedSearchToggle, type AdvancedSearchToggleProps } from "src/components/AdvancedSearchToggle";
 import { getMetaKey } from "src/utils";
 
 const debounceDelay = 200;
 
+type AdvancedSearchProps = Omit<AdvancedSearchToggleProps, "size">;
+
 type Props = {
+  readonly advancedSearch?: AdvancedSearchProps;
   readonly defaultValue: string;
   readonly hotkeyDisabled?: boolean;
   readonly onChange: (value: string) => void;
@@ -35,6 +39,7 @@ type Props = {
 } & Omit<InputGroupProps, "children" | "onChange">;
 
 export const SearchBar = ({
+  advancedSearch,
   defaultValue,
   hotkeyDisabled = false,
   onChange,
@@ -69,7 +74,7 @@ export const SearchBar = ({
     { enabled: !hotkeyDisabled, preventDefault: true },
   );
 
-  return (
+  const inputGroup = (
     <InputGroup
       colorPalette="brand"
       {...props}
@@ -104,4 +109,15 @@ export const SearchBar = ({
       />
     </InputGroup>
   );
+
+  if (!advancedSearch) {
+    return inputGroup;
+  }
+
+  return (
+    <HStack alignItems="center" gap={2} w="100%">
+      {inputGroup}
+      <AdvancedSearchToggle {...advancedSearch} />
+    </HStack>
+  );
 };
diff --git a/airflow-core/src/airflow/ui/src/components/ui/InputWithAddon.tsx b/airflow-core/src/airflow/ui/src/components/ui/InputWithAddon.tsx
index 52e88ce757de2..12123b74082a5 100644
--- a/airflow-core/src/airflow/ui/src/components/ui/InputWithAddon.tsx
+++ b/airflow-core/src/airflow/ui/src/components/ui/InputWithAddon.tsx
@@ -21,12 +21,13 @@ import { Box, Input, Text } from "@chakra-ui/react";
 import * as React from "react";
 
 export type InputWithAddonProps = {
+  readonly endAddon?: React.ReactNode;
   readonly label: string;
   readonly width?: string;
 } & InputProps;
 
 export const InputWithAddon = React.forwardRef<HTMLInputElement, InputWithAddonProps>((props, ref) => {
-  const { label, width = "220px", ...inputProps } = props;
+  const { endAddon, label, width = "220px", ...inputProps } = props;
 
   return (
     <Box
@@ -62,6 +63,7 @@ export const InputWithAddon = React.forwardRef<HTMLInputElement, InputWithAddonP
         size="sm"
         {...inputProps}
       />
+      {endAddon}
     </Box>
   );
 });
diff --git a/airflow-core/src/airflow/ui/src/constants/filterConfigs.tsx b/airflow-core/src/airflow/ui/src/constants/filterConfigs.tsx
index 4b06175db885e..64a80f92ec3c4 100644
--- a/airflow-core/src/airflow/ui/src/constants/filterConfigs.tsx
+++ b/airflow-core/src/airflow/ui/src/constants/filterConfigs.tsx
@@ -107,18 +107,21 @@ export const useFilterConfigs = () => {
       hotkeyDisabled: true,
       icon: <DagIcon />,
       label: translate("common:dagId"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.DAG_ID]: {
       hotkeyDisabled: true,
       icon: <DagIcon />,
       label: translate("common:dagId"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.DAG_ID_PATTERN]: {
       hotkeyDisabled: true,
       icon: <DagIcon />,
       label: translate("common:dagId"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.DAG_VERSION]: {
@@ -156,6 +159,7 @@ export const useFilterConfigs = () => {
     },
     [SearchParamsKeys.EVENT_TYPE]: {
       label: translate("browse:auditLog.filters.eventType"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.EXECUTOR_CLASS]: {
@@ -191,6 +195,7 @@ export const useFilterConfigs = () => {
     [SearchParamsKeys.KEY_PATTERN]: {
       icon: <MdSearch />,
       label: translate("admin:columns.key"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.LOGICAL_DATE_RANGE]: {
@@ -210,30 +215,35 @@ export const useFilterConfigs = () => {
       hotkeyDisabled: true,
       icon: <TaskIcon />,
       label: translate("common:taskId"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.OPERATOR_NAME_PATTERN]: {
       hotkeyDisabled: true,
       icon: <MdBuild />,
       label: translate("common:task.operator"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.PARTITION_KEY_PATTERN]: {
       hotkeyDisabled: true,
       icon: <MdSearch />,
       label: translate("common:dagRun.partitionKey"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.POOL_NAME_PATTERN]: {
       hotkeyDisabled: true,
       icon: <BiTargetLock />,
       label: translate("common:taskInstance.pool"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.QUEUE_NAME_PATTERN]: {
       hotkeyDisabled: true,
       icon: <PiQueue />,
       label: translate("common:taskInstance.queue"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.RESPONDED_BY_USER_NAME]: {
@@ -269,12 +279,14 @@ export const useFilterConfigs = () => {
       hotkeyDisabled: true,
       icon: <FiBarChart />,
       label: translate("common:runId"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.RUN_ID_PATTERN]: {
       hotkeyDisabled: true,
       icon: <FiBarChart />,
       label: translate("common:runId"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.RUN_TYPE]: {
@@ -324,12 +336,14 @@ export const useFilterConfigs = () => {
       hotkeyDisabled: true,
       icon: <TaskIcon />,
       label: translate("common:taskId"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.TASK_ID_PATTERN]: {
       hotkeyDisabled: true,
       icon: <TaskIcon />,
       label: translate("common:taskId"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.TASK_STATE]: {
@@ -350,6 +364,7 @@ export const useFilterConfigs = () => {
       hotkeyDisabled: true,
       icon: <FiUser />,
       label: translate("common:dagRun.triggeringUser"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
     [SearchParamsKeys.TRY_NUMBER]: {
@@ -360,6 +375,7 @@ export const useFilterConfigs = () => {
     [SearchParamsKeys.USER]: {
       icon: <FiUser />,
       label: translate("common:user"),
+      supportsAdvancedSearch: true,
       type: FilterTypes.TEXT,
     },
   };
diff --git a/airflow-core/src/airflow/ui/src/constants/localStorage.ts b/airflow-core/src/airflow/ui/src/constants/localStorage.ts
index e3e020ed2cefa..97285aef6fa80 100644
--- a/airflow-core/src/airflow/ui/src/constants/localStorage.ts
+++ b/airflow-core/src/airflow/ui/src/constants/localStorage.ts
@@ -37,3 +37,6 @@ export const allGroupsKey = (dagId: string) => `${dagId}/all-groups`;
 
 // Page-scoped keys
 export const tableSortKey = (pageName: string) => `${pageName.replaceAll("/", "-").slice(1)}-table-sort`;
+
+// SearchBar advanced (substring) toggle, scoped per searchbar via a caller-provided id.
+export const advancedSearchKey = (id: string) => `advanced_search-${id}`;
diff --git a/airflow-core/src/airflow/ui/src/hooks/useAdvancedSearch.ts b/airflow-core/src/airflow/ui/src/hooks/useAdvancedSearch.ts
new file mode 100644
index 0000000000000..2f17b7f6fd6be
--- /dev/null
+++ b/airflow-core/src/airflow/ui/src/hooks/useAdvancedSearch.ts
@@ -0,0 +1,56 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { useLocalStorage } from "usehooks-ts";
+
+import { advancedSearchKey } from "src/constants/localStorage";
+
+// Toggle is intentionally NOT mirrored in the URL: shared links default to the
+// fast prefix-search behavior, and recipients can opt back into substring search
+// per searchbar if they want it.
+export const useAdvancedSearch = (key: string) => {
+  const [enabled, setEnabled] = useLocalStorage<boolean>(advancedSearchKey(key), false);
+
+  return { enabled, onToggle: setEnabled };
+};
+
+type AdvancedSearchArgOptions<TPrefix extends string, TPattern extends string> = {
+  patternApiKey: TPattern;
+  prefixApiKey: TPrefix;
+  storageKey: string;
+  value: string | null | undefined;
+};
+
+// Build the right API arg object for a search field that supports both prefix
+// (`*_prefix_pattern`) and full-substring (`*_pattern`) variants. The toggle
+// state is read from localStorage via ``useAdvancedSearch``, so the pill in the
+// FilterBar and the page query stay in sync.
+export const useAdvancedSearchArg = <TPrefix extends string, TPattern extends string>({
+  patternApiKey,
+  prefixApiKey,
+  storageKey,
+  value,
+}: AdvancedSearchArgOptions<TPrefix, TPattern>): Partial<Record<TPattern | TPrefix, string>> => {
+  const { enabled } = useAdvancedSearch(storageKey);
+
+  if (value === null || value === undefined || value === "") {
+    return {};
+  }
+
+  return { [enabled ? patternApiKey : prefixApiKey]: value } as Partial<Record<TPattern | TPrefix, string>>;
+};
diff --git a/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx b/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx
index 2512b28f32647..558d705a1075d 100644
--- a/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx
@@ -31,6 +31,7 @@ import RenderedJsonField from "src/components/RenderedJsonField";
 import { SearchBar } from "src/components/SearchBar";
 import Time from "src/components/Time";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearch } from "src/hooks/useAdvancedSearch";
 import { CreateAssetEvent } from "src/pages/Asset/CreateAssetEvent";
 
 import { DependencyPopover } from "./DependencyPopover";
@@ -118,6 +119,7 @@ export const AssetsList = () => {
   const [searchParams, setSearchParams] = useSearchParams();
 
   const namePattern = searchParams.get(NAME_PATTERN) ?? "";
+  const advancedSearch = useAdvancedSearch("assets");
 
   const { setTableURLState, tableURLState } = useTableURLState();
   const { pagination, sorting } = tableURLState;
@@ -128,7 +130,7 @@ export const AssetsList = () => {
 
   const { data, error, isLoading } = useAssetServiceGetAssets({
     limit: pagination.pageSize,
-    namePrefixPattern: namePattern,
+    ...(advancedSearch.enabled ? { namePattern } : { namePrefixPattern: namePattern }),
     offset: pagination.pageIndex * pagination.pageSize,
     orderBy,
   });
@@ -153,6 +155,7 @@ export const AssetsList = () => {
     <>
       <VStack alignItems="none">
         <SearchBar
+          advancedSearch={advancedSearch}
           defaultValue={namePattern}
           onChange={handleSearchChange}
           placeholder={translate("searchPlaceholder")}
diff --git a/airflow-core/src/airflow/ui/src/pages/Connections/Connections.tsx b/airflow-core/src/airflow/ui/src/pages/Connections/Connections.tsx
index 2b45beddc9987..4c475ca6d2824 100644
--- a/airflow-core/src/airflow/ui/src/pages/Connections/Connections.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/Connections/Connections.tsx
@@ -34,6 +34,7 @@ import { Tooltip } from "src/components/ui";
 import { ActionBar } from "src/components/ui/ActionBar";
 import { Checkbox } from "src/components/ui/Checkbox";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearch } from "src/hooks/useAdvancedSearch";
 import { useConfig } from "src/queries/useConfig.tsx";
 import { useConnectionTypeMeta } from "src/queries/useConnectionTypeMeta";
 
@@ -144,6 +145,7 @@ export const Connections = () => {
   const [searchParams, setSearchParams] = useSearchParams();
   const { NAME_PATTERN, OFFSET }: SearchParamsKeysType = SearchParamsKeys;
   const [connectionIdPattern, setConnectionIdPattern] = useState(searchParams.get(NAME_PATTERN) ?? undefined);
+  const advancedSearch = useAdvancedSearch("connections");
   const multiTeamEnabled = Boolean(useConfig("multi_team"));
 
   useConnectionTypeMeta(); // Pre-fetch connection type metadata
@@ -151,7 +153,9 @@ export const Connections = () => {
   const [sort] = sorting;
   const orderBy = sort ? [`${sort.desc ? "-" : ""}${sort.id}`] : ["connection_id"];
   const { data, error, isFetching, isLoading } = useConnectionServiceGetConnections({
-    connectionIdPrefixPattern: connectionIdPattern ?? undefined,
+    ...(advancedSearch.enabled
+      ? { connectionIdPattern: connectionIdPattern ?? undefined }
+      : { connectionIdPrefixPattern: connectionIdPattern ?? undefined }),
     limit: pagination.pageSize,
     offset: pagination.pageIndex * pagination.pageSize,
     orderBy,
@@ -191,6 +195,7 @@ export const Connections = () => {
     <>
       <VStack alignItems="none">
         <SearchBar
+          advancedSearch={advancedSearch}
           defaultValue={connectionIdPattern ?? ""}
           onChange={handleSearchChange}
           placeholder={translate("connections.searchPlaceholder")}
diff --git a/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx b/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
index bd3740eefab5d..b2212a889cd17 100644
--- a/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
@@ -39,6 +39,7 @@ import { StateBadge } from "src/components/StateBadge";
 import Time from "src/components/Time";
 import { TruncatedText } from "src/components/TruncatedText";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearchArg } from "src/hooks/useAdvancedSearch";
 import { DagRunsFilters } from "src/pages/DagRunsFilters";
 import DeleteRunButton from "src/pages/DeleteRunButton";
 import { renderDuration, useAutoRefresh, isStatePending } from "src/utils";
@@ -232,6 +233,31 @@ export const DagRuns = () => {
 
   const refetchInterval = useAutoRefresh({});
 
+  const dagIdPatternArg = useAdvancedSearchArg({
+    patternApiKey: "dagIdPattern",
+    prefixApiKey: "dagIdPrefixPattern",
+    storageKey: DAG_ID_PATTERN_PARAM,
+    value: filteredDagIdPattern,
+  });
+  const runIdPatternArg = useAdvancedSearchArg({
+    patternApiKey: "runIdPattern",
+    prefixApiKey: "runIdPrefixPattern",
+    storageKey: RUN_ID_PATTERN_PARAM,
+    value: filteredRunIdPattern,
+  });
+  const triggeringUserArg = useAdvancedSearchArg({
+    patternApiKey: "triggeringUserNamePattern",
+    prefixApiKey: "triggeringUserNamePrefixPattern",
+    storageKey: TRIGGERING_USER_NAME_PATTERN_PARAM,
+    value: filteredTriggeringUserNamePattern,
+  });
+  const partitionKeyArg = useAdvancedSearchArg({
+    patternApiKey: "partitionKeyPattern",
+    prefixApiKey: "partitionKeyPrefixPattern",
+    storageKey: PARTITION_KEY_PATTERN_PARAM,
+    value: partitionKeyPattern,
+  });
+
   const { data, error, isLoading } = useDagRunServiceGetDagRuns(
     {
       bundleVersion: bundleVersion ?? undefined,
@@ -239,7 +265,7 @@ export const DagRuns = () => {
       consumingAssetPattern: filteredConsumingAsset ?? undefined,
       cursor: cursor ?? "",
       dagId: dagId ?? "~",
-      dagIdPrefixPattern: filteredDagIdPattern ?? undefined,
+      ...dagIdPatternArg,
       dagVersion:
         filteredDagVersion !== null && filteredDagVersion !== "" ? [Number(filteredDagVersion)] : undefined,
       durationGte: durationGte !== null && durationGte !== "" ? Number(durationGte) : undefined,
@@ -250,15 +276,15 @@ export const DagRuns = () => {
       logicalDateGte: logicalDateGte ?? undefined,
       logicalDateLte: logicalDateLte ?? undefined,
       orderBy,
-      partitionKeyPrefixPattern: partitionKeyPattern ?? undefined,
+      ...partitionKeyArg,
       runAfterGte: runAfterGte ?? undefined,
       runAfterLte: runAfterLte ?? undefined,
-      runIdPrefixPattern: filteredRunIdPattern ?? undefined,
+      ...runIdPatternArg,
       runType: filteredType === null ? undefined : [filteredType],
       startDateGte: startDateGte ?? undefined,
       startDateLte: startDateLte ?? undefined,
       state: filteredState === null ? undefined : [filteredState],
-      triggeringUserNamePrefixPattern: filteredTriggeringUserNamePattern ?? undefined,
+      ...triggeringUserArg,
     },
     undefined,
     {
diff --git a/airflow-core/src/airflow/ui/src/pages/DagsList/DagsList.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/DagsList.tsx
index 7bb933d8f8ee3..dd5e59ec88b65 100644
--- a/airflow-core/src/airflow/ui/src/pages/DagsList/DagsList.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/DagsList/DagsList.tsx
@@ -46,6 +46,7 @@ import { TogglePause } from "src/components/TogglePause";
 import { TriggerDAGButton } from "src/components/TriggerDag/TriggerDAGButton";
 import { DAGS_LIST_DISPLAY_KEY } from "src/constants/localStorage";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearch } from "src/hooks/useAdvancedSearch";
 import { DagsLayout } from "src/layouts/DagsLayout";
 import { useConfig } from "src/queries/useConfig";
 import { useDags } from "src/queries/useDags";
@@ -216,6 +217,7 @@ export const DagsList = () => {
 
   const { pagination, sorting } = tableURLState;
   const dagDisplayNamePattern = searchParams.get(NAME_PATTERN) ?? "";
+  const advancedSearch = useAdvancedSearch("dags");
 
   const [sort] = sorting;
   const orderBy = sort ? `${sort.desc ? "-" : ""}${sort.id}` : "dag_display_name";
@@ -261,6 +263,7 @@ export const DagsList = () => {
   }
 
   const { data, error, isLoading } = useDags({
+    advancedSearch: advancedSearch.enabled,
     dagDisplayNamePattern: Boolean(dagDisplayNamePattern) ? dagDisplayNamePattern : undefined,
     dagRunsLimit,
     isFavorite,
@@ -291,6 +294,7 @@ export const DagsList = () => {
     <DagsLayout>
       <VStack alignItems="none">
         <SearchBar
+          advancedSearch={advancedSearch}
           defaultValue={dagDisplayNamePattern}
           onChange={handleSearchChange}
           placeholder={translate("dags:search.dags")}
diff --git a/airflow-core/src/airflow/ui/src/pages/Events/Events.tsx b/airflow-core/src/airflow/ui/src/pages/Events/Events.tsx
index 4019e28cfb818..4ec9cfad9c743 100644
--- a/airflow-core/src/airflow/ui/src/pages/Events/Events.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/Events/Events.tsx
@@ -31,6 +31,7 @@ import { ExpandCollapseButtons } from "src/components/ExpandCollapseButtons";
 import RenderedJsonField from "src/components/RenderedJsonField";
 import Time from "src/components/Time";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearchArg } from "src/hooks/useAdvancedSearch";
 
 import { EventsFilters } from "./EventsFilters";
 
@@ -184,6 +185,37 @@ export const Events = () => {
   const afterDate = afterFilter !== null && dayjs(afterFilter).isValid() ? afterFilter : undefined;
   const beforeDate = beforeFilter !== null && dayjs(beforeFilter).isValid() ? beforeFilter : undefined;
 
+  const dagIdArg = useAdvancedSearchArg({
+    patternApiKey: "dagIdPattern",
+    prefixApiKey: "dagIdPrefixPattern",
+    storageKey: DAG_ID_PARAM,
+    value: dagIdFilter,
+  });
+  const eventArg = useAdvancedSearchArg({
+    patternApiKey: "eventPattern",
+    prefixApiKey: "eventPrefixPattern",
+    storageKey: EVENT_TYPE_PARAM,
+    value: eventTypeFilter,
+  });
+  const ownerArg = useAdvancedSearchArg({
+    patternApiKey: "ownerPattern",
+    prefixApiKey: "ownerPrefixPattern",
+    storageKey: USER_PARAM,
+    value: userFilter,
+  });
+  const runIdArg = useAdvancedSearchArg({
+    patternApiKey: "runIdPattern",
+    prefixApiKey: "runIdPrefixPattern",
+    storageKey: RUN_ID_PARAM,
+    value: runIdFilter,
+  });
+  const taskIdArg = useAdvancedSearchArg({
+    patternApiKey: "taskIdPattern",
+    prefixApiKey: "taskIdPrefixPattern",
+    storageKey: TASK_ID_PARAM,
+    value: taskIdFilter,
+  });
+
   const { data, error, isFetching, isLoading } = useEventLogServiceGetEventLogs(
     {
       after: afterDate,
@@ -191,17 +223,17 @@ export const Events = () => {
       // Use exact match for URL params (dag/run/task context)
       dagId: dagId ?? undefined,
       // Use pattern search for filter inputs (partial matching)
-      dagIdPrefixPattern: dagIdFilter ?? undefined,
-      eventPrefixPattern: eventTypeFilter ?? undefined,
+      ...dagIdArg,
+      ...eventArg,
       limit: pagination.pageSize,
       mapIndex: mapIndexNumber,
       offset: pagination.pageIndex * pagination.pageSize,
       orderBy,
-      ownerPrefixPattern: userFilter ?? undefined,
+      ...ownerArg,
       runId: runId ?? undefined,
-      runIdPrefixPattern: runIdFilter ?? undefined,
+      ...runIdArg,
       taskId: taskId ?? undefined,
-      taskIdPrefixPattern: taskIdFilter ?? undefined,
+      ...taskIdArg,
       tryNumber: tryNumberNumber,
     },
     undefined,
diff --git a/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx b/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx
index a984f11bd3a58..9b9bfb518b41f 100644
--- a/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx
@@ -31,6 +31,7 @@ import { StateBadge } from "src/components/StateBadge";
 import Time from "src/components/Time";
 import { TruncatedText } from "src/components/TruncatedText";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearchArg } from "src/hooks/useAdvancedSearch";
 import { useAutoRefresh } from "src/utils";
 import { getHITLState } from "src/utils/hitl";
 import { getTaskInstanceLink } from "src/utils/links";
@@ -189,13 +190,26 @@ export const HITLTaskInstances = () => {
   // Use the filter value if available, otherwise fall back to the old responseReceived param
   const effectiveResponseReceived = filterResponseReceived ?? responseReceived;
 
+  const dagIdArg = useAdvancedSearchArg({
+    patternApiKey: "dagIdPattern",
+    prefixApiKey: "dagIdPrefixPattern",
+    storageKey: DAG_DISPLAY_NAME_PATTERN,
+    value: dagIdPattern,
+  });
+  const taskIdArg = useAdvancedSearchArg({
+    patternApiKey: "taskIdPattern",
+    prefixApiKey: "taskIdPrefixPattern",
+    storageKey: TASK_ID_PATTERN,
+    value: taskIdPattern,
+  });
+
   const { data, error, isLoading } = useTaskInstanceServiceGetHitlDetails(
     {
       bodySearch,
       createdAtGte,
       createdAtLte,
       dagId: dagId ?? "~",
-      dagIdPrefixPattern: dagIdPattern,
+      ...dagIdArg,
       dagRunId: runId ?? "~",
       limit: pagination.pageSize,
       mapIndex: parseInt(mapIndex, 10),
@@ -209,7 +223,7 @@ export const HITLTaskInstances = () => {
       state: effectiveResponseReceived === "false" ? ["deferred"] : undefined,
       subjectSearch,
       taskId,
-      taskIdPrefixPattern: taskIdPattern,
+      ...taskIdArg,
     },
     undefined,
     {
diff --git a/airflow-core/src/airflow/ui/src/pages/Pools/Pools.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/Pools.tsx
index 173ca251c86f7..89c08c22d12dd 100644
--- a/airflow-core/src/airflow/ui/src/pages/Pools/Pools.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/Pools/Pools.tsx
@@ -32,6 +32,7 @@ import { SearchBar } from "src/components/SearchBar";
 import { Select } from "src/components/ui";
 import type { SearchParamsKeysType } from "src/constants/searchParams";
 import { SearchParamsKeys } from "src/constants/searchParams";
+import { useAdvancedSearch } from "src/hooks/useAdvancedSearch";
 
 import AddPoolButton from "./AddPoolButton";
 import PoolBarCard from "./PoolBarCard";
@@ -55,6 +56,7 @@ export const Pools = () => {
   const [searchParams, setSearchParams] = useSearchParams();
   const { NAME_PATTERN, OFFSET }: SearchParamsKeysType = SearchParamsKeys;
   const [poolNamePattern, setPoolNamePattern] = useState(searchParams.get(NAME_PATTERN) ?? undefined);
+  const advancedSearch = useAdvancedSearch("pools");
 
   const { setTableURLState, tableURLState } = useTableURLState();
   const { pagination, sorting } = tableURLState;
@@ -65,7 +67,9 @@ export const Pools = () => {
     limit: pagination.pageSize,
     offset: pagination.pageIndex * pagination.pageSize,
     orderBy,
-    poolNamePrefixPattern: poolNamePattern ?? undefined,
+    ...(advancedSearch.enabled
+      ? { poolNamePattern: poolNamePattern ?? undefined }
+      : { poolNamePrefixPattern: poolNamePattern ?? undefined }),
   });
 
   const handleSearchChange = (value: string) => {
@@ -94,6 +98,7 @@ export const Pools = () => {
     <>
       <ErrorAlert error={error} />
       <SearchBar
+        advancedSearch={advancedSearch}
         defaultValue={poolNamePattern ?? ""}
         onChange={handleSearchChange}
         placeholder={translate("pools.searchPlaceholder")}
diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.tsx
index b1bae646d60ab..ef7eb46808f51 100644
--- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.tsx
@@ -26,6 +26,7 @@ import { AssetEvents as AssetEventsTable } from "src/components/Assets/AssetEven
 import { useTableURLState } from "src/components/DataTable/useTableUrlState";
 import { SearchBar } from "src/components/SearchBar";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearch } from "src/hooks/useAdvancedSearch";
 import { isStatePending, useAutoRefresh } from "src/utils";
 
 export const AssetEvents = () => {
@@ -35,6 +36,7 @@ export const AssetEvents = () => {
   const { t: translate } = useTranslation(["assets"]);
 
   const [assetNameSearch, setAssetNameSearch] = useState(searchParams.get(NAME_PATTERN) ?? "");
+  const advancedSearch = useAdvancedSearch("asset-events");
 
   const parsedMapIndex = parseInt(mapIndex, 10);
 
@@ -85,7 +87,9 @@ export const AssetEvents = () => {
   const { data: assetEventsData, isLoading } = useAssetServiceGetAssetEvents(
     {
       limit: pagination.pageSize,
-      namePrefixPattern: assetNameSearch || undefined,
+      ...(advancedSearch.enabled
+        ? { namePattern: assetNameSearch || undefined }
+        : { namePrefixPattern: assetNameSearch || undefined }),
       offset: pagination.pageIndex * pagination.pageSize,
       orderBy,
       sourceDagId: dagId,
@@ -103,6 +107,7 @@ export const AssetEvents = () => {
     <Box>
       <Box maxWidth="500px" mb={4}>
         <SearchBar
+          advancedSearch={advancedSearch}
           defaultValue={assetNameSearch}
           hotkeyDisabled
           onChange={handleSearchChange}
diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
index 05209dd6811d3..7748a3b2a075a 100644
--- a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
@@ -39,6 +39,7 @@ import { TruncatedText } from "src/components/TruncatedText";
 import { ActionBar } from "src/components/ui/ActionBar";
 import { Checkbox } from "src/components/ui/Checkbox";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearchArg } from "src/hooks/useAdvancedSearch";
 import { useAutoRefresh, isStatePending, renderDuration } from "src/utils";
 import { getTaskInstanceLink } from "src/utils/links";
 
@@ -295,11 +296,48 @@ export const TaskInstances = () => {
 
   const refetchInterval = useAutoRefresh({});
 
+  const dagIdPatternArg = useAdvancedSearchArg({
+    patternApiKey: "dagIdPattern",
+    prefixApiKey: "dagIdPrefixPattern",
+    storageKey: DAG_ID_PATTERN_PARAM,
+    value: filteredDagIdPattern,
+  });
+  const runIdPatternArg = useAdvancedSearchArg({
+    patternApiKey: "runIdPattern",
+    prefixApiKey: "runIdPrefixPattern",
+    storageKey: RUN_ID_PATTERN_PARAM,
+    value: filteredRunId,
+  });
+  const taskDisplayNameArg = useAdvancedSearchArg({
+    patternApiKey: "taskDisplayNamePattern",
+    prefixApiKey: "taskDisplayNamePrefixPattern",
+    storageKey: NAME_PATTERN_PARAM,
+    value: taskDisplayNamePattern,
+  });
+  const operatorNameArg = useAdvancedSearchArg({
+    patternApiKey: "operatorNamePattern",
+    prefixApiKey: "operatorNamePrefixPattern",
+    storageKey: OPERATOR_NAME_PATTERN_PARAM,
+    value: operatorNamePattern,
+  });
+  const poolNameArg = useAdvancedSearchArg({
+    patternApiKey: "poolNamePattern",
+    prefixApiKey: "poolNamePrefixPattern",
+    storageKey: POOL_NAME_PATTERN_PARAM,
+    value: poolNamePattern,
+  });
+  const queueNameArg = useAdvancedSearchArg({
+    patternApiKey: "queueNamePattern",
+    prefixApiKey: "queueNamePrefixPattern",
+    storageKey: QUEUE_NAME_PATTERN_PARAM,
+    value: queueNamePattern,
+  });
+
   const { data, error, isLoading } = useTaskInstanceServiceGetTaskInstances(
     {
       cursor: cursor ?? "",
       dagId: dagId ?? "~",
-      dagIdPrefixPattern: filteredDagIdPattern ?? undefined,
+      ...dagIdPatternArg,
       dagRunId: runId ?? "~",
       durationGte: durationGte !== null && durationGte !== "" ? Number(durationGte) : undefined,
       durationLte: durationLte !== null && durationLte !== "" ? Number(durationLte) : undefined,
@@ -308,14 +346,14 @@ export const TaskInstances = () => {
       logicalDateGte: logicalDateGte ?? undefined,
       logicalDateLte: logicalDateLte ?? undefined,
       mapIndex: mapIndexFilter !== null && mapIndexFilter !== "" ? [Number(mapIndexFilter)] : undefined,
-      operatorNamePrefixPattern: operatorNamePattern ?? undefined,
+      ...operatorNameArg,
       orderBy,
-      poolNamePrefixPattern: poolNamePattern ?? undefined,
-      queueNamePrefixPattern: queueNamePattern ?? undefined,
-      runIdPrefixPattern: filteredRunId ?? undefined,
+      ...poolNameArg,
+      ...queueNameArg,
+      ...runIdPatternArg,
       startDateGte: startDate ?? undefined,
       state: hasFilteredState ? filteredState : undefined,
-      taskDisplayNamePrefixPattern: taskDisplayNamePattern ?? undefined,
+      ...taskDisplayNameArg,
       taskGroupId: groupId ?? undefined,
       taskId: Boolean(groupId) ? undefined : taskId,
       tryNumber: tryNumberFilter !== null && tryNumberFilter !== "" ? [Number(tryNumberFilter)] : undefined,
diff --git a/airflow-core/src/airflow/ui/src/pages/Variables/Variables.tsx b/airflow-core/src/airflow/ui/src/pages/Variables/Variables.tsx
index f94133e183e59..bae62e719d03d 100644
--- a/airflow-core/src/airflow/ui/src/pages/Variables/Variables.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/Variables/Variables.tsx
@@ -35,6 +35,7 @@ import { Tooltip } from "src/components/ui";
 import { ActionBar } from "src/components/ui/ActionBar";
 import { Checkbox } from "src/components/ui/Checkbox";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearch } from "src/hooks/useAdvancedSearch";
 import { useConfig } from "src/queries/useConfig.tsx";
 import { TrimText } from "src/utils/TrimText";
 
@@ -155,6 +156,7 @@ export const Variables = () => {
   const { onClose, onOpen, open } = useDisclosure();
   const { NAME_PATTERN, OFFSET }: SearchParamsKeysType = SearchParamsKeys;
   const [variableKeyPattern, setVariableKeyPattern] = useState(searchParams.get(NAME_PATTERN) ?? undefined);
+  const advancedSearch = useAdvancedSearch("variables");
   const { pagination, sorting } = tableURLState;
   const [sort] = sorting;
   const orderBy = sort ? [`${sort.desc ? "-" : ""}${sort.id === "value" ? "_val" : sort.id}`] : ["-key"];
@@ -164,7 +166,9 @@ export const Variables = () => {
     limit: pagination.pageSize,
     offset: pagination.pageIndex * pagination.pageSize,
     orderBy,
-    variableKeyPrefixPattern: variableKeyPattern ?? undefined,
+    ...(advancedSearch.enabled
+      ? { variableKeyPattern: variableKeyPattern ?? undefined }
+      : { variableKeyPrefixPattern: variableKeyPattern ?? undefined }),
   });
 
   const { allRowsSelected, clearSelections, handleRowSelect, handleSelectAll, selectedRows } =
@@ -202,6 +206,7 @@ export const Variables = () => {
     <>
       <VStack alignItems="none">
         <SearchBar
+          advancedSearch={advancedSearch}
           defaultValue={variableKeyPattern ?? ""}
           onChange={handleSearchChange}
           placeholder={translate("variables.searchPlaceholder")}
diff --git a/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx b/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx
index 5c0f457308964..7869f54f0d47e 100644
--- a/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx
@@ -30,6 +30,7 @@ import { ExpandCollapseButtons } from "src/components/ExpandCollapseButtons";
 import Time from "src/components/Time";
 import { TruncatedText } from "src/components/TruncatedText";
 import { SearchParamsKeys, type SearchParamsKeysType } from "src/constants/searchParams";
+import { useAdvancedSearchArg } from "src/hooks/useAdvancedSearch";
 import { getTaskInstanceLink } from "src/utils/links";
 
 import AddXComButton from "./AddXComButton";
@@ -165,8 +166,33 @@ export const XCom = () => {
   const runAfterGte = searchParams.get(RUN_AFTER_GTE);
   const runAfterLte = searchParams.get(RUN_AFTER_LTE);
 
+  const dagDisplayNameArg = useAdvancedSearchArg({
+    patternApiKey: "dagDisplayNamePattern",
+    prefixApiKey: "dagDisplayNamePrefixPattern",
+    storageKey: DAG_DISPLAY_NAME_PATTERN_PARAM,
+    value: filteredDagDisplayName,
+  });
+  const runIdArg = useAdvancedSearchArg({
+    patternApiKey: "runIdPattern",
+    prefixApiKey: "runIdPrefixPattern",
+    storageKey: RUN_ID_PATTERN_PARAM,
+    value: filteredRunId,
+  });
+  const taskIdArg = useAdvancedSearchArg({
+    patternApiKey: "taskIdPattern",
+    prefixApiKey: "taskIdPrefixPattern",
+    storageKey: TASK_ID_PATTERN_PARAM,
+    value: filteredTaskId,
+  });
+  const xcomKeyArg = useAdvancedSearchArg({
+    patternApiKey: "xcomKeyPattern",
+    prefixApiKey: "xcomKeyPrefixPattern",
+    storageKey: KEY_PATTERN_PARAM,
+    value: filteredKey,
+  });
+
   const apiParams = {
-    dagDisplayNamePrefixPattern: filteredDagDisplayName ?? undefined,
+    ...dagDisplayNameArg,
     dagId,
     dagRunId: runId,
     limit: pagination.pageSize,
@@ -182,10 +208,10 @@ export const XCom = () => {
     orderBy,
     runAfterGte: runAfterGte ?? undefined,
     runAfterLte: runAfterLte ?? undefined,
-    runIdPrefixPattern: filteredRunId ?? undefined,
+    ...runIdArg,
     taskId,
-    taskIdPrefixPattern: filteredTaskId ?? undefined,
-    xcomKeyPrefixPattern: filteredKey ?? undefined,
+    ...taskIdArg,
+    ...xcomKeyArg,
   };
 
   const { data, error, isFetching, isLoading } = useXcomServiceGetXcomEntries(apiParams, undefined);
diff --git a/airflow-core/src/airflow/ui/src/queries/useDags.tsx b/airflow-core/src/airflow/ui/src/queries/useDags.tsx
index 7253ac966e24b..4be8244ce73ce 100644
--- a/airflow-core/src/airflow/ui/src/queries/useDags.tsx
+++ b/airflow-core/src/airflow/ui/src/queries/useDags.tsx
@@ -25,6 +25,7 @@ export type DagWithLatest = {
 } & DAGWithLatestDagRunsResponse;
 
 export const useDags = ({
+  advancedSearch = false,
   dagDisplayNamePattern,
   dagIdPattern,
   dagRunsLimit,
@@ -40,6 +41,7 @@ export const useDags = ({
   tags,
   tagsMatchMode,
 }: {
+  advancedSearch?: boolean;
   dagDisplayNamePattern?: string;
   dagIdPattern?: string;
   dagRunsLimit: number;
@@ -59,8 +61,9 @@ export const useDags = ({
 
   const { data, error, isFetching, isLoading } = useDagServiceGetDagsUi(
     {
-      dagDisplayNamePrefixPattern: dagDisplayNamePattern,
-      dagIdPrefixPattern: dagIdPattern,
+      ...(advancedSearch
+        ? { dagDisplayNamePattern, dagIdPattern }
+        : { dagDisplayNamePrefixPattern: dagDisplayNamePattern, dagIdPrefixPattern: dagIdPattern }),
       dagRunsLimit,
       excludeStale,
       hasPendingActions: pendingHitl,
