[{"data":1,"prerenderedAt":2202},["ShallowReactive",2],{"content-/search-page-performance-optimization-2026-01-30":3,"all-pages-for-dir":2179,"related-/search-page-performance-optimization-2026-01-30":2180,"og-image-/search-page-performance-optimization-2026-01-30":2201},{"id":4,"title":5,"body":6,"category":2159,"concepts":2160,"description":2161,"extension":2162,"meta":2163,"navigation":591,"ogImage":2160,"path":2164,"project_name":2165,"published":2166,"publishedAt":2167,"seo":2168,"source":2169,"stem":2170,"tags":2171,"todo":2177,"unpublished":2166,"updatedAt":2160,"__hash__":2178},"pages/2026-01/2026-01-30/search-page-performance-optimization-2026-01-30.md","Nuxtブログの検索ページ軽量化 - FlexSearch削除とselect()による最適化",{"type":7,"value":8,"toc":2138},"minimark",[9,13,17,38,41,45,52,157,164,168,171,179,182,185,194,197,206,254,260,280,283,290,300,443,452,458,466,470,476,501,515,519,527,1183,1186,1230,1234,1240,1836,1848,1852,1855,1920,1923,1927,1945,1994,1997,2084,2088,2095,2101,2104,2107,2134],[10,11,5],"h1",{"id":12},"nuxtブログの検索ページ軽量化-flexsearch削除とselectによる最適化",[14,15,16],"h2",{"id":16},"この記事の概要",[18,19,20,21,25,26,29,30,33,34,37],"p",{},"Nuxt Content製ブログの検索ページ（",[22,23,24],"code",{},"/search","）が遅かった。原因は全記事のbody AST（約20MB）を一括取得していたこと。FlexSearchライブラリを削除し、",[22,27,28],{},".select()"," による必要フィールドのみの取得と ",[22,31,32],{},"filter"," + ",[22,35,36],{},"includes"," ベースの部分一致検索に切り替えた。結果として、payloadが20MBから数十KBに減り、ページ表示速度が改善された。",[14,39,40],{"id":40},"改善前の問題",[42,43,44],"h3",{"id":44},"何が遅かったのか",[18,46,47,48,51],{},"検索ページでは ",[22,49,50],{},"queryCollection('pages').all()"," で全記事を取得していた。",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-ts shiki shiki-themes vitesse-light vitesse-light","// 改善前: body ASTを含む全フィールドを取得\nconst { data: allArticles } = await useAsyncData('search-articles', () =>\n  queryCollection('pages').all()\n)\n","ts","",[22,60,61,70,127,151],{"__ignoreMap":58},[62,63,66],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sxvE3","// 改善前: body ASTを含む全フィールドを取得\n",[62,71,73,77,81,85,88,91,94,97,101,105,108,112,116,118,121,124],{"class":64,"line":72},2,[62,74,76],{"class":75},"stQ0i","const ",[62,78,80],{"class":79},"shFtX","{",[62,82,84],{"class":83},"s4oTP"," data",[62,86,87],{"class":79},":",[62,89,90],{"class":83}," allArticles",[62,92,93],{"class":79}," }",[62,95,96],{"class":79}," =",[62,98,100],{"class":99},"sHkkW"," await",[62,102,104],{"class":103},"senZ8"," useAsyncData",[62,106,107],{"class":79},"(",[62,109,111],{"class":110},"sMJiu","'",[62,113,115],{"class":114},"sdGka","search-articles",[62,117,111],{"class":110},[62,119,120],{"class":79},",",[62,122,123],{"class":79}," ()",[62,125,126],{"class":79}," =>\n",[62,128,130,133,135,137,140,142,145,148],{"class":64,"line":129},3,[62,131,132],{"class":103},"  queryCollection",[62,134,107],{"class":79},[62,136,111],{"class":110},[62,138,139],{"class":114},"pages",[62,141,111],{"class":110},[62,143,144],{"class":79},").",[62,146,147],{"class":103},"all",[62,149,150],{"class":79},"()\n",[62,152,154],{"class":64,"line":153},4,[62,155,156],{"class":79},")\n",[18,158,159,160,163],{},"この呼び出しが返すデータには、各記事のMarkdown本文をパースしたAST（Abstract Syntax Tree）が含まれる。471記事分のASTを合わせると約20MBになり、それが ",[22,161,162],{},"_payload.json"," としてブラウザに転送されていた。",[42,165,167],{"id":166},"flexsearchの問題","FlexSearchの問題",[18,169,170],{},"取得した全記事データを使って、クライアント側でFlexSearchのインデックスを構築していた。",[53,172,177],{"className":173,"code":175,"language":176},[174],"language-text","ブラウザ → 全記事取得（20MB） → FlexSearchインデックス構築 → 検索実行\n","text",[22,178,175],{"__ignoreMap":58},[18,180,181],{},"FlexSearchのインデックス構築では、ASTからテキストを再帰的に抽出する処理が走る。471記事分のAST→テキスト変換がページ表示をブロックし、検索ページを開くまで数秒から十数秒かかることがあった。",[42,183,184],{"id":184},"ビルドへの影響",[18,186,187,188,190,191,193],{},"ビルド時間にも影響していた。",[22,189,24],{}," をプリレンダリング対象にしていたとき、",[22,192,162],{}," が20MBに膨らみ、Server Buildに264.8秒かかっていた。プリレンダリングからの除外で138.1秒に短縮（48%削減）できたが、ランタイムの読み込み速度は改善されていなかった。",[14,195,196],{"id":196},"改善方針の検討",[18,198,199,200,205],{},"前日に作成した",[201,202,204],"a",{"href":203},"/search-page-performance-plan","検索ページパフォーマンス改善計画","で、2つの方針を比較した。",[207,208,209,225],"table",{},[210,211,212],"thead",{},[213,214,215,219,222],"tr",{},[216,217,218],"th",{},"方式",[216,220,221],{},"メリット",[216,223,224],{},"デメリット",[226,227,228,243],"tbody",{},[213,229,230,237,240],{},[231,232,233,234,236],"td",{},"SSGのまま ",[22,235,28],{}," で軽量化",[231,238,239],{},"変更が小さい、プリセット変更不要",[231,241,242],{},"全文検索不可",[213,244,245,248,251],{},[231,246,247],{},"SSR化してサーバーAPI",[231,249,250],{},"全文検索可能、サーバー側で検索実行",[231,252,253],{},"プリセット変更が必要、D1設定",[18,255,256,257,259],{},"結論として、SSGのまま ",[22,258,28],{}," による軽量化を採用した。理由は以下の通り。",[261,262,263,271,274,277],"ul",{},[264,265,266,267,270],"li",{},"現在のプリセットは ",[22,268,269],{},"cloudflare-pages-static","（SSG）で、サーバーAPIは使えない",[264,272,273],{},"SSR化にはCloudflare Pagesのプリセット変更やD1の設定が必要で、変更が大きい",[264,275,276],{},"このブログで全文検索がどれだけ必要かは不明。タイトルと説明文の検索で十分な可能性が高い",[264,278,279],{},"全文検索が必要になった時点でSSR化を検討すればよい",[14,281,282],{"id":282},"実装の詳細",[42,284,286,287,289],{"id":285},"_1-select-による必要フィールドのみの取得","1. ",[22,288,28],{}," による必要フィールドのみの取得",[18,291,292,293,296,297,299],{},"最も効果の大きい変更。",[22,294,295],{},"queryCollection"," に ",[22,298,28],{}," を追加して、必要な5フィールドだけを取得するようにした。",[53,301,303],{"className":55,"code":302,"language":57,"meta":58,"style":58},"// 改善後: body ASTを除外して軽量に取得（約20MB → 数十KB）\nconst { data: allArticles, error, pending: loading } = await useAsyncData('search-articles', () =>\n  queryCollection('pages')\n    .select('title', 'description', 'path', 'publishedAt', 'tags')\n    .all()\n)\n",[22,304,305,310,359,373,429,438],{"__ignoreMap":58},[62,306,307],{"class":64,"line":65},[62,308,309],{"class":68},"// 改善後: body ASTを除外して軽量に取得（約20MB → 数十KB）\n",[62,311,312,314,316,318,320,322,324,327,329,332,334,337,339,341,343,345,347,349,351,353,355,357],{"class":64,"line":72},[62,313,76],{"class":75},[62,315,80],{"class":79},[62,317,84],{"class":83},[62,319,87],{"class":79},[62,321,90],{"class":83},[62,323,120],{"class":79},[62,325,326],{"class":83}," error",[62,328,120],{"class":79},[62,330,331],{"class":83}," pending",[62,333,87],{"class":79},[62,335,336],{"class":83}," loading",[62,338,93],{"class":79},[62,340,96],{"class":79},[62,342,100],{"class":99},[62,344,104],{"class":103},[62,346,107],{"class":79},[62,348,111],{"class":110},[62,350,115],{"class":114},[62,352,111],{"class":110},[62,354,120],{"class":79},[62,356,123],{"class":79},[62,358,126],{"class":79},[62,360,361,363,365,367,369,371],{"class":64,"line":129},[62,362,132],{"class":103},[62,364,107],{"class":79},[62,366,111],{"class":110},[62,368,139],{"class":114},[62,370,111],{"class":110},[62,372,156],{"class":79},[62,374,375,378,381,383,385,388,390,392,395,398,400,402,404,407,409,411,413,416,418,420,422,425,427],{"class":64,"line":153},[62,376,377],{"class":79},"    .",[62,379,380],{"class":103},"select",[62,382,107],{"class":79},[62,384,111],{"class":110},[62,386,387],{"class":114},"title",[62,389,111],{"class":110},[62,391,120],{"class":79},[62,393,394],{"class":110}," '",[62,396,397],{"class":114},"description",[62,399,111],{"class":110},[62,401,120],{"class":79},[62,403,394],{"class":110},[62,405,406],{"class":114},"path",[62,408,111],{"class":110},[62,410,120],{"class":79},[62,412,394],{"class":110},[62,414,415],{"class":114},"publishedAt",[62,417,111],{"class":110},[62,419,120],{"class":79},[62,421,394],{"class":110},[62,423,424],{"class":114},"tags",[62,426,111],{"class":110},[62,428,156],{"class":79},[62,430,432,434,436],{"class":64,"line":431},5,[62,433,377],{"class":79},[62,435,147],{"class":103},[62,437,150],{"class":79},[62,439,441],{"class":64,"line":440},6,[62,442,156],{"class":79},[18,444,445,447,448,451],{},[22,446,28],{}," はNuxt ContentのSQLiteクエリで ",[22,449,450],{},"SELECT"," 句を制御するメソッド。指定したカラムだけを取得するので、body ASTがレスポンスから完全に除外される。",[18,453,454],{},[455,456,457],"strong",{},"効果:",[261,459,460,463],{},[264,461,462],{},"payload: 約20MB → 数十KB（99%以上削減）",[264,464,465],{},"SQLiteクエリ自体も高速化（bodyカラムの読み取りが不要になるため）",[42,467,469],{"id":468},"_2-flexsearch依存の完全削除","2. FlexSearch依存の完全削除",[18,471,472,473,475],{},"FlexSearchはクライアント側の全文検索ライブラリで、body ASTからテキストを抽出してインデックスを構築していた。",[22,474,28],{}," でbodyを取得しなくなったため、FlexSearchを使う意味がなくなった。",[53,477,481],{"className":478,"code":479,"language":480,"meta":58,"style":58},"language-bash shiki shiki-themes vitesse-light vitesse-light","# package.json から flexsearch を削除\n# pnpm install で整合性を更新\npnpm install\n","bash",[22,482,483,488,493],{"__ignoreMap":58},[62,484,485],{"class":64,"line":65},[62,486,487],{"class":68},"# package.json から flexsearch を削除\n",[62,489,490],{"class":64,"line":72},[62,491,492],{"class":68},"# pnpm install で整合性を更新\n",[62,494,495,498],{"class":64,"line":129},[62,496,497],{"class":103},"pnpm",[62,499,500],{"class":114}," install\n",[18,502,503,506,507,510,511,514],{},[22,504,505],{},"package.json"," から ",[22,508,509],{},"flexsearch"," の依存を削除し、",[22,512,513],{},"pnpm install"," でロックファイルの整合性を更新した。これにより、バンドルサイズも削減された。",[42,516,518],{"id":517},"_3-タイトル説明文の部分一致検索","3. タイトル・説明文の部分一致検索",[18,520,521,522,33,524,526],{},"FlexSearchの代わりに、シンプルな ",[22,523,32],{},[22,525,36],{}," ベースの部分一致検索を実装した。",[53,528,530],{"className":55,"code":529,"language":57,"meta":58,"style":58},"// フィルタリングとソート済みの記事一覧\nconst filteredArticles = computed(() => {\n  if (!allArticles.value) return []\n\n  let results = [...allArticles.value]\n  const query = debouncedQuery.value.trim()\n\n  // タイトル・説明文の部分一致検索\n  if (query) {\n    const lowerQuery = query.toLowerCase()\n    results = results\n      .filter(article => {\n        const title = (article.title || '').toLowerCase()\n        const description = (article.description || '').toLowerCase()\n        return title.includes(lowerQuery) || description.includes(lowerQuery)\n      })\n      .map(article => {\n        const description = article.description || ''\n        // 説明文にヒットしている場合、ハイライト付きスニペットを生成\n        if (description.toLowerCase().includes(query.toLowerCase())) {\n          return {\n            ...article,\n            snippet: highlightKeyword(description, query)\n          }\n        }\n        return { ...article, snippet: null }\n      })\n  }\n\n  // 日付ソート\n  results.sort((a, b) => {\n    const dateA = a.publishedAt || a.date || ''\n    const dateB = b.publishedAt || b.date || ''\n\n    if (sortOrder.value === 'desc') {\n      return dateB.localeCompare(dateA)\n    } else {\n      return dateA.localeCompare(dateB)\n    }\n  })\n\n  return results\n})\n",[22,531,532,537,558,587,593,615,639,644,650,663,684,695,712,742,769,802,808,824,845,851,883,891,902,926,932,938,961,966,972,977,983,1010,1040,1069,1074,1103,1123,1134,1152,1158,1164,1169,1177],{"__ignoreMap":58},[62,533,534],{"class":64,"line":65},[62,535,536],{"class":68},"// フィルタリングとソート済みの記事一覧\n",[62,538,539,541,544,546,549,552,555],{"class":64,"line":72},[62,540,76],{"class":75},[62,542,543],{"class":83},"filteredArticles",[62,545,96],{"class":79},[62,547,548],{"class":103}," computed",[62,550,551],{"class":79},"(()",[62,553,554],{"class":79}," =>",[62,556,557],{"class":79}," {\n",[62,559,560,563,566,569,572,575,578,581,584],{"class":64,"line":129},[62,561,562],{"class":99},"  if",[62,564,565],{"class":79}," (",[62,567,568],{"class":75},"!",[62,570,571],{"class":83},"allArticles",[62,573,574],{"class":79},".",[62,576,577],{"class":83},"value",[62,579,580],{"class":79},")",[62,582,583],{"class":99}," return",[62,585,586],{"class":79}," []\n",[62,588,589],{"class":64,"line":153},[62,590,592],{"emptyLinePlaceholder":591},true,"\n",[62,594,595,598,601,603,606,608,610,612],{"class":64,"line":431},[62,596,597],{"class":75},"  let ",[62,599,600],{"class":83},"results",[62,602,96],{"class":79},[62,604,605],{"class":79}," [...",[62,607,571],{"class":83},[62,609,574],{"class":79},[62,611,577],{"class":83},[62,613,614],{"class":79},"]\n",[62,616,617,620,623,625,628,630,632,634,637],{"class":64,"line":440},[62,618,619],{"class":75},"  const ",[62,621,622],{"class":83},"query",[62,624,96],{"class":79},[62,626,627],{"class":83}," debouncedQuery",[62,629,574],{"class":79},[62,631,577],{"class":83},[62,633,574],{"class":79},[62,635,636],{"class":103},"trim",[62,638,150],{"class":79},[62,640,642],{"class":64,"line":641},7,[62,643,592],{"emptyLinePlaceholder":591},[62,645,647],{"class":64,"line":646},8,[62,648,649],{"class":68},"  // タイトル・説明文の部分一致検索\n",[62,651,653,655,657,659,661],{"class":64,"line":652},9,[62,654,562],{"class":99},[62,656,565],{"class":79},[62,658,622],{"class":83},[62,660,580],{"class":79},[62,662,557],{"class":79},[62,664,666,669,672,674,677,679,682],{"class":64,"line":665},10,[62,667,668],{"class":75},"    const ",[62,670,671],{"class":83},"lowerQuery",[62,673,96],{"class":79},[62,675,676],{"class":83}," query",[62,678,574],{"class":79},[62,680,681],{"class":103},"toLowerCase",[62,683,150],{"class":79},[62,685,687,690,692],{"class":64,"line":686},11,[62,688,689],{"class":83},"    results",[62,691,96],{"class":79},[62,693,694],{"class":83}," results\n",[62,696,698,701,703,705,708,710],{"class":64,"line":697},12,[62,699,700],{"class":79},"      .",[62,702,32],{"class":103},[62,704,107],{"class":79},[62,706,707],{"class":83},"article",[62,709,554],{"class":79},[62,711,557],{"class":79},[62,713,715,718,720,722,724,726,728,730,733,736,738,740],{"class":64,"line":714},13,[62,716,717],{"class":75},"        const ",[62,719,387],{"class":83},[62,721,96],{"class":79},[62,723,565],{"class":79},[62,725,707],{"class":83},[62,727,574],{"class":79},[62,729,387],{"class":83},[62,731,732],{"class":75}," || ",[62,734,735],{"class":110},"''",[62,737,144],{"class":79},[62,739,681],{"class":103},[62,741,150],{"class":79},[62,743,745,747,749,751,753,755,757,759,761,763,765,767],{"class":64,"line":744},14,[62,746,717],{"class":75},[62,748,397],{"class":83},[62,750,96],{"class":79},[62,752,565],{"class":79},[62,754,707],{"class":83},[62,756,574],{"class":79},[62,758,397],{"class":83},[62,760,732],{"class":75},[62,762,735],{"class":110},[62,764,144],{"class":79},[62,766,681],{"class":103},[62,768,150],{"class":79},[62,770,772,775,778,780,782,784,786,788,790,792,794,796,798,800],{"class":64,"line":771},15,[62,773,774],{"class":99},"        return",[62,776,777],{"class":83}," title",[62,779,574],{"class":79},[62,781,36],{"class":103},[62,783,107],{"class":79},[62,785,671],{"class":83},[62,787,580],{"class":79},[62,789,732],{"class":75},[62,791,397],{"class":83},[62,793,574],{"class":79},[62,795,36],{"class":103},[62,797,107],{"class":79},[62,799,671],{"class":83},[62,801,156],{"class":79},[62,803,805],{"class":64,"line":804},16,[62,806,807],{"class":79},"      })\n",[62,809,811,813,816,818,820,822],{"class":64,"line":810},17,[62,812,700],{"class":79},[62,814,815],{"class":103},"map",[62,817,107],{"class":79},[62,819,707],{"class":83},[62,821,554],{"class":79},[62,823,557],{"class":79},[62,825,827,829,831,833,836,838,840,842],{"class":64,"line":826},18,[62,828,717],{"class":75},[62,830,397],{"class":83},[62,832,96],{"class":79},[62,834,835],{"class":83}," article",[62,837,574],{"class":79},[62,839,397],{"class":83},[62,841,732],{"class":75},[62,843,844],{"class":110},"''\n",[62,846,848],{"class":64,"line":847},19,[62,849,850],{"class":68},"        // 説明文にヒットしている場合、ハイライト付きスニペットを生成\n",[62,852,854,857,859,861,863,865,868,870,872,874,876,878,881],{"class":64,"line":853},20,[62,855,856],{"class":99},"        if",[62,858,565],{"class":79},[62,860,397],{"class":83},[62,862,574],{"class":79},[62,864,681],{"class":103},[62,866,867],{"class":79},"().",[62,869,36],{"class":103},[62,871,107],{"class":79},[62,873,622],{"class":83},[62,875,574],{"class":79},[62,877,681],{"class":103},[62,879,880],{"class":79},"()))",[62,882,557],{"class":79},[62,884,886,889],{"class":64,"line":885},21,[62,887,888],{"class":99},"          return",[62,890,557],{"class":79},[62,892,894,897,899],{"class":64,"line":893},22,[62,895,896],{"class":79},"            ...",[62,898,707],{"class":83},[62,900,901],{"class":79},",\n",[62,903,905,909,912,915,917,919,922,924],{"class":64,"line":904},23,[62,906,908],{"class":907},"sz8Xr","            snippet",[62,910,911],{"class":79},": ",[62,913,914],{"class":103},"highlightKeyword",[62,916,107],{"class":79},[62,918,397],{"class":83},[62,920,921],{"class":79},", ",[62,923,622],{"class":83},[62,925,156],{"class":79},[62,927,929],{"class":64,"line":928},24,[62,930,931],{"class":79},"          }\n",[62,933,935],{"class":64,"line":934},25,[62,936,937],{"class":79},"        }\n",[62,939,941,943,946,948,950,953,955,958],{"class":64,"line":940},26,[62,942,774],{"class":99},[62,944,945],{"class":79}," { ...",[62,947,707],{"class":83},[62,949,921],{"class":79},[62,951,952],{"class":907},"snippet",[62,954,911],{"class":79},[62,956,957],{"class":75},"null",[62,959,960],{"class":79}," }\n",[62,962,964],{"class":64,"line":963},27,[62,965,807],{"class":79},[62,967,969],{"class":64,"line":968},28,[62,970,971],{"class":79},"  }\n",[62,973,975],{"class":64,"line":974},29,[62,976,592],{"emptyLinePlaceholder":591},[62,978,980],{"class":64,"line":979},30,[62,981,982],{"class":68},"  // 日付ソート\n",[62,984,986,989,991,994,997,999,1001,1004,1006,1008],{"class":64,"line":985},31,[62,987,988],{"class":83},"  results",[62,990,574],{"class":79},[62,992,993],{"class":103},"sort",[62,995,996],{"class":79},"((",[62,998,201],{"class":83},[62,1000,120],{"class":79},[62,1002,1003],{"class":83}," b",[62,1005,580],{"class":79},[62,1007,554],{"class":79},[62,1009,557],{"class":79},[62,1011,1013,1015,1018,1020,1023,1025,1027,1029,1031,1033,1036,1038],{"class":64,"line":1012},32,[62,1014,668],{"class":75},[62,1016,1017],{"class":83},"dateA",[62,1019,96],{"class":79},[62,1021,1022],{"class":83}," a",[62,1024,574],{"class":79},[62,1026,415],{"class":83},[62,1028,732],{"class":75},[62,1030,201],{"class":83},[62,1032,574],{"class":79},[62,1034,1035],{"class":83},"date",[62,1037,732],{"class":75},[62,1039,844],{"class":110},[62,1041,1043,1045,1048,1050,1052,1054,1056,1058,1061,1063,1065,1067],{"class":64,"line":1042},33,[62,1044,668],{"class":75},[62,1046,1047],{"class":83},"dateB",[62,1049,96],{"class":79},[62,1051,1003],{"class":83},[62,1053,574],{"class":79},[62,1055,415],{"class":83},[62,1057,732],{"class":75},[62,1059,1060],{"class":83},"b",[62,1062,574],{"class":79},[62,1064,1035],{"class":83},[62,1066,732],{"class":75},[62,1068,844],{"class":110},[62,1070,1072],{"class":64,"line":1071},34,[62,1073,592],{"emptyLinePlaceholder":591},[62,1075,1077,1080,1082,1085,1087,1089,1092,1094,1097,1099,1101],{"class":64,"line":1076},35,[62,1078,1079],{"class":99},"    if",[62,1081,565],{"class":79},[62,1083,1084],{"class":83},"sortOrder",[62,1086,574],{"class":79},[62,1088,577],{"class":83},[62,1090,1091],{"class":75}," === ",[62,1093,111],{"class":110},[62,1095,1096],{"class":114},"desc",[62,1098,111],{"class":110},[62,1100,580],{"class":79},[62,1102,557],{"class":79},[62,1104,1106,1109,1112,1114,1117,1119,1121],{"class":64,"line":1105},36,[62,1107,1108],{"class":99},"      return",[62,1110,1111],{"class":83}," dateB",[62,1113,574],{"class":79},[62,1115,1116],{"class":103},"localeCompare",[62,1118,107],{"class":79},[62,1120,1017],{"class":83},[62,1122,156],{"class":79},[62,1124,1126,1129,1132],{"class":64,"line":1125},37,[62,1127,1128],{"class":79},"    }",[62,1130,1131],{"class":99}," else",[62,1133,557],{"class":79},[62,1135,1137,1139,1142,1144,1146,1148,1150],{"class":64,"line":1136},38,[62,1138,1108],{"class":99},[62,1140,1141],{"class":83}," dateA",[62,1143,574],{"class":79},[62,1145,1116],{"class":103},[62,1147,107],{"class":79},[62,1149,1047],{"class":83},[62,1151,156],{"class":79},[62,1153,1155],{"class":64,"line":1154},39,[62,1156,1157],{"class":79},"    }\n",[62,1159,1161],{"class":64,"line":1160},40,[62,1162,1163],{"class":79},"  })\n",[62,1165,1167],{"class":64,"line":1166},41,[62,1168,592],{"emptyLinePlaceholder":591},[62,1170,1172,1175],{"class":64,"line":1171},42,[62,1173,1174],{"class":99},"  return",[62,1176,694],{"class":83},[62,1178,1180],{"class":64,"line":1179},43,[62,1181,1182],{"class":79},"})\n",[18,1184,1185],{},"ポイントは以下の通り。",[261,1187,1188,1197,1203,1213,1219],{},[264,1189,1190,911,1193,1196],{},[455,1191,1192],{},"大文字小文字を区別しない",[22,1194,1195],{},"toLowerCase()"," で正規化してから比較",[264,1198,1199,1202],{},[455,1200,1201],{},"タイトルと説明文の両方を検索対象",": どちらかにヒットすれば結果に含める",[264,1204,1205,1208,1209,1212],{},[455,1206,1207],{},"ハイライト付きスニペット",": 説明文にヒットした場合、",[22,1210,1211],{},"\u003Cmark>"," タグでキーワードをハイライト表示",[264,1214,1215,1218],{},[455,1216,1217],{},"デバウンス維持",": 入力から300ms後に検索を実行し、タイピング中の無駄な再計算を避ける",[264,1220,1221,911,1224,1226,1227,1229],{},[455,1222,1223],{},"イミュータブル",[22,1225,32],{}," と ",[22,1228,815],{}," で新しい配列を生成し、元データを変更しない",[42,1231,1233],{"id":1232},"_4-キーワードハイライト","4. キーワードハイライト",[18,1235,1236,1237,1239],{},"検索キーワードが説明文に含まれる場合、該当箇所を ",[22,1238,1211],{}," タグで囲んでハイライト表示する。",[53,1241,1243],{"className":55,"code":1242,"language":57,"meta":58,"style":58},"// キーワードをハイライト\nfunction highlightKeyword(text, query) {\n  if (!text || !query) return text\n\n  const regex = new RegExp(`(${escapeRegex(query)})`, 'gi')\n  return text.replace(regex, '\u003Cmark class=\"highlight\">$1\u003C/mark>')\n}\n\n// 正規表現のエスケープ\nfunction escapeRegex(str) {\n  return str\n    .replace(/\\\\/g, '\\\\\\\\')\n    .replace(/\\./g, '\\\\.')\n    .replace(/\\*/g, '\\\\*')\n    .replace(/\\+/g, '\\\\+')\n    .replace(/\\?/g, '\\\\?')\n    .replace(/\\^/g, '\\\\^')\n    .replace(/\\$/g, '\\\\$')\n    .replace(/\\{/g, '\\\\{')\n    .replace(/\\}/g, '\\\\}')\n    .replace(/\\(/g, '\\\\(')\n    .replace(/\\)/g, '\\\\)')\n    .replace(/\\|/g, '\\\\|')\n    .replace(/\\[/g, '\\\\[')\n    .replace(/\\]/g, '\\\\]')\n}\n",[22,1244,1245,1250,1270,1295,1299,1351,1378,1383,1387,1392,1408,1415,1447,1476,1506,1536,1566,1596,1626,1655,1684,1713,1742,1772,1802,1832],{"__ignoreMap":58},[62,1246,1247],{"class":64,"line":65},[62,1248,1249],{"class":68},"// キーワードをハイライト\n",[62,1251,1252,1255,1258,1260,1262,1264,1266,1268],{"class":64,"line":72},[62,1253,1254],{"class":75},"function",[62,1256,1257],{"class":103}," highlightKeyword",[62,1259,107],{"class":79},[62,1261,176],{"class":83},[62,1263,120],{"class":79},[62,1265,676],{"class":83},[62,1267,580],{"class":79},[62,1269,557],{"class":79},[62,1271,1272,1274,1276,1278,1280,1283,1286,1288,1290,1292],{"class":64,"line":129},[62,1273,562],{"class":99},[62,1275,565],{"class":79},[62,1277,568],{"class":75},[62,1279,176],{"class":83},[62,1281,1282],{"class":75}," ||",[62,1284,1285],{"class":75}," !",[62,1287,622],{"class":83},[62,1289,580],{"class":79},[62,1291,583],{"class":99},[62,1293,1294],{"class":83}," text\n",[62,1296,1297],{"class":64,"line":153},[62,1298,592],{"emptyLinePlaceholder":591},[62,1300,1301,1303,1306,1308,1311,1314,1316,1319,1321,1324,1327,1329,1331,1333,1336,1338,1340,1342,1344,1347,1349],{"class":64,"line":431},[62,1302,619],{"class":75},[62,1304,1305],{"class":83},"regex",[62,1307,96],{"class":79},[62,1309,1310],{"class":75}," new ",[62,1312,1313],{"class":103},"RegExp",[62,1315,107],{"class":79},[62,1317,1318],{"class":110},"`",[62,1320,107],{"class":114},[62,1322,1323],{"class":99},"${",[62,1325,1326],{"class":103},"escapeRegex",[62,1328,107],{"class":79},[62,1330,622],{"class":114},[62,1332,580],{"class":79},[62,1334,1335],{"class":99},"}",[62,1337,580],{"class":114},[62,1339,1318],{"class":110},[62,1341,120],{"class":79},[62,1343,394],{"class":110},[62,1345,1346],{"class":114},"gi",[62,1348,111],{"class":110},[62,1350,156],{"class":79},[62,1352,1353,1355,1358,1360,1363,1365,1367,1369,1371,1374,1376],{"class":64,"line":440},[62,1354,1174],{"class":99},[62,1356,1357],{"class":83}," text",[62,1359,574],{"class":79},[62,1361,1362],{"class":103},"replace",[62,1364,107],{"class":79},[62,1366,1305],{"class":83},[62,1368,120],{"class":79},[62,1370,394],{"class":110},[62,1372,1373],{"class":114},"\u003Cmark class=\"highlight\">$1\u003C/mark>",[62,1375,111],{"class":110},[62,1377,156],{"class":79},[62,1379,1380],{"class":64,"line":641},[62,1381,1382],{"class":79},"}\n",[62,1384,1385],{"class":64,"line":646},[62,1386,592],{"emptyLinePlaceholder":591},[62,1388,1389],{"class":64,"line":652},[62,1390,1391],{"class":68},"// 正規表現のエスケープ\n",[62,1393,1394,1396,1399,1401,1404,1406],{"class":64,"line":665},[62,1395,1254],{"class":75},[62,1397,1398],{"class":103}," escapeRegex",[62,1400,107],{"class":79},[62,1402,1403],{"class":83},"str",[62,1405,580],{"class":79},[62,1407,557],{"class":79},[62,1409,1410,1412],{"class":64,"line":686},[62,1411,1174],{"class":99},[62,1413,1414],{"class":83}," str\n",[62,1416,1417,1419,1421,1423,1426,1430,1432,1435,1437,1439,1443,1445],{"class":64,"line":697},[62,1418,377],{"class":79},[62,1420,1362],{"class":103},[62,1422,107],{"class":79},[62,1424,1425],{"class":110},"/",[62,1427,1429],{"class":1428},"svWSF","\\\\",[62,1431,1425],{"class":110},[62,1433,1434],{"class":99},"g",[62,1436,120],{"class":79},[62,1438,394],{"class":110},[62,1440,1442],{"class":1441},"snbK4","\\\\\\\\",[62,1444,111],{"class":110},[62,1446,156],{"class":79},[62,1448,1449,1451,1453,1455,1457,1460,1462,1464,1466,1468,1470,1472,1474],{"class":64,"line":714},[62,1450,377],{"class":79},[62,1452,1362],{"class":103},[62,1454,107],{"class":79},[62,1456,1425],{"class":110},[62,1458,1459],{"class":1428},"\\.",[62,1461,1425],{"class":110},[62,1463,1434],{"class":99},[62,1465,120],{"class":79},[62,1467,394],{"class":110},[62,1469,1429],{"class":1441},[62,1471,574],{"class":114},[62,1473,111],{"class":110},[62,1475,156],{"class":79},[62,1477,1478,1480,1482,1484,1486,1489,1491,1493,1495,1497,1499,1502,1504],{"class":64,"line":744},[62,1479,377],{"class":79},[62,1481,1362],{"class":103},[62,1483,107],{"class":79},[62,1485,1425],{"class":110},[62,1487,1488],{"class":1428},"\\*",[62,1490,1425],{"class":110},[62,1492,1434],{"class":99},[62,1494,120],{"class":79},[62,1496,394],{"class":110},[62,1498,1429],{"class":1441},[62,1500,1501],{"class":114},"*",[62,1503,111],{"class":110},[62,1505,156],{"class":79},[62,1507,1508,1510,1512,1514,1516,1519,1521,1523,1525,1527,1529,1532,1534],{"class":64,"line":771},[62,1509,377],{"class":79},[62,1511,1362],{"class":103},[62,1513,107],{"class":79},[62,1515,1425],{"class":110},[62,1517,1518],{"class":1428},"\\+",[62,1520,1425],{"class":110},[62,1522,1434],{"class":99},[62,1524,120],{"class":79},[62,1526,394],{"class":110},[62,1528,1429],{"class":1441},[62,1530,1531],{"class":114},"+",[62,1533,111],{"class":110},[62,1535,156],{"class":79},[62,1537,1538,1540,1542,1544,1546,1549,1551,1553,1555,1557,1559,1562,1564],{"class":64,"line":804},[62,1539,377],{"class":79},[62,1541,1362],{"class":103},[62,1543,107],{"class":79},[62,1545,1425],{"class":110},[62,1547,1548],{"class":1428},"\\?",[62,1550,1425],{"class":110},[62,1552,1434],{"class":99},[62,1554,120],{"class":79},[62,1556,394],{"class":110},[62,1558,1429],{"class":1441},[62,1560,1561],{"class":114},"?",[62,1563,111],{"class":110},[62,1565,156],{"class":79},[62,1567,1568,1570,1572,1574,1576,1579,1581,1583,1585,1587,1589,1592,1594],{"class":64,"line":810},[62,1569,377],{"class":79},[62,1571,1362],{"class":103},[62,1573,107],{"class":79},[62,1575,1425],{"class":110},[62,1577,1578],{"class":1428},"\\^",[62,1580,1425],{"class":110},[62,1582,1434],{"class":99},[62,1584,120],{"class":79},[62,1586,394],{"class":110},[62,1588,1429],{"class":1441},[62,1590,1591],{"class":114},"^",[62,1593,111],{"class":110},[62,1595,156],{"class":79},[62,1597,1598,1600,1602,1604,1606,1609,1611,1613,1615,1617,1619,1622,1624],{"class":64,"line":826},[62,1599,377],{"class":79},[62,1601,1362],{"class":103},[62,1603,107],{"class":79},[62,1605,1425],{"class":110},[62,1607,1608],{"class":1428},"\\$",[62,1610,1425],{"class":110},[62,1612,1434],{"class":99},[62,1614,120],{"class":79},[62,1616,394],{"class":110},[62,1618,1429],{"class":1441},[62,1620,1621],{"class":114},"$",[62,1623,111],{"class":110},[62,1625,156],{"class":79},[62,1627,1628,1630,1632,1634,1636,1639,1641,1643,1645,1647,1649,1651,1653],{"class":64,"line":847},[62,1629,377],{"class":79},[62,1631,1362],{"class":103},[62,1633,107],{"class":79},[62,1635,1425],{"class":110},[62,1637,1638],{"class":1428},"\\{",[62,1640,1425],{"class":110},[62,1642,1434],{"class":99},[62,1644,120],{"class":79},[62,1646,394],{"class":110},[62,1648,1429],{"class":1441},[62,1650,80],{"class":114},[62,1652,111],{"class":110},[62,1654,156],{"class":79},[62,1656,1657,1659,1661,1663,1665,1668,1670,1672,1674,1676,1678,1680,1682],{"class":64,"line":853},[62,1658,377],{"class":79},[62,1660,1362],{"class":103},[62,1662,107],{"class":79},[62,1664,1425],{"class":110},[62,1666,1667],{"class":1428},"\\}",[62,1669,1425],{"class":110},[62,1671,1434],{"class":99},[62,1673,120],{"class":79},[62,1675,394],{"class":110},[62,1677,1429],{"class":1441},[62,1679,1335],{"class":114},[62,1681,111],{"class":110},[62,1683,156],{"class":79},[62,1685,1686,1688,1690,1692,1694,1697,1699,1701,1703,1705,1707,1709,1711],{"class":64,"line":885},[62,1687,377],{"class":79},[62,1689,1362],{"class":103},[62,1691,107],{"class":79},[62,1693,1425],{"class":110},[62,1695,1696],{"class":1428},"\\(",[62,1698,1425],{"class":110},[62,1700,1434],{"class":99},[62,1702,120],{"class":79},[62,1704,394],{"class":110},[62,1706,1429],{"class":1441},[62,1708,107],{"class":114},[62,1710,111],{"class":110},[62,1712,156],{"class":79},[62,1714,1715,1717,1719,1721,1723,1726,1728,1730,1732,1734,1736,1738,1740],{"class":64,"line":893},[62,1716,377],{"class":79},[62,1718,1362],{"class":103},[62,1720,107],{"class":79},[62,1722,1425],{"class":110},[62,1724,1725],{"class":1428},"\\)",[62,1727,1425],{"class":110},[62,1729,1434],{"class":99},[62,1731,120],{"class":79},[62,1733,394],{"class":110},[62,1735,1429],{"class":1441},[62,1737,580],{"class":114},[62,1739,111],{"class":110},[62,1741,156],{"class":79},[62,1743,1744,1746,1748,1750,1752,1755,1757,1759,1761,1763,1765,1768,1770],{"class":64,"line":904},[62,1745,377],{"class":79},[62,1747,1362],{"class":103},[62,1749,107],{"class":79},[62,1751,1425],{"class":110},[62,1753,1754],{"class":1428},"\\|",[62,1756,1425],{"class":110},[62,1758,1434],{"class":99},[62,1760,120],{"class":79},[62,1762,394],{"class":110},[62,1764,1429],{"class":1441},[62,1766,1767],{"class":114},"|",[62,1769,111],{"class":110},[62,1771,156],{"class":79},[62,1773,1774,1776,1778,1780,1782,1785,1787,1789,1791,1793,1795,1798,1800],{"class":64,"line":928},[62,1775,377],{"class":79},[62,1777,1362],{"class":103},[62,1779,107],{"class":79},[62,1781,1425],{"class":110},[62,1783,1784],{"class":1428},"\\[",[62,1786,1425],{"class":110},[62,1788,1434],{"class":99},[62,1790,120],{"class":79},[62,1792,394],{"class":110},[62,1794,1429],{"class":1441},[62,1796,1797],{"class":114},"[",[62,1799,111],{"class":110},[62,1801,156],{"class":79},[62,1803,1804,1806,1808,1810,1812,1815,1817,1819,1821,1823,1825,1828,1830],{"class":64,"line":934},[62,1805,377],{"class":79},[62,1807,1362],{"class":103},[62,1809,107],{"class":79},[62,1811,1425],{"class":110},[62,1813,1814],{"class":1428},"\\]",[62,1816,1425],{"class":110},[62,1818,1434],{"class":99},[62,1820,120],{"class":79},[62,1822,394],{"class":110},[62,1824,1429],{"class":1441},[62,1826,1827],{"class":114},"]",[62,1829,111],{"class":110},[62,1831,156],{"class":79},[62,1833,1834],{"class":64,"line":940},[62,1835,1382],{"class":79},[18,1837,1838,1840,1841,921,1843,921,1845,1847],{},[22,1839,1326],{}," はユーザー入力に正規表現の特殊文字（",[22,1842,574],{},[22,1844,1501],{},[22,1846,1531],{}," など）が含まれていてもエラーにならないようにエスケープする。",[42,1849,1851],{"id":1850},"_5-検索プレースホルダーの更新","5. 検索プレースホルダーの更新",[18,1853,1854],{},"検索方式の変更に合わせて、プレースホルダーテキストも更新した。",[53,1856,1860],{"className":1857,"code":1858,"language":1859,"meta":58,"style":58},"language-html shiki shiki-themes vitesse-light vitesse-light","\u003C!-- 改善前 -->\n\u003Cinput placeholder=\"タイトル、本文でフリーワード検索...\" />\n\n\u003C!-- 改善後 -->\n\u003Cinput placeholder=\"タイトル、説明文で検索...\" />\n","html",[22,1861,1862,1867,1892,1896,1901],{"__ignoreMap":58},[62,1863,1864],{"class":64,"line":65},[62,1865,1866],{"class":68},"\u003C!-- 改善前 -->\n",[62,1868,1869,1872,1875,1878,1881,1884,1887,1889],{"class":64,"line":72},[62,1870,1871],{"class":79},"\u003C",[62,1873,1874],{"class":99},"input",[62,1876,1877],{"class":83}," placeholder",[62,1879,1880],{"class":79},"=",[62,1882,1883],{"class":110},"\"",[62,1885,1886],{"class":114},"タイトル、本文でフリーワード検索...",[62,1888,1883],{"class":110},[62,1890,1891],{"class":79}," />\n",[62,1893,1894],{"class":64,"line":129},[62,1895,592],{"emptyLinePlaceholder":591},[62,1897,1898],{"class":64,"line":153},[62,1899,1900],{"class":68},"\u003C!-- 改善後 -->\n",[62,1902,1903,1905,1907,1909,1911,1913,1916,1918],{"class":64,"line":431},[62,1904,1871],{"class":79},[62,1906,1874],{"class":99},[62,1908,1877],{"class":83},[62,1910,1880],{"class":79},[62,1912,1883],{"class":110},[62,1914,1915],{"class":114},"タイトル、説明文で検索...",[62,1917,1883],{"class":110},[62,1919,1891],{"class":79},[18,1921,1922],{},"全文検索ではなくなったので、「フリーワード検索」という表現をやめ、実際の検索対象を明示するようにした。",[42,1924,1926],{"id":1925},"_6-計画記事のステータス更新","6. 計画記事のステータス更新",[18,1928,1929,1930,1933,1934,1937,1938,506,1941,1944],{},"前日に作成した計画記事 (",[22,1931,1932],{},"search-page-performance-plan.md",") の ",[22,1935,1936],{},"todo"," フィールドを ",[22,1939,1940],{},"\"active\"",[22,1942,1943],{},"\"done\""," に更新し、実装が完了したことを記録した。",[53,1946,1950],{"className":1947,"code":1948,"language":1949,"meta":58,"style":58},"language-yaml shiki shiki-themes vitesse-light vitesse-light","# 変更前\ntodo: \"active\"\n\n# 変更後\ntodo: \"done\"\n","yaml",[22,1951,1952,1957,1972,1976,1981],{"__ignoreMap":58},[62,1953,1954],{"class":64,"line":65},[62,1955,1956],{"class":68},"# 変更前\n",[62,1958,1959,1961,1963,1966,1969],{"class":64,"line":72},[62,1960,1936],{"class":907},[62,1962,87],{"class":79},[62,1964,1965],{"class":110}," \"",[62,1967,1968],{"class":114},"active",[62,1970,1971],{"class":110},"\"\n",[62,1973,1974],{"class":64,"line":129},[62,1975,592],{"emptyLinePlaceholder":591},[62,1977,1978],{"class":64,"line":153},[62,1979,1980],{"class":68},"# 変更後\n",[62,1982,1983,1985,1987,1989,1992],{"class":64,"line":431},[62,1984,1936],{"class":907},[62,1986,87],{"class":79},[62,1988,1965],{"class":110},[62,1990,1991],{"class":114},"done",[62,1993,1971],{"class":110},[14,1995,1996],{"id":1996},"改善結果のまとめ",[207,1998,1999,2012],{},[210,2000,2001],{},[213,2002,2003,2006,2009],{},[216,2004,2005],{},"指標",[216,2007,2008],{},"改善前",[216,2010,2011],{},"改善後",[226,2013,2014,2025,2036,2051,2062,2073],{},[213,2015,2016,2019,2022],{},[231,2017,2018],{},"payload サイズ",[231,2020,2021],{},"約20MB（body AST含む）",[231,2023,2024],{},"数十KB（5フィールドのみ）",[213,2026,2027,2030,2033],{},[231,2028,2029],{},"FlexSearch依存",[231,2031,2032],{},"あり（バンドルに含まれる）",[231,2034,2035],{},"削除済み",[213,2037,2038,2041,2044],{},[231,2039,2040],{},"検索方式",[231,2042,2043],{},"クライアント側FlexSearch全文検索",[231,2045,2046,33,2048,2050],{},[22,2047,32],{},[22,2049,36],{}," 部分一致",[213,2052,2053,2056,2059],{},[231,2054,2055],{},"検索対象",[231,2057,2058],{},"タイトル + 本文AST",[231,2060,2061],{},"タイトル + 説明文",[213,2063,2064,2067,2070],{},[231,2065,2066],{},"ページ表示速度",[231,2068,2069],{},"数秒〜十数秒",[231,2071,2072],{},"ほぼ即時",[213,2074,2075,2078,2081],{},[231,2076,2077],{},"クライアント側メモリ",[231,2079,2080],{},"FlexSearchインデックス + 全記事AST",[231,2082,2083],{},"検索結果の軽量データのみ",[14,2085,2087],{"id":2086},"改善後の-searchvue-全体構成","改善後の search.vue 全体構成",[18,2089,2090,2091,2094],{},"最終的な ",[22,2092,2093],{},"search.vue"," の構成は以下のようになっている。",[53,2096,2099],{"className":2097,"code":2098,"language":176},[174],"search.vue\n├── template\n│   ├── 検索フォーム（キーワード入力 + ソート選択 + クリアボタン）\n│   ├── 検索結果リスト（タイトル、日付、タグ、スニペット/説明文）\n│   └── ページネーション（20件ずつ表示）\n└── script setup\n    ├── データ取得: queryCollection().select().all()\n    ├── 検索ロジック: filter + includes（デバウンス300ms）\n    ├── ハイライト: highlightKeyword()\n    ├── ソート: publishedAt による昇順/降順\n    ├── ページネーション: computed で算出\n    └── SEO: useSeoMeta + useHead\n",[22,2100,2098],{"__ignoreMap":58},[18,2102,2103],{},"外部ライブラリへの依存がなく、Nuxt Contentの組み込み機能と標準のJavaScript配列メソッドだけで検索機能が実現されている。",[14,2105,2106],{"id":2106},"今後の検討事項",[261,2108,2109,2115,2128],{},[264,2110,2111,2114],{},[455,2112,2113],{},"全文検索が必要になった場合",": SSR化してサーバーAPIエンドポイントを作成し、SQLiteのFTS（Full-Text Search）を使う方式に移行する",[264,2116,2117,2120,2121,33,2124,2127],{},[455,2118,2119],{},"記事数の増加への対応",": 現在471記事で数十KBのpayloadだが、数千記事になった場合はサーバー側ページネーション（",[22,2122,2123],{},".limit()",[22,2125,2126],{},".offset()","）の導入を検討する",[264,2129,2130,2133],{},[455,2131,2132],{},"タグ検索の追加",": 現在はキーワード検索のみだが、タグによるフィルタリング機能を追加する余地がある",[2135,2136,2137],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .svWSF, html code.shiki .svWSF{--shiki-default:#BDA437;--shiki-dark:#BDA437}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}",{"title":58,"searchDepth":72,"depth":72,"links":2139},[2140,2141,2146,2147,2156,2157,2158],{"id":16,"depth":72,"text":16},{"id":40,"depth":72,"text":40,"children":2142},[2143,2144,2145],{"id":44,"depth":129,"text":44},{"id":166,"depth":129,"text":167},{"id":184,"depth":129,"text":184},{"id":196,"depth":72,"text":196},{"id":282,"depth":72,"text":282,"children":2148},[2149,2151,2152,2153,2154,2155],{"id":285,"depth":129,"text":2150},"1. .select() による必要フィールドのみの取得",{"id":468,"depth":129,"text":469},{"id":517,"depth":129,"text":518},{"id":1232,"depth":129,"text":1233},{"id":1850,"depth":129,"text":1851},{"id":1925,"depth":129,"text":1926},{"id":1996,"depth":72,"text":1996},{"id":2086,"depth":72,"text":2087},{"id":2106,"depth":72,"text":2106},"dev",null,"FlexSearchライブラリを削除し、Nuxt Contentのselect()とシンプルな部分一致検索に置き換えてパフォーマンスを改善した記録","md",{},"/search-page-performance-optimization-2026-01-30","mdx-playground",false,"2026-01-30T00:00:00.000Z",{"title":5,"description":2161},"make-diary","2026-01/2026-01-30/search-page-performance-optimization-2026-01-30",[2172,2173,2174,2175,2176],"Nuxt Content","パフォーマンス","検索","FlexSearch","最適化","memo","rbAwXoyjqhCeLbCyTqjEmHAbdplET2J4WqBgjObK1Qs",[],[2181,2185,2189,2193,2197],{"title":2182,"path":2183,"publishedAt":2184},"散らばったnote戦略の資料をローカル限定ページに集約し、PNGしかないロゴをSVG化した","/note-strategy-hub-and-brand-assets","2026-07-29T00:00:00.000Z",{"title":2186,"path":2187,"publishedAt":2188},"NVIDIAのオープンウェイト共同声明を全文対訳で記事化した日 — 訳語「公開」の衝突とSVG図解4枚","/open-weights-statement-bilingual-article","2026-07-25T00:00:00.000Z",{"title":2190,"path":2191,"publishedAt":2192},"Nuxtで画像が表示されないバグを追ったら、ビルド除外の設計に行き着いた","/content-visibility-and-image-path-fixes","2026-07-24T00:00:00.000Z",{"title":2194,"path":2195,"publishedAt":2196},"WordPressバックアップから記事を復元できるか検証し、専用リポジトリを立てた日","/wordpress-restore-and-repo-split","2026-07-21T00:00:00.000Z",{"title":2198,"path":2199,"publishedAt":2200},"NuxtのSSGビルドが3倍遅くなった原因調査 — 差分ビルドではなくプリレンダー共有キャッシュで立て直す","/ssg-prerender-fullscan-cache","2026-07-19T00:00:00.000Z","https://log.eurekapu.com/og/blog/search-page-performance-optimization-2026-01-30.png?v=2026-01-30T00%3A00%3A00.000Z&title=Nuxt%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%83%9A%E3%83%BC%E3%82%B8%E8%BB%BD%E9%87%8F%E5%8C%96%20-%20FlexSearch%E5%89%8A%E9%99%A4%E3%81%A8select()%E3%81%AB%E3%82%88%E3%82%8B%E6%9C%80%E9%81%A9%E5%8C%96&author=Kei%20Komatsu&sig=dfda831502456c8c",1786424301568]