Yuki Takei 1 год назад
Родитель
Сommit
c7dea253e5

+ 12 - 2
apps/app/src/features/search/client/components/SearchModal.tsx

@@ -16,7 +16,9 @@ import { SearchMethodMenuItem } from './SearchMethodMenuItem';
 import { SearchResultMenuItem } from './SearchResultMenuItem';
 
 const SearchModal = (): JSX.Element => {
+
   const [searchKeyword, setSearchKeyword] = useState('');
+  const [isMenthionedToAi, setMenthionedToAi] = useState(false);
 
   const { data: searchModalData, close: closeSearchModal } = useSearchModal();
 
@@ -32,7 +34,9 @@ const SearchModal = (): JSX.Element => {
   }, [closeSearchModal, router]);
 
   const submitHandler = useCallback(() => {
-    router.push(`/_search?q=${searchKeyword}`);
+    const url = new URL('_search', 'http://example.com');
+    url.searchParams.set('q', searchKeyword);
+    router.push(url.pathname + url.search);
     closeSearchModal();
   }, [closeSearchModal, router, searchKeyword]);
 
@@ -60,6 +64,10 @@ const SearchModal = (): JSX.Element => {
     }
   }, [searchModalData?.isOpened, searchModalData?.searchKeyword]);
 
+  useEffect(() => {
+    setMenthionedToAi(searchKeyword.includes('@ai'));
+  }, [searchKeyword]);
+
   return (
     <Modal size="lg" isOpen={searchModalData?.isOpened ?? false} toggle={closeSearchModal} data-testid="search-modal">
       <ModalBody className="pb-2">
@@ -77,7 +85,9 @@ const SearchModal = (): JSX.Element => {
           }) => (
             <div {...getRootProps({}, { suppressRefError: true })}>
               <div className="text-muted d-flex justify-content-center align-items-center p-1">
-                <span className="material-symbols-outlined fs-4 me-3">search</span>
+                <span className={`material-symbols-outlined fs-4 me-3 ${isMenthionedToAi ? 'text-primary' : ''}`}>
+                  {isMenthionedToAi ? 'psychology' : 'search'}
+                </span>
                 <SearchForm
                   searchKeyword={searchKeyword}
                   onChange={changeSearchTextHandler}

+ 7 - 1
apps/app/src/server/service/search.ts

@@ -39,7 +39,9 @@ const filterXss = new FilterXSS(filterXssOptions);
 
 const normalizeQueryString = (_queryString: string): string => {
   let queryString = _queryString.trim();
-  queryString = queryString.replace(/\s+/g, ' ');
+  queryString = queryString
+    .replace(/\s+@ai\s+/g, ' ') // omit '@ai' keyword
+    .replace(/\s+/g, ' ');
 
   return queryString;
 };
@@ -300,6 +302,10 @@ class SearchService implements SearchQueryParser, SearchResolver {
       throw err;
     }
 
+    if (keyword.includes('@ai')) {
+      searchOpts.vector = true;
+    }
+
     let delegator: SearchDelegator;
     let data: SearchableData;
     // resolve