<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Information Architecture on Tarragon</title><link>https://tarrragon.github.io/blog/tags/information-architecture/</link><description>Recent content in Information Architecture on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Sat, 25 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/information-architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>Filter 順序由使用者掃描成本決定</title><link>https://tarrragon.github.io/blog/report/filter-order-by-scan-cost/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/filter-order-by-scan-cost/</guid><description>&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>選項清單按使用者掃描順序排序、不按資料來源預設。&lt;/strong> 短清單先看完、長清單花更多時間 — 把短清單放前面讓使用者先排除一個維度、再面對長清單。字母排序對「找已知名稱」有效；多選 facet 場景下使用者通常不知道確切選項名、需要 scan，這時候掃描成本主導。&lt;/p>
&lt;hr>
&lt;h2 id="為什麼掃描成本優先於字母排序">為什麼掃描成本優先於字母排序&lt;/h2>
&lt;h3 id="商業邏輯">商業邏輯&lt;/h3>
&lt;p>當清單有多個選項供使用者挑選，&lt;strong>選項數量影響掃描時間&lt;/strong>。使用者在 facet UI 的行為不是「找已知 tag」、是「看到有什麼可選、選有興趣的」 — 這是探索式行為、不是查找式行為。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>行為類型&lt;/th>
 &lt;th>適合的排序&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>查找式（知道要什麼）&lt;/td>
 &lt;td>字母排序 — 二分查找&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>探索式（看有什麼）&lt;/td>
 &lt;td>掃描成本排序 — 短清單先&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>字母排序是資料庫思維（穩定、可預測），掃描成本排序是 UX 思維（縮短決策時間）。Facet 場景幾乎都是後者。&lt;/p>
&lt;h3 id="兩條維度收斂的順序">兩條維度收斂的順序&lt;/h3>
&lt;p>當有多個 facet 維度可選、使用者通常&lt;strong>逐維度收斂&lt;/strong>：先用一個維度砍掉一半結果、再用第二個維度精選。短清單放前面讓「第一刀」決策快速。&lt;/p>
&lt;hr>
&lt;h2 id="這次任務的應用">這次任務的應用&lt;/h2>
&lt;h3 id="觀察">觀察&lt;/h3>
&lt;p>Pagefind filter 預設按 filter key 字母排序：&lt;code>tag&lt;/code> &amp;lt; &lt;code>type&lt;/code>，所以 Tag 先顯示。&lt;/p>
&lt;p>實際內容：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Filter&lt;/th>
 &lt;th>選項數量&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Type&lt;/td>
 &lt;td>~5 個（post / card / glossary 等 section）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tag&lt;/td>
 &lt;td>~80 個（站上所有 tags）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="判讀">判讀&lt;/h3>
&lt;p>Type 短、Tag 長 — 預期使用者行為是「先按 type 收斂（這是 post 還是 glossary？）、再進 tag 找主題」。Tag 在前等於要使用者先面對 80 個選項，認知成本高。&lt;/p>
&lt;p>把順序倒過來：Type 先顯示讓使用者先用 section 收斂、再進 Tag 找。&lt;/p>
&lt;h3 id="執行">執行&lt;/h3>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nx">reorderFilters&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">blocks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">filter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelectorAll&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.pagefind-ui__filter-block&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">desiredOrder&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;type&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;tag&amp;#39;&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">byKey&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> &lt;span class="nx">blocks&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">b&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">b&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.pagefind-ui__filter-name&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">textContent&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">toLowerCase&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> &lt;span class="nx">byKey&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> &lt;span class="nx">desiredOrder&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">k&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">byKey&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">k&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nx">filter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">byKey&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">k&lt;/span>&lt;span class="p">]));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="內在屬性比較四種排序策略">內在屬性比較：四種排序策略&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>策略&lt;/th>
 &lt;th>適合場景&lt;/th>
 &lt;th>失敗模式&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>字母排序&lt;/td>
 &lt;td>使用者知道確切選項名&lt;/td>
 &lt;td>探索式場景下掃描慢&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>掃描成本排序（短先長後）&lt;/td>
 &lt;td>探索式 facet&lt;/td>
 &lt;td>「短」「長」邊界模糊時不穩&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>使用頻率排序&lt;/td>
 &lt;td>有 analytics 資料&lt;/td>
 &lt;td>冷啟動時無資料、需要默認&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>語意分組排序&lt;/td>
 &lt;td>選項有明顯子類別&lt;/td>
 &lt;td>子類別劃分本身需要設計&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>選擇順序：&lt;strong>有 analytics → 頻率排序；沒有 → 掃描成本排序；都不適用 → 字母排序&lt;/strong>。&lt;/p>
&lt;hr>
&lt;h2 id="排序原則的延伸應用">排序原則的延伸應用&lt;/h2>
&lt;h3 id="同類-facet-內的選項排序">同類 facet 內的選項排序&lt;/h3>
&lt;p>Tag 內部的 80 個 tag 怎麼排？&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>內部排序方式&lt;/th>
 &lt;th>適用&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>字母排序&lt;/td>
 &lt;td>使用者知道想找哪個 tag&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>計數排序（最多文章的 tag 在前）&lt;/td>
 &lt;td>探索式、引導使用者進熱門主題&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>編輯精選&lt;/td>
 &lt;td>站方有特定主題策略&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>當前接受 pagefind 的字母排序（成本最低、且 80 個 tag 做計數排序需要額外索引處理）。&lt;/p>
&lt;h3 id="選項數量門檻">選項數量門檻&lt;/h3>
&lt;p>短清單跟長清單的邊界沒有絕對值，常用啟發：&lt;/p>
&lt;ul>
&lt;li>≤ 7 個選項：可一眼掃完、放前面&lt;/li>
&lt;li>8-20 個：中等、需要結構（縮排、分組）&lt;/li>
&lt;li>20+ 個：長清單、放後面或加搜尋框&lt;/li>
&lt;/ul>
&lt;p>Type 5 個落在「短」、Tag 80 個落在「長」 — 順序明顯。&lt;/p>
&lt;hr>
&lt;h2 id="設計取捨選項清單的排序策略">設計取捨：選項清單的排序策略&lt;/h2>
&lt;p>四種做法、各自機會成本不同。預設依使用者行為性質選 — 探索式 → A、查找式 → B、有 analytics → C、有子類別 → D。&lt;/p>
&lt;h3 id="a掃描成本排序短先長後探索式-facet-的預設">A：掃描成本排序（短先長後）（探索式 facet 的預設）&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>機制&lt;/strong>：選項數量少的維度放前面（type 5 個 → 先；tag 80 個 → 後）&lt;/li>
&lt;li>&lt;strong>選 A 的理由&lt;/strong>：使用者先用短清單收斂一刀、再面對長清單；認知成本低&lt;/li>
&lt;li>&lt;strong>適合&lt;/strong>：探索式 facet（使用者不知道確切選項名）&lt;/li>
&lt;li>&lt;strong>代價&lt;/strong>：需要主動覆寫資料來源預設（不能直接用 DB 順序）&lt;/li>
&lt;/ul>
&lt;h3 id="b字母排序">B：字母排序&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>機制&lt;/strong>：按 alphabetical 排&lt;/li>
&lt;li>&lt;strong>跟 A 的取捨&lt;/strong>：B 對「找已知名稱」高效（二分查找）、A 對「探索式選擇」高效；但 facet 場景幾乎都是探索式&lt;/li>
&lt;li>&lt;strong>B 比 A 好的情境&lt;/strong>：使用者通常知道確切選項名（國家清單、語言清單）&lt;/li>
&lt;/ul>
&lt;h3 id="c使用頻率排序最常用在前">C：使用頻率排序（最常用在前）&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>機制&lt;/strong>：按 analytics 統計、最高頻選項在前&lt;/li>
&lt;li>&lt;strong>跟 A/B 的取捨&lt;/strong>：C 比 A 更精準（用真實資料）、但需要 analytics + 冷啟動時無資料&lt;/li>
&lt;li>&lt;strong>C 比 A 好的情境&lt;/strong>：有足夠 analytics、且使用者偏好集中（80/20 分布明顯）&lt;/li>
&lt;/ul>
&lt;h3 id="d語意分組排序">D：語意分組排序&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>機制&lt;/strong>：把選項分子類別、組內再排&lt;/li>
&lt;li>&lt;strong>跟 A 的取捨&lt;/strong>：D 對「選項有明顯子類別」更直觀（產品類別 / 功能類別）、A 對純扁平清單夠用&lt;/li>
&lt;li>&lt;strong>D 比 A 好的情境&lt;/strong>：選項有清楚的層級結構（電商 facet：類別 &amp;gt; 子類別 &amp;gt; 選項）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>訊號&lt;/th>
 &lt;th>排序問題&lt;/th>
 &lt;th>修正動作&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>使用者抱怨「選項太多找不到」&lt;/td>
 &lt;td>長清單在前、掃描負擔大&lt;/td>
 &lt;td>把短清單前移、或加搜尋框&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>同類選項使用者卡在第一步&lt;/td>
 &lt;td>第一個維度選項過多&lt;/td>
 &lt;td>換成更少選項的維度當第一步&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>預設排序看起來「隨機」&lt;/td>
 &lt;td>資料來源排序與 UX 不符&lt;/td>
 &lt;td>主動 reorder、不接受預設&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>新增選項後順序錯亂&lt;/td>
 &lt;td>reorder 邏輯依賴 hardcoded list&lt;/td>
 &lt;td>改用屬性分類（例如選項數量自動排）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>核心原則&lt;/strong>：UI 排序是設計決策、不是技術選擇。預設順序通常反映資料來源結構、不反映使用者行為 — 主動覆寫是常態、不是例外。&lt;/p></description><content:encoded><![CDATA[<h2 id="核心原則">核心原則</h2>
<p><strong>選項清單按使用者掃描順序排序、不按資料來源預設。</strong> 短清單先看完、長清單花更多時間 — 把短清單放前面讓使用者先排除一個維度、再面對長清單。字母排序對「找已知名稱」有效；多選 facet 場景下使用者通常不知道確切選項名、需要 scan，這時候掃描成本主導。</p>
<hr>
<h2 id="為什麼掃描成本優先於字母排序">為什麼掃描成本優先於字母排序</h2>
<h3 id="商業邏輯">商業邏輯</h3>
<p>當清單有多個選項供使用者挑選，<strong>選項數量影響掃描時間</strong>。使用者在 facet UI 的行為不是「找已知 tag」、是「看到有什麼可選、選有興趣的」 — 這是探索式行為、不是查找式行為。</p>
<table>
  <thead>
      <tr>
          <th>行為類型</th>
          <th>適合的排序</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>查找式（知道要什麼）</td>
          <td>字母排序 — 二分查找</td>
      </tr>
      <tr>
          <td>探索式（看有什麼）</td>
          <td>掃描成本排序 — 短清單先</td>
      </tr>
  </tbody>
</table>
<p>字母排序是資料庫思維（穩定、可預測），掃描成本排序是 UX 思維（縮短決策時間）。Facet 場景幾乎都是後者。</p>
<h3 id="兩條維度收斂的順序">兩條維度收斂的順序</h3>
<p>當有多個 facet 維度可選、使用者通常<strong>逐維度收斂</strong>：先用一個維度砍掉一半結果、再用第二個維度精選。短清單放前面讓「第一刀」決策快速。</p>
<hr>
<h2 id="這次任務的應用">這次任務的應用</h2>
<h3 id="觀察">觀察</h3>
<p>Pagefind filter 預設按 filter key 字母排序：<code>tag</code> &lt; <code>type</code>，所以 Tag 先顯示。</p>
<p>實際內容：</p>
<table>
  <thead>
      <tr>
          <th>Filter</th>
          <th>選項數量</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Type</td>
          <td>~5 個（post / card / glossary 等 section）</td>
      </tr>
      <tr>
          <td>Tag</td>
          <td>~80 個（站上所有 tags）</td>
      </tr>
  </tbody>
</table>
<h3 id="判讀">判讀</h3>
<p>Type 短、Tag 長 — 預期使用者行為是「先按 type 收斂（這是 post 還是 glossary？）、再進 tag 找主題」。Tag 在前等於要使用者先面對 80 個選項，認知成本高。</p>
<p>把順序倒過來：Type 先顯示讓使用者先用 section 收斂、再進 Tag 找。</p>
<h3 id="執行">執行</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kd">function</span> <span class="nx">reorderFilters</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="kd">var</span> <span class="nx">blocks</span> <span class="o">=</span> <span class="nx">filter</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s1">&#39;.pagefind-ui__filter-block&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kd">var</span> <span class="nx">desiredOrder</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">,</span> <span class="s1">&#39;tag&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kd">var</span> <span class="nx">byKey</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="nx">blocks</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">b</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="kd">var</span> <span class="nx">key</span> <span class="o">=</span> <span class="nx">b</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;.pagefind-ui__filter-name&#39;</span><span class="p">).</span><span class="nx">textContent</span><span class="p">.</span><span class="nx">trim</span><span class="p">().</span><span class="nx">toLowerCase</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="nx">byKey</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="p">});</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="nx">desiredOrder</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">k</span> <span class="p">=&gt;</span> <span class="nx">byKey</span><span class="p">[</span><span class="nx">k</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="nx">filter</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">byKey</span><span class="p">[</span><span class="nx">k</span><span class="p">]));</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><hr>
<h2 id="內在屬性比較四種排序策略">內在屬性比較：四種排序策略</h2>
<table>
  <thead>
      <tr>
          <th>策略</th>
          <th>適合場景</th>
          <th>失敗模式</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>字母排序</td>
          <td>使用者知道確切選項名</td>
          <td>探索式場景下掃描慢</td>
      </tr>
      <tr>
          <td>掃描成本排序（短先長後）</td>
          <td>探索式 facet</td>
          <td>「短」「長」邊界模糊時不穩</td>
      </tr>
      <tr>
          <td>使用頻率排序</td>
          <td>有 analytics 資料</td>
          <td>冷啟動時無資料、需要默認</td>
      </tr>
      <tr>
          <td>語意分組排序</td>
          <td>選項有明顯子類別</td>
          <td>子類別劃分本身需要設計</td>
      </tr>
  </tbody>
</table>
<p>選擇順序：<strong>有 analytics → 頻率排序；沒有 → 掃描成本排序；都不適用 → 字母排序</strong>。</p>
<hr>
<h2 id="排序原則的延伸應用">排序原則的延伸應用</h2>
<h3 id="同類-facet-內的選項排序">同類 facet 內的選項排序</h3>
<p>Tag 內部的 80 個 tag 怎麼排？</p>
<table>
  <thead>
      <tr>
          <th>內部排序方式</th>
          <th>適用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>字母排序</td>
          <td>使用者知道想找哪個 tag</td>
      </tr>
      <tr>
          <td>計數排序（最多文章的 tag 在前）</td>
          <td>探索式、引導使用者進熱門主題</td>
      </tr>
      <tr>
          <td>編輯精選</td>
          <td>站方有特定主題策略</td>
      </tr>
  </tbody>
</table>
<p>當前接受 pagefind 的字母排序（成本最低、且 80 個 tag 做計數排序需要額外索引處理）。</p>
<h3 id="選項數量門檻">選項數量門檻</h3>
<p>短清單跟長清單的邊界沒有絕對值，常用啟發：</p>
<ul>
<li>≤ 7 個選項：可一眼掃完、放前面</li>
<li>8-20 個：中等、需要結構（縮排、分組）</li>
<li>20+ 個：長清單、放後面或加搜尋框</li>
</ul>
<p>Type 5 個落在「短」、Tag 80 個落在「長」 — 順序明顯。</p>
<hr>
<h2 id="設計取捨選項清單的排序策略">設計取捨：選項清單的排序策略</h2>
<p>四種做法、各自機會成本不同。預設依使用者行為性質選 — 探索式 → A、查找式 → B、有 analytics → C、有子類別 → D。</p>
<h3 id="a掃描成本排序短先長後探索式-facet-的預設">A：掃描成本排序（短先長後）（探索式 facet 的預設）</h3>
<ul>
<li><strong>機制</strong>：選項數量少的維度放前面（type 5 個 → 先；tag 80 個 → 後）</li>
<li><strong>選 A 的理由</strong>：使用者先用短清單收斂一刀、再面對長清單；認知成本低</li>
<li><strong>適合</strong>：探索式 facet（使用者不知道確切選項名）</li>
<li><strong>代價</strong>：需要主動覆寫資料來源預設（不能直接用 DB 順序）</li>
</ul>
<h3 id="b字母排序">B：字母排序</h3>
<ul>
<li><strong>機制</strong>：按 alphabetical 排</li>
<li><strong>跟 A 的取捨</strong>：B 對「找已知名稱」高效（二分查找）、A 對「探索式選擇」高效；但 facet 場景幾乎都是探索式</li>
<li><strong>B 比 A 好的情境</strong>：使用者通常知道確切選項名（國家清單、語言清單）</li>
</ul>
<h3 id="c使用頻率排序最常用在前">C：使用頻率排序（最常用在前）</h3>
<ul>
<li><strong>機制</strong>：按 analytics 統計、最高頻選項在前</li>
<li><strong>跟 A/B 的取捨</strong>：C 比 A 更精準（用真實資料）、但需要 analytics + 冷啟動時無資料</li>
<li><strong>C 比 A 好的情境</strong>：有足夠 analytics、且使用者偏好集中（80/20 分布明顯）</li>
</ul>
<h3 id="d語意分組排序">D：語意分組排序</h3>
<ul>
<li><strong>機制</strong>：把選項分子類別、組內再排</li>
<li><strong>跟 A 的取捨</strong>：D 對「選項有明顯子類別」更直觀（產品類別 / 功能類別）、A 對純扁平清單夠用</li>
<li><strong>D 比 A 好的情境</strong>：選項有清楚的層級結構（電商 facet：類別 &gt; 子類別 &gt; 選項）</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>排序問題</th>
          <th>修正動作</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>使用者抱怨「選項太多找不到」</td>
          <td>長清單在前、掃描負擔大</td>
          <td>把短清單前移、或加搜尋框</td>
      </tr>
      <tr>
          <td>同類選項使用者卡在第一步</td>
          <td>第一個維度選項過多</td>
          <td>換成更少選項的維度當第一步</td>
      </tr>
      <tr>
          <td>預設排序看起來「隨機」</td>
          <td>資料來源排序與 UX 不符</td>
          <td>主動 reorder、不接受預設</td>
      </tr>
      <tr>
          <td>新增選項後順序錯亂</td>
          <td>reorder 邏輯依賴 hardcoded list</td>
          <td>改用屬性分類（例如選項數量自動排）</td>
      </tr>
  </tbody>
</table>
<p><strong>核心原則</strong>：UI 排序是設計決策、不是技術選擇。預設順序通常反映資料來源結構、不反映使用者行為 — 主動覆寫是常態、不是例外。</p>
<p>跟 <a href="../view-layer-filter-vs-source-layer/">#55-#66 Filter × Source 系列</a> 的關係：本卡是「filter UI 的排序」、Filter × Source 系列是「filter 行為的層級」 — 兩個維度互補。設計 filter UI 時兩者都要顧：本卡決定「哪個選項放前面」、<a href="../filter-instruction-clarification/">#58</a> 決定「篩選的定義域是哪一層」、<a href="../filter-source-composition-strategies/">#59</a> 決定「filter 跟 source 怎麼合成」。</p>
]]></content:encoded></item><item><title>Mode 與 Facet 是不同語意層級、UI 區域分開擺放</title><link>https://tarrragon.github.io/blog/report/mode-vs-facet-semantics/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/mode-vs-facet-semantics/</guid><description>&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>Mode（模式）跟 Facet（多面向篩選）是兩個語意層級、UI 區域必須分開。&lt;/strong> Mode 決定「如何搜」、Facet 決定「篩選什麼結果」 — 兩者作用點不同、混在同一 UI 區會讓使用者誤以為是同層的選項、產生「為什麼勾這個結果這麼少」的困惑。&lt;/p>
&lt;hr>
&lt;h2 id="為什麼語意層級要對應視覺分區">為什麼語意層級要對應視覺分區&lt;/h2>
&lt;h3 id="商業邏輯">商業邏輯&lt;/h3>
&lt;p>搜尋 UI 包含的控制看起來都是「縮小結果」、語意層級實際不同：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>控制類型&lt;/th>
 &lt;th>作用對象&lt;/th>
 &lt;th>改變的東西&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Mode&lt;/td>
 &lt;td>搜尋演算法本身&lt;/td>
 &lt;td>「如何搜」（範圍、方法）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Facet&lt;/td>
 &lt;td>已搜結果集&lt;/td>
 &lt;td>「篩什麼結果」&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Mode 在「搜尋」之前生效、Facet 在「搜尋」之後生效 — 兩者在 query pipeline 的位置不同。&lt;/p>
&lt;h3 id="混在一起的失敗模式">混在一起的失敗模式&lt;/h3>
&lt;p>把 mode 跟 facet 放在同一 UI 區域、使用者預設兩者作用相同：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>使用者誤判&lt;/th>
 &lt;th>實際發生&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>勾「標題」是過濾標題欄位（facet）&lt;/td>
 &lt;td>Mode 改變搜尋範圍（標題不含的字會直接 0 結果）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>取消勾「標題」會擴大結果&lt;/td>
 &lt;td>取消等於切回「全部」mode、搜尋邏輯整個換&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>使用者看不出「為什麼結果差異這麼大」 — 因為以為換了一個 facet、實際換了搜尋演算法。&lt;/p>
&lt;h3 id="ui-慣例位置">UI 慣例位置&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>控制類型&lt;/th>
 &lt;th>UI 慣例位置&lt;/th>
 &lt;th>視覺暗示&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Mode&lt;/td>
 &lt;td>緊貼輸入框（旁邊或下方）&lt;/td>
 &lt;td>「跟搜尋本身綁在一起」&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Facet&lt;/td>
 &lt;td>結果區附近 / sidebar&lt;/td>
 &lt;td>「在結果上做的事」&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>慣例位置反映語意層級 — mode 屬於「query 構造」、facet 屬於「結果處理」。&lt;/p>
&lt;hr>
&lt;h2 id="這次任務的應用">這次任務的應用&lt;/h2>
&lt;h3 id="觀察">觀察&lt;/h3>
&lt;p>搜尋頁有兩類控制：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>控制&lt;/th>
 &lt;th>類型&lt;/th>
 &lt;th>原本位置&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>搜尋範圍：全部 / 標題 / 內文&lt;/td>
 &lt;td>Mode（影響 regex 比對範圍）&lt;/td>
 &lt;td>一開始想塞進 filter 區&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Filter：Type / Tag&lt;/td>
 &lt;td>Facet（在已搜結果上篩選）&lt;/td>
 &lt;td>Pagefind 預設 sidebar / drawer&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="判讀">判讀&lt;/h3>
&lt;p>把 scope 放進 filter 區會讓使用者把它當第三種 facet — 但「全部 / 標題 / 內文」不是篩選現有結果、是換搜尋範圍：&lt;/p>
&lt;ul>
&lt;li>勾「標題」：搜尋只跑標題欄位、內文有的字直接 0 結果&lt;/li>
&lt;li>取消「標題」（切回「全部」）：搜尋範圍擴大、結果集完全不同&lt;/li>
&lt;/ul>
&lt;p>如果使用者以為這是 facet、預期「取消會稍微多幾個結果」 — 實際結果集大幅變動會困惑。&lt;/p>
&lt;h3 id="執行分區擺放">執行：分區擺放&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>控制&lt;/th>
 &lt;th>最終位置&lt;/th>
 &lt;th>視覺距離&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Scope（mode）&lt;/td>
 &lt;td>搜尋輸入框正下方&lt;/td>
 &lt;td>緊鄰 — 跟 input 視覺綁在一起&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Filter（facet）&lt;/td>
 &lt;td>左側 sidebar（≥ 1400px）或 pagefind drawer（&amp;lt; 1400px）&lt;/td>
 &lt;td>跟結果區一起&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>兩者視覺上明顯分開、使用者可區分「這是改搜尋方式」vs「這是篩結果」。&lt;/p>
&lt;hr>
&lt;h2 id="內在屬性比較三種-modefacet-擺放">內在屬性比較：三種 mode/facet 擺放&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>擺放策略&lt;/th>
 &lt;th>使用者誤判風險&lt;/th>
 &lt;th>實作成本&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>全部塞同一區（filter）&lt;/td>
 &lt;td>高 — mode 被誤當 facet&lt;/td>
 &lt;td>低 — 不分區&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mode 在 input 旁、Facet 在 sidebar&lt;/td>
 &lt;td>低 — 視覺暗示明確&lt;/td>
 &lt;td>中 — 兩個 slot&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mode 在 input 旁、Facet 在 sidebar、加說明文字&lt;/td>
 &lt;td>最低 — 雙重提示&lt;/td>
 &lt;td>中 — 多文字&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>優先選「分區 + 視覺暗示」 — 不需要文字說明、靠位置即可辨識。&lt;/p>
&lt;hr>
&lt;h2 id="進階多個-mode-並存的處理">進階：多個 mode 並存的處理&lt;/h2>
&lt;p>當有多個 mode（搜尋範圍 + 排序方式 + 語言）：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Mode 類型&lt;/th>
 &lt;th>慣例位置&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>搜尋範圍&lt;/td>
 &lt;td>input 下方&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>排序方式（相關度 / 日期）&lt;/td>
 &lt;td>結果區頂端&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>語言切換&lt;/td>
 &lt;td>全站 header（最高層級）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>每個 mode 跟它影響的範圍視覺鄰近 — 影響搜尋範圍的靠 input、影響結果排序的靠結果。&lt;/p></description><content:encoded><![CDATA[<h2 id="核心原則">核心原則</h2>
<p><strong>Mode（模式）跟 Facet（多面向篩選）是兩個語意層級、UI 區域必須分開。</strong> Mode 決定「如何搜」、Facet 決定「篩選什麼結果」 — 兩者作用點不同、混在同一 UI 區會讓使用者誤以為是同層的選項、產生「為什麼勾這個結果這麼少」的困惑。</p>
<hr>
<h2 id="為什麼語意層級要對應視覺分區">為什麼語意層級要對應視覺分區</h2>
<h3 id="商業邏輯">商業邏輯</h3>
<p>搜尋 UI 包含的控制看起來都是「縮小結果」、語意層級實際不同：</p>
<table>
  <thead>
      <tr>
          <th>控制類型</th>
          <th>作用對象</th>
          <th>改變的東西</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Mode</td>
          <td>搜尋演算法本身</td>
          <td>「如何搜」（範圍、方法）</td>
      </tr>
      <tr>
          <td>Facet</td>
          <td>已搜結果集</td>
          <td>「篩什麼結果」</td>
      </tr>
  </tbody>
</table>
<p>Mode 在「搜尋」之前生效、Facet 在「搜尋」之後生效 — 兩者在 query pipeline 的位置不同。</p>
<h3 id="混在一起的失敗模式">混在一起的失敗模式</h3>
<p>把 mode 跟 facet 放在同一 UI 區域、使用者預設兩者作用相同：</p>
<table>
  <thead>
      <tr>
          <th>使用者誤判</th>
          <th>實際發生</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>勾「標題」是過濾標題欄位（facet）</td>
          <td>Mode 改變搜尋範圍（標題不含的字會直接 0 結果）</td>
      </tr>
      <tr>
          <td>取消勾「標題」會擴大結果</td>
          <td>取消等於切回「全部」mode、搜尋邏輯整個換</td>
      </tr>
  </tbody>
</table>
<p>使用者看不出「為什麼結果差異這麼大」 — 因為以為換了一個 facet、實際換了搜尋演算法。</p>
<h3 id="ui-慣例位置">UI 慣例位置</h3>
<table>
  <thead>
      <tr>
          <th>控制類型</th>
          <th>UI 慣例位置</th>
          <th>視覺暗示</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Mode</td>
          <td>緊貼輸入框（旁邊或下方）</td>
          <td>「跟搜尋本身綁在一起」</td>
      </tr>
      <tr>
          <td>Facet</td>
          <td>結果區附近 / sidebar</td>
          <td>「在結果上做的事」</td>
      </tr>
  </tbody>
</table>
<p>慣例位置反映語意層級 — mode 屬於「query 構造」、facet 屬於「結果處理」。</p>
<hr>
<h2 id="這次任務的應用">這次任務的應用</h2>
<h3 id="觀察">觀察</h3>
<p>搜尋頁有兩類控制：</p>
<table>
  <thead>
      <tr>
          <th>控制</th>
          <th>類型</th>
          <th>原本位置</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>搜尋範圍：全部 / 標題 / 內文</td>
          <td>Mode（影響 regex 比對範圍）</td>
          <td>一開始想塞進 filter 區</td>
      </tr>
      <tr>
          <td>Filter：Type / Tag</td>
          <td>Facet（在已搜結果上篩選）</td>
          <td>Pagefind 預設 sidebar / drawer</td>
      </tr>
  </tbody>
</table>
<h3 id="判讀">判讀</h3>
<p>把 scope 放進 filter 區會讓使用者把它當第三種 facet — 但「全部 / 標題 / 內文」不是篩選現有結果、是換搜尋範圍：</p>
<ul>
<li>勾「標題」：搜尋只跑標題欄位、內文有的字直接 0 結果</li>
<li>取消「標題」（切回「全部」）：搜尋範圍擴大、結果集完全不同</li>
</ul>
<p>如果使用者以為這是 facet、預期「取消會稍微多幾個結果」 — 實際結果集大幅變動會困惑。</p>
<h3 id="執行分區擺放">執行：分區擺放</h3>
<table>
  <thead>
      <tr>
          <th>控制</th>
          <th>最終位置</th>
          <th>視覺距離</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Scope（mode）</td>
          <td>搜尋輸入框正下方</td>
          <td>緊鄰 — 跟 input 視覺綁在一起</td>
      </tr>
      <tr>
          <td>Filter（facet）</td>
          <td>左側 sidebar（≥ 1400px）或 pagefind drawer（&lt; 1400px）</td>
          <td>跟結果區一起</td>
      </tr>
  </tbody>
</table>
<p>兩者視覺上明顯分開、使用者可區分「這是改搜尋方式」vs「這是篩結果」。</p>
<hr>
<h2 id="內在屬性比較三種-modefacet-擺放">內在屬性比較：三種 mode/facet 擺放</h2>
<table>
  <thead>
      <tr>
          <th>擺放策略</th>
          <th>使用者誤判風險</th>
          <th>實作成本</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>全部塞同一區（filter）</td>
          <td>高 — mode 被誤當 facet</td>
          <td>低 — 不分區</td>
      </tr>
      <tr>
          <td>Mode 在 input 旁、Facet 在 sidebar</td>
          <td>低 — 視覺暗示明確</td>
          <td>中 — 兩個 slot</td>
      </tr>
      <tr>
          <td>Mode 在 input 旁、Facet 在 sidebar、加說明文字</td>
          <td>最低 — 雙重提示</td>
          <td>中 — 多文字</td>
      </tr>
  </tbody>
</table>
<p>優先選「分區 + 視覺暗示」 — 不需要文字說明、靠位置即可辨識。</p>
<hr>
<h2 id="進階多個-mode-並存的處理">進階：多個 mode 並存的處理</h2>
<p>當有多個 mode（搜尋範圍 + 排序方式 + 語言）：</p>
<table>
  <thead>
      <tr>
          <th>Mode 類型</th>
          <th>慣例位置</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>搜尋範圍</td>
          <td>input 下方</td>
      </tr>
      <tr>
          <td>排序方式（相關度 / 日期）</td>
          <td>結果區頂端</td>
      </tr>
      <tr>
          <td>語言切換</td>
          <td>全站 header（最高層級）</td>
      </tr>
  </tbody>
</table>
<p>每個 mode 跟它影響的範圍視覺鄰近 — 影響搜尋範圍的靠 input、影響結果排序的靠結果。</p>
<p>Facet 也可以分多區（type/tag 在 sidebar、價格區間在結果上方）— 但 mode 與 facet 之間永遠保持區域分離。</p>
<hr>
<h2 id="設計取捨搜尋控制的擺放策略">設計取捨：搜尋控制的擺放策略</h2>
<p>四種做法、各自機會成本不同。這個專案選 A（Mode 靠 input + Facet 靠結果）當預設、其他做法在特定情境合理。</p>
<h3 id="amode-緊貼-input--facet-靠近結果這個專案的預設">A：Mode 緊貼 input + Facet 靠近結果（這個專案的預設）</h3>
<ul>
<li><strong>機制</strong>：mode 控制（搜尋範圍 / 排序）放 input 旁；facet 控制（type / tag）放結果區或 sidebar</li>
<li><strong>選 A 的理由</strong>：位置就是契約 — 靠 input 的影響搜尋本身、靠結果的篩選結果；使用者靠位置辨識語意層級、不需文字說明</li>
<li><strong>適合</strong>：搜尋 UI、有 mode + facet 兩種控制</li>
<li><strong>代價</strong>：UI 拆兩個區、空間使用多一些</li>
</ul>
<h3 id="b所有控制集中-sidebar">B：所有控制集中 sidebar</h3>
<ul>
<li><strong>機制</strong>：mode + facet 都放 sidebar 一起</li>
<li><strong>跟 A 的取捨</strong>：B 集中管理視覺乾淨、A 分區語意清晰；但 B 使用者區分不了哪個影響 query、哪個影響結果</li>
<li><strong>B 是反模式</strong>：mode/facet 混淆是 UX 痛點 — 使用者區分不了哪個影響 query、哪個影響結果</li>
</ul>
<h3 id="c所有控制集中-input-旁">C：所有控制集中 input 旁</h3>
<ul>
<li><strong>機制</strong>：mode + facet 都靠 input、結果區無控制</li>
<li><strong>跟 A 的取捨</strong>：C 操作集中、A 按語意分；但 C facet 跟結果脫鉤、視覺暗示錯</li>
<li><strong>C 比 A 好的情境</strong>：facet 數量極少（&lt; 3 個）、放 input 旁不擁擠</li>
</ul>
<h3 id="d加文字說明取代位置暗示">D：加文字說明取代位置暗示</h3>
<ul>
<li><strong>機制</strong>：UI 加「此項目影響搜尋演算法」「此項目篩選結果」說明</li>
<li><strong>跟 A 的取捨</strong>：D 文字精確、A 靠位置直覺；但 D 增加閱讀負擔、使用者通常跳過說明</li>
<li><strong>D 比 A 好的情境</strong>：複雜搜尋介面（多種 mode、多層 facet）— 純位置暗示不夠</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>對應問題</th>
          <th>修正動作</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>使用者問「為什麼這個結果出現了」</td>
          <td>mode/facet 混淆</td>
          <td>確認控制類型、分區擺放</td>
      </tr>
      <tr>
          <td>取消某個篩選、結果集大幅變動</td>
          <td>該控制是 mode 不是 facet</td>
          <td>移到 input 旁、視覺區隔</td>
      </tr>
      <tr>
          <td>控制集中在 sidebar、有些影響搜尋有些篩結果</td>
          <td>全部塞 filter 區</td>
          <td>拆出 mode 區、靠 input</td>
      </tr>
      <tr>
          <td>新增搜尋功能不知道該放哪</td>
          <td>沒有分區慣例</td>
          <td>先判斷 mode/facet、再決定位置</td>
      </tr>
  </tbody>
</table>
<p><strong>核心原則</strong>：搜尋 UI 的控制不是同層的「篩選器」 — 語意層級不同、視覺分區也應不同。位置就是契約：靠 input 的影響搜尋本身、靠結果的篩選結果。</p>
<p>跟 <a href="../filter-instruction-clarification/">#58 篩選類指令的澄清時機</a> 的關係：mode 跟 facet 是兩種不同的「篩選類指令」。Mode（如「title-only / content / both」）通常重塑 query → 對應 #58 三問的「定義域 (c) 重新搜尋」；Facet（如「type=post tag=js」）通常加 filter 條件 → 對應「定義域 (b) 在所有結果裡找」。語意分區是視覺面、定義域選擇是行為面 — 兩者一起設計才完整。</p>
]]></content:encoded></item></channel></rss>