跳至內容
Fumadocs

FlexSearch

快速且輕量的文件搜尋

設定

npm install flexsearch
npm install @types/flexsearch -D

從來源建立

從來源物件建立伺服器。

app/api/search/route.ts
import { source } from '@/lib/source';
import { flexsearchFromSource } from 'fumadocs-core/search/flexsearch';

export const { GET } = flexsearchFromSource(source);

從搜尋索引建立

從搜尋索引建立伺服器,每個索引都需要一個 structuredData 欄位。

這個欄位通常由您的內容來源 (例如 Fumadocs MDX) 提供。您也可以使用 Remark Structure 外掛,從 Markdown/MDX 文件中擷取。

在您的搜尋路由中改用此伺服器,取代 flexsearchFromSource():

import { source } from '@/lib/source';
import { flexsearch } from 'fumadocs-core/search/flexsearch';

const server = flexsearch({
  indexes: source.getPages().map((page) => ({
    title: page.data.title!,
    description: page.data.description,
    url: page.url,
    id: page.url,
    structuredData: page.data.structuredData,
  })),
});

搜尋文件

您可以透過以下方式搜尋文件:

  • Fumadocs UI:已內建支援,詳情請參閱搜尋 UI。
  • 搜尋用戶端:
import {  } from 'fumadocs-core/search/client';

const { , , ,  } = ();

屬性

型別

設定

標籤篩選

支援依標籤篩選結果,適合用來實作類似本文件網站的多文件架構。

import { source } from '@/lib/source';
import { flexsearchFromSource } from 'fumadocs-core/search/flexsearch';

const server = flexsearchFromSource(source, {
  buildIndex(page) {
    return {
      title: page.data.title!,
      description: page.data.description,
      url: page.url,
      id: page.url,
      structuredData: page.data.structuredData,
      // 填入您需要的值,例如 page.slugs[0]
      tag: '<value>',
    };
  },
});

並更新您的搜尋用戶端:

  • Fumadocs UI:在搜尋 UI 中設定標籤篩選。
  • 搜尋用戶端:將標籤傳入 useFetchSearch()。
import { useFetchSearch } from 'fumadocs-core/search/client';

const { search, onSearchChange, isLoading, data } = useFetchSearch({
  tag: '<value>', 
});

靜態模式

若要在靜態網站中使用,請使用搜尋伺服器提供的 staticGET,並將路由設為靜態或預先算繪。

app/api/search/route.ts
import { source } from '@/lib/source';
import { flexsearchFromSource } from 'fumadocs-core/search/flexsearch';

// 靜態快取
export const revalidate = false;
export const { staticGET: GET } = flexsearchFromSource(source);

flexsearch() 也提供 staticGET。

接著更新您的搜尋用戶端:

  • Fumadocs UI:在搜尋 UI 中使用靜態用戶端。

  • 搜尋用戶端:更換您的用戶端轉接器。

    import { useFlexsearchStatic } from 'fumadocs-core/search/client/flexsearch-static';
    
    const { search, onSearchChange, isLoading, data } = useFlexsearchStatic({
      // 選用:傳入標籤與語系
      tag,
    });

    屬性

    型別

請注意

靜態搜尋需要用戶端下載匯出的搜尋索引。 對於大型文件網站而言,這可能會耗費大量資源。

遇到這類情況,建議您改用 Orama Cloud 或 Algolia 等雲端解決方案。

國際化

Flexsearch 不需要額外設定即可支援其他語言,但您可以為每個語系指定 Flexsearch 選項,讓搜尋結果更準確。

import { source } from '@/lib/source';
import { flexsearchFromSource } from 'fumadocs-core/search/flexsearch';
import { Charset } from 'flexsearch';

const server = flexsearchFromSource(source, {
  localeMap: {
    // [locale]:Flexsearch 選項
    jp: { encoder: Charset.CJK },
  },
});

How is this guide?

最後更新於