diff --git a/frontend/src/container/LogsExplorerViews/index.tsx b/frontend/src/container/LogsExplorerViews/index.tsx
index 35aa3f6e33..bc7002e7dc 100644
--- a/frontend/src/container/LogsExplorerViews/index.tsx
+++ b/frontend/src/container/LogsExplorerViews/index.tsx
@@ -264,7 +264,8 @@ function LogsExplorerViews({
undefined,
listQueryKeyRef,
{
- ...(!isEmpty(queryId) && { 'X-SIGNOZ-QUERY-ID': queryId }),
+ ...(!isEmpty(queryId) &&
+ selectedPanelType !== PANEL_TYPES.LIST && { 'X-SIGNOZ-QUERY-ID': queryId }),
},
);
diff --git a/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchDropdown.tsx b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchDropdown.tsx
new file mode 100644
index 0000000000..c910ca1be4
--- /dev/null
+++ b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchDropdown.tsx
@@ -0,0 +1,112 @@
+/* eslint-disable no-nested-ternary */
+import { Typography } from 'antd';
+import {
+ ArrowDown,
+ ArrowUp,
+ ChevronUp,
+ Command,
+ CornerDownLeft,
+ Slash,
+} from 'lucide-react';
+import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
+import { getUserOperatingSystem, UserOperatingSystem } from 'utils/getUserOS';
+
+import ExampleQueriesRendererForLogs from '../QueryBuilderSearch/ExampleQueriesRendererForLogs';
+import { convertExampleQueriesToOptions } from '../QueryBuilderSearch/utils';
+import { ITag, Option } from './QueryBuilderSearchV2';
+
+interface ICustomDropdownProps {
+ menu: React.ReactElement;
+ searchValue: string;
+ tags: ITag[];
+ options: Option[];
+ exampleQueries: TagFilter[];
+ onChange: (value: TagFilter) => void;
+ currentFilterItem?: ITag;
+}
+
+export default function QueryBuilderSearchDropdown(
+ props: ICustomDropdownProps,
+): React.ReactElement {
+ const {
+ menu,
+ currentFilterItem,
+ searchValue,
+ tags,
+ exampleQueries,
+ options,
+ onChange,
+ } = props;
+ const userOs = getUserOperatingSystem();
+ return (
+ <>
+
+ {!currentFilterItem?.key ? (
+
Suggested Filters
+ ) : !currentFilterItem?.op ? (
+
+
+ Operator for{' '}
+
+
+ {currentFilterItem?.key?.key}
+
+
+ ) : (
+
+
+ Value(s) for{' '}
+
+
+ {currentFilterItem?.key?.key} {currentFilterItem?.op}
+
+
+ )}
+ {menu}
+ {!searchValue && tags.length === 0 && (
+
+
Example Queries
+
+ {convertExampleQueriesToOptions(exampleQueries).map((query) => (
+
+ ))}
+
+
+ )}
+
+
+
+
+
+ {!currentFilterItem?.key && options.length > 3 && (
+
+ {userOs === UserOperatingSystem.MACOS ? (
+
+ ) : (
+
+ )}
+ +
+
+ Show all filter items
+
+ )}
+
+ >
+ );
+}
+
+QueryBuilderSearchDropdown.defaultProps = {
+ currentFilterItem: undefined,
+};
diff --git a/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2.styles.scss b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2.styles.scss
new file mode 100644
index 0000000000..1ca8bd7529
--- /dev/null
+++ b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2.styles.scss
@@ -0,0 +1,261 @@
+.query-builder-search-v2 {
+ display: flex;
+ gap: 4px;
+
+ .show-all-filters {
+ .content {
+ .rc-virtual-list-holder {
+ height: 100px;
+ }
+ }
+ }
+
+ .content {
+ .suggested-filters {
+ color: var(--bg-slate-50);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 18px;
+ letter-spacing: 0.88px;
+ text-transform: uppercase;
+ padding: 12px 0px 8px 14px;
+ }
+
+ .operator-for {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ padding: 12px 0px 8px 14px;
+
+ .operator-for-text {
+ color: var(--bg-slate-200);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 18px; /* 163.636% */
+ letter-spacing: 0.88px;
+ text-transform: uppercase;
+ }
+
+ .operator-for-value {
+ display: flex;
+ align-items: center;
+ height: 20px;
+ padding: 0px 8px;
+ justify-content: center;
+ gap: 4px;
+ border-radius: 50px;
+ background: rgba(255, 255, 255, 0.1);
+ color: var(--bg-vanilla-400);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 18px; /* 150% */
+ letter-spacing: -0.06px;
+ }
+ }
+
+ .value-for {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ padding: 12px 0px 8px 14px;
+ .value-for-text {
+ color: var(--bg-slate-200);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 18px; /* 163.636% */
+ letter-spacing: 0.88px;
+ text-transform: uppercase;
+ }
+
+ .value-for-value {
+ display: flex;
+ align-items: center;
+ height: 20px;
+ padding: 0px 8px;
+ justify-content: center;
+ gap: 4px;
+ border-radius: 50px;
+ background: rgba(255, 255, 255, 0.1);
+ color: var(--bg-vanilla-400);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 18px; /* 150% */
+ letter-spacing: -0.06px;
+ }
+ }
+ .example-queries {
+ cursor: default;
+ .heading {
+ padding: 12px 14px 8px 14px;
+ color: var(--bg-slate-50);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 18px; /* 163.636% */
+ letter-spacing: 0.88px;
+ text-transform: uppercase;
+ }
+
+ .query-container {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ padding: 0px 12px 12px 12px;
+ cursor: pointer;
+
+ .example-query {
+ display: flex;
+ padding: 4px 8px;
+ justify-content: center;
+ align-items: center;
+ gap: 10px;
+ border-radius: 2px;
+ background: var(--bg-ink-200);
+ color: var(--bg-vanilla-400);
+ font-family: Inter;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: normal;
+ letter-spacing: -0.07px;
+ width: fit-content;
+ }
+
+ .example-query:hover {
+ color: var(--bg-vanilla-100);
+ }
+ }
+ }
+ }
+
+ .keyboard-shortcuts {
+ display: flex;
+ align-items: center;
+ border-radius: 0px 0px 4px 4px;
+ border: 1px solid var(--bg-slate-400);
+ background: var(--bg-ink-300);
+ padding: 11px 16px;
+ cursor: default;
+
+ .icons {
+ width: 16px;
+ height: 16px;
+ flex-shrink: 0;
+ border-radius: 2.286px;
+ border-top: 1.143px solid var(--bg-ink-200);
+ border-right: 1.143px solid var(--bg-ink-200);
+ border-bottom: 2.286px solid var(--bg-ink-200);
+ border-left: 1.143px solid var(--bg-ink-200);
+ background: var(--Ink-400, #121317);
+ }
+
+ .keyboard-text {
+ color: var(--bg-vanilla-400);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 18px; /* 142.857% */
+ letter-spacing: -0.07px;
+ }
+
+ .navigate {
+ display: flex;
+ align-items: center;
+ padding-right: 12px;
+ gap: 4px;
+ border-right: 1px solid #1d212d;
+ }
+
+ .update-query {
+ display: flex;
+ align-items: center;
+ margin-left: 12px;
+ gap: 4px;
+ }
+ .show-all-filter-items {
+ padding-left: 12px;
+ border-left: 1px solid #1d212d;
+ display: flex;
+ align-items: center;
+ margin-left: 12px;
+ gap: 4px;
+ }
+ }
+
+ .search-bar {
+ width: 100%;
+ }
+
+ .qb-search-bar-tokenised-tags {
+ .ant-tag {
+ display: flex;
+ align-items: center;
+ border-radius: 2px 0px 0px 2px;
+ border: 1px solid var(--bg-slate-300);
+ background: var(--bg-slate-300);
+ box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1);
+ padding: 0px;
+
+ .ant-typography {
+ color: var(--bg-vanilla-100);
+ font-family: Inter;
+ font-size: 14px !important;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 142.857% */
+ padding: 2px 6px;
+ }
+
+ .ant-tag-close-icon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 0px 2px 2px 0px;
+ width: 20px;
+ height: 24px;
+ flex-shrink: 0;
+ margin-inline-start: 0px !important;
+ margin-inline-end: 0px !important;
+ }
+
+ &.resource {
+ border: 1px solid rgba(242, 71, 105, 0.2);
+
+ .ant-typography {
+ color: var(--bg-sakura-400);
+ background: rgba(245, 108, 135, 0.1);
+ font-size: 14px;
+ }
+
+ .ant-tag-close-icon {
+ background: rgba(245, 108, 135, 0.1);
+ }
+ }
+ &.tag {
+ border: 1px solid rgba(189, 153, 121, 0.2);
+
+ .ant-typography {
+ color: var(--bg-sienna-400);
+ background: rgba(189, 153, 121, 0.1);
+ font-size: 14px;
+ }
+
+ .ant-tag-close-icon {
+ background: rgba(189, 153, 121, 0.1);
+ }
+ }
+ }
+ }
+}
diff --git a/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2.tsx b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2.tsx
new file mode 100644
index 0000000000..d53a517c48
--- /dev/null
+++ b/frontend/src/container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2.tsx
@@ -0,0 +1,862 @@
+/* eslint-disable sonarjs/cognitive-complexity */
+import './QueryBuilderSearchV2.styles.scss';
+
+import { Select, Spin, Tag, Tooltip } from 'antd';
+import cx from 'classnames';
+import {
+ OPERATORS,
+ QUERY_BUILDER_OPERATORS_BY_TYPES,
+ QUERY_BUILDER_SEARCH_VALUES,
+} from 'constants/queryBuilder';
+import { DEBOUNCE_DELAY } from 'constants/queryBuilderFilterConfig';
+import ROUTES from 'constants/routes';
+import { LogsExplorerShortcuts } from 'constants/shortcuts/logsExplorerShortcuts';
+import { useKeyboardHotkeys } from 'hooks/hotkeys/useKeyboardHotkeys';
+import { WhereClauseConfig } from 'hooks/queryBuilder/useAutoComplete';
+import { useGetAggregateKeys } from 'hooks/queryBuilder/useGetAggregateKeys';
+import { useGetAggregateValues } from 'hooks/queryBuilder/useGetAggregateValues';
+import { useGetAttributeSuggestions } from 'hooks/queryBuilder/useGetAttributeSuggestions';
+import { validationMapper } from 'hooks/queryBuilder/useIsValidTag';
+import { operatorTypeMapper } from 'hooks/queryBuilder/useOperatorType';
+import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
+import useDebounceValue from 'hooks/useDebounce';
+import {
+ cloneDeep,
+ isArray,
+ isEmpty,
+ isEqual,
+ isObject,
+ isUndefined,
+ unset,
+} from 'lodash-es';
+import { ChevronDown, ChevronUp } from 'lucide-react';
+import type { BaseSelectRef } from 'rc-select';
+import {
+ KeyboardEvent,
+ ReactElement,
+ useCallback,
+ useEffect,
+ useMemo,
+ useRef,
+ useState,
+} from 'react';
+import { useLocation } from 'react-router-dom';
+import {
+ BaseAutocompleteData,
+ DataTypes,
+} from 'types/api/queryBuilder/queryAutocompleteResponse';
+import {
+ IBuilderQuery,
+ TagFilter,
+} from 'types/api/queryBuilder/queryBuilderData';
+import { DataSource } from 'types/common/queryBuilder';
+import { popupContainer } from 'utils/selectPopupContainer';
+import { v4 as uuid } from 'uuid';
+
+import { selectStyle } from '../QueryBuilderSearch/config';
+import { PLACEHOLDER } from '../QueryBuilderSearch/constant';
+import { TypographyText } from '../QueryBuilderSearch/style';
+import { getTagToken, isInNInOperator } from '../QueryBuilderSearch/utils';
+import QueryBuilderSearchDropdown from './QueryBuilderSearchDropdown';
+import Suggestions from './Suggestions';
+
+export interface ITag {
+ id?: string;
+ key: BaseAutocompleteData;
+ op: string;
+ value: string[] | string | number | boolean;
+}
+
+interface CustomTagProps {
+ label: React.ReactNode;
+ value: string;
+ disabled: boolean;
+ onClose: () => void;
+ closable: boolean;
+}
+
+interface QueryBuilderSearchV2Props {
+ query: IBuilderQuery;
+ onChange: (value: TagFilter) => void;
+ whereClauseConfig?: WhereClauseConfig;
+ placeholder?: string;
+ className?: string;
+ suffixIcon?: React.ReactNode;
+}
+
+export interface Option {
+ label: string;
+ value: BaseAutocompleteData | string;
+}
+
+export enum DropdownState {
+ ATTRIBUTE_KEY = 'ATTRIBUTE_KEY',
+ OPERATOR = 'OPERATOR',
+ ATTRIBUTE_VALUE = 'ATTRIBUTE_VALUE',
+}
+
+function getInitTags(query: IBuilderQuery): ITag[] {
+ return query.filters.items.map((item) => ({
+ id: item.id,
+ key: item.key as BaseAutocompleteData,
+ op: item.op,
+ value: `${item.value}`,
+ }));
+}
+
+function QueryBuilderSearchV2(
+ props: QueryBuilderSearchV2Props,
+): React.ReactElement {
+ const {
+ query,
+ onChange,
+ placeholder,
+ className,
+ suffixIcon,
+ whereClauseConfig,
+ } = props;
+
+ const { registerShortcut, deregisterShortcut } = useKeyboardHotkeys();
+
+ const { handleRunQuery, currentQuery } = useQueryBuilder();
+
+ const selectRef = useRef(null);
+
+ const [isOpen, setIsOpen] = useState(false);
+
+ // create the tags from the initial query here, this should only be computed on the first load as post that tags and query will be always in sync.
+ const [tags, setTags] = useState(() => getInitTags(query));
+
+ // this will maintain the current state of in process filter item
+ const [currentFilterItem, setCurrentFilterItem] = useState();
+
+ const [currentState, setCurrentState] = useState(
+ DropdownState.ATTRIBUTE_KEY,
+ );
+
+ // to maintain the current running state until the tokenization happens for the tag
+ const [searchValue, setSearchValue] = useState('');
+
+ const [dropdownOptions, setDropdownOptions] = useState