核心原則

Mode(模式)跟 Facet(多面向篩選)是兩個語意層級、UI 區域必須分開。 Mode 決定「如何搜」、Facet 決定「篩選什麼結果」 — 兩者作用點不同、混在同一 UI 區會讓使用者誤以為是同層的選項、產生「為什麼勾這個結果這麼少」的困惑。


為什麼語意層級要對應視覺分區

商業邏輯

搜尋 UI 包含的控制看起來都是「縮小結果」、語意層級實際不同:

控制類型作用對象改變的東西
Mode搜尋演算法本身「如何搜」(範圍、方法)
Facet已搜結果集「篩什麼結果」

Mode 在「搜尋」之前生效、Facet 在「搜尋」之後生效 — 兩者在 query pipeline 的位置不同。

混在一起的失敗模式

把 mode 跟 facet 放在同一 UI 區域、使用者預設兩者作用相同:

使用者誤判實際發生
勾「標題」是過濾標題欄位(facet)Mode 改變搜尋範圍(標題不含的字會直接 0 結果)
取消勾「標題」會擴大結果取消等於切回「全部」mode、搜尋邏輯整個換

使用者看不出「為什麼結果差異這麼大」 — 因為以為換了一個 facet、實際換了搜尋演算法。

UI 慣例位置

控制類型UI 慣例位置視覺暗示
Mode緊貼輸入框(旁邊或下方)「跟搜尋本身綁在一起」
Facet結果區附近 / sidebar「在結果上做的事」

慣例位置反映語意層級 — mode 屬於「query 構造」、facet 屬於「結果處理」。


這次任務的應用

觀察

搜尋頁有兩類控制:

控制類型原本位置
搜尋範圍:全部 / 標題 / 內文Mode(影響 regex 比對範圍)一開始想塞進 filter 區
Filter:Type / TagFacet(在已搜結果上篩選)Pagefind 預設 sidebar / drawer

判讀

把 scope 放進 filter 區會讓使用者把它當第三種 facet — 但「全部 / 標題 / 內文」不是篩選現有結果、是換搜尋範圍:

  • 勾「標題」:搜尋只跑標題欄位、內文有的字直接 0 結果
  • 取消「標題」(切回「全部」):搜尋範圍擴大、結果集完全不同

如果使用者以為這是 facet、預期「取消會稍微多幾個結果」 — 實際結果集大幅變動會困惑。

執行:分區擺放

控制最終位置視覺距離
Scope(mode)搜尋輸入框正下方緊鄰 — 跟 input 視覺綁在一起
Filter(facet)左側 sidebar(≥ 1400px)或 pagefind drawer(< 1400px)跟結果區一起

兩者視覺上明顯分開、使用者可區分「這是改搜尋方式」vs「這是篩結果」。


內在屬性比較:三種 mode/facet 擺放

擺放策略使用者誤判風險實作成本
全部塞同一區(filter)高 — mode 被誤當 facet低 — 不分區
Mode 在 input 旁、Facet 在 sidebar低 — 視覺暗示明確中 — 兩個 slot
Mode 在 input 旁、Facet 在 sidebar、加說明文字最低 — 雙重提示中 — 多文字

優先選「分區 + 視覺暗示」 — 不需要文字說明、靠位置即可辨識。


進階:多個 mode 並存的處理

當有多個 mode(搜尋範圍 + 排序方式 + 語言):

Mode 類型慣例位置
搜尋範圍input 下方
排序方式(相關度 / 日期)結果區頂端
語言切換全站 header(最高層級)

每個 mode 跟它影響的範圍視覺鄰近 — 影響搜尋範圍的靠 input、影響結果排序的靠結果。

Facet 也可以分多區(type/tag 在 sidebar、價格區間在結果上方)— 但 mode 與 facet 之間永遠保持區域分離。


設計取捨:搜尋控制的擺放策略

四種做法、各自機會成本不同。這個專案選 A(Mode 靠 input + Facet 靠結果)當預設、其他做法在特定情境合理。

A:Mode 緊貼 input + Facet 靠近結果(這個專案的預設)

  • 機制:mode 控制(搜尋範圍 / 排序)放 input 旁;facet 控制(type / tag)放結果區或 sidebar
  • 選 A 的理由:位置就是契約 — 靠 input 的影響搜尋本身、靠結果的篩選結果;使用者靠位置辨識語意層級、不需文字說明
  • 適合:搜尋 UI、有 mode + facet 兩種控制
  • 代價:UI 拆兩個區、空間使用多一些

B:所有控制集中 sidebar

  • 機制:mode + facet 都放 sidebar 一起
  • 跟 A 的取捨:B 集中管理視覺乾淨、A 分區語意清晰;但 B 使用者區分不了哪個影響 query、哪個影響結果
  • B 是反模式:mode/facet 混淆是 UX 痛點 — 使用者區分不了哪個影響 query、哪個影響結果

C:所有控制集中 input 旁

  • 機制:mode + facet 都靠 input、結果區無控制
  • 跟 A 的取捨:C 操作集中、A 按語意分;但 C facet 跟結果脫鉤、視覺暗示錯
  • C 比 A 好的情境:facet 數量極少(< 3 個)、放 input 旁不擁擠

D:加文字說明取代位置暗示

  • 機制:UI 加「此項目影響搜尋演算法」「此項目篩選結果」說明
  • 跟 A 的取捨:D 文字精確、A 靠位置直覺;但 D 增加閱讀負擔、使用者通常跳過說明
  • D 比 A 好的情境:複雜搜尋介面(多種 mode、多層 facet)— 純位置暗示不夠

判讀徵兆

訊號對應問題修正動作
使用者問「為什麼這個結果出現了」mode/facet 混淆確認控制類型、分區擺放
取消某個篩選、結果集大幅變動該控制是 mode 不是 facet移到 input 旁、視覺區隔
控制集中在 sidebar、有些影響搜尋有些篩結果全部塞 filter 區拆出 mode 區、靠 input
新增搜尋功能不知道該放哪沒有分區慣例先判斷 mode/facet、再決定位置

核心原則:搜尋 UI 的控制不是同層的「篩選器」 — 語意層級不同、視覺分區也應不同。位置就是契約:靠 input 的影響搜尋本身、靠結果的篩選結果。

#58 篩選類指令的澄清時機 的關係:mode 跟 facet 是兩種不同的「篩選類指令」。Mode(如「title-only / content / both」)通常重塑 query → 對應 #58 三問的「定義域 (c) 重新搜尋」;Facet(如「type=post tag=js」)通常加 filter 條件 → 對應「定義域 (b) 在所有結果裡找」。語意分區是視覺面、定義域選擇是行為面 — 兩者一起設計才完整。