公開搜尋

### Movable Type 手冊：公開搜尋

« 目錄

- 公開搜尋

- 搜尋模版
- 搜尋表單
- 替換模版
- 從前一版的 mt-search 轉換

# 公開搜尋

Movable Type 的公開搜尋介面其實是把 Jay Allen 的 mt-search 附加元件加以整合而成的。這個搜索引擎支援兩種搜尋類別：直接關鍵字搜尋和新評論搜尋。直接關鍵字搜尋可以用布林字串、語詞搜尋跟正規表示式匹配（如果選用了的話）等不同的方式。新評論搜尋（實際上可能更像是『列出』）會列出所有在特定時間範圍內，在妳的站台上所發表的新評論。

搜尋字串會被紀錄在妳的站台活動日誌裡。

## 搜尋模版

搜尋模版跟 Movable Type 裡的其他模版管理起來並不同，因為他們並非依網誌為準的，所以放在編輯選單的『模版』區段中反而沒有意義。搜尋模版實際上是一些放在妳的 search_templates/ 目錄中的檔案；這個目錄應該會跟 mt.cgi 位於同一個位置。

在妳的搜尋模版中，妳可以用一些特殊的模版標籤集合來顯示搜尋結果。不過妳幾乎也可以用其他的 Movable Type 標籤；不過當然妳還是得要尊重整體的脈絡。除此之外，因為妳的搜尋結果頁面是動態隨著每一次有人搜尋妳的站台時所產生的，所以妳應該要避免使用那些會消耗伺服器大量資源來重建的標籤（像是 `<MTArchiveList>` 或 `<MTCalendar>` ）。

妳也可以在妳的搜尋模版中使用 `<MTInclude>` 標籤，來包含某個搜尋模組或外部檔案。妳甚至可以把某個網誌當作是前後文（因為模版模組會依各個網誌而存），然後在 `<MTSearchResults>` 容器之外這麼用這個標籤。不過我們仍然要警告妳不要輕易使用這種方法，尤其是妳有多重網誌的時候更是如此。例如說，如果妳在某個模版中用了

    <$MTInclude module="Header"$>

那麼系統就會知道它所要找的模組名為 `Header` 。如果搜尋結果是找到了，會很簡單地把網誌按照字母順序列出；反之要是沒有找到， Movable Type 就會試著從妳的資料庫裡載入某個網誌（被選擇的網誌則沒有定義）。

這個行為日後可能還會被加以精鍊。

## 搜尋表單

在 Movable Type 的預設模版中包含有一個簡單的搜尋表單來搜尋妳的站台，它看起來像這樣：

    <form method="get" action="<$MTCGIPath$><$MTSearchScript$>">
    <label for="search" accesskey="4">搜尋本站：</label><br />
    <input id="search" name="search" size="20" /><br />
    <input type="submit" value="搜尋" />
    </form>

至於顯示所有選項的搜尋表單，看起來可能會像這個樣子：

    <form method="post" action="<$MTCGIPath$><$MTSearchScript$>">
    <input size="30" name="search" value="<$MTSearchString$>" />
    <input type="submit" value="Search" /><br />
    <input type="checkbox" name="CaseSearch" /> 大小寫吻合
    <input type="checkbox" name="RegexSearch" /> 使用正規表示式<br />
    <b>搜尋範圍：</b>
    <input type="radio" name="SearchElement" value="entries" /> 祇有文章項目
    <input type="radio" name="SearchElement" value="comments" /> 祇有評論
    <input type="radio" name="SearchElement" value="both" /> 文章項目和評論 <br />
    <b>排序欄位：</b>
    <select name="SearchSortBy">
    <option value="created_on">發表日期</option>
    <option value="title">標題</option>
    </select><br />
    <b>排序方式：</b>
    <select name="ResultDisplay">
    <option value="ascend">遞增</option>
    <option value="descend">遞減</option>
    </select><br />
    <b>排除下列網誌：</b>
    <MTBlogs>
    <input type="checkbox" name="ExcludeBlogs" value="<$MTBlogID$>" /> <$MTBlogName$>
    </MTBlogs><br />
    <b>從下列時間範圍內搜尋文章項目：</b>
    <select name="SearchCutoff">
    <option value="9999999">從頭開始</option>
    <option value="7">從一週前開始</option>
    <option value="14">從兩週前開始</option>
    <option value="30">從一個月前開始</option>
    <option value="60">從兩個月前開始</option>
    <option value="90">從三個月前開始</option>
    <option value="365">從一年前開始</option>
    </select><br />
    <b>每份網誌的搜尋結果上限：</b>
    <select name="MaxResults">
    <option value="5">5</option>
    <option value="10">10</option>
    <option value="25">25</option>
    <option value="50">50</option>
    <option value="100">100</option>
    <option value="9999999">無上限</option>
    </select>
    </form>

這個搜尋表單就可以提供使用者更多改變搜尋參數的控制變項，讓她們得以指定像是大小寫吻合的屬性，或者是以正規表示式來進行搜尋，而非僅祇用布林字串查詢。搜尋也可以被限定在僅祇有項目或評論內（也可以兩者均是），請注意，評論搜尋會比文章項目搜尋花去更多的時間和資源。

上面的表單同時也讓使用者在搜尋時可以排除特定的網誌，對於那些祇想要搜尋某幾個網誌的讀者來說會很好用。另一個替換排除網誌的作法像這樣：

    <b>包含下列網誌：</b>
    <MTBlogs>
    <input type="checkbox" name="IncludeBlogs" value="<$MTBlogID$>" /> <$MTBlogName$>
    </MTBlogs><br />

基本上這就是跟排除網誌完全相反的作法，不過妳當然有可能因為任何理由而改採這一種作法。例如說，這樣的作法就可以讓妳祇搜尋特定的網誌，而不需要列出一堆要排除掉的網誌。妳祇需要把這一段加進表單裡：

    <input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />

`<$MTBlogID$>` 總是對應到現用的網誌，所以這個搜尋祇會被限制在目前被瀏覽的網誌裡。

上面的範例是一個直接搜尋的例子，完整的新評論搜尋表單看起來應該像這樣：

    <form method="post" action="<$MTCGIPath$><$MTSearchScript$>">
    <input type="hidden" name="Type" value="newcomments" />
    <b>排除下列網誌：</b>
    <MTBlogs>
    <input type="checkbox" name="ExcludeBlogs" value="<$MTBlogID$>" /> <$MTBlogName$>
    </MTBlogs><br />
    <b>從下列時間範圍內搜尋文章項目：</b>
    <select name="CommentSearchCutoff">
    <option value="9999999">從頭開始</option>
    <option value="7">從一週前開始</option>
    <option value="14">從兩週前開始</option>
    <option value="30">從一個月前開始</option>
    <option value="60">從兩個月前開始</option>
    <option value="90">從三個月前開始</option>
    <option value="365">從一年前開始</option>
    </select><br />
    <b>文章項目搜尋結果上限：</b>
    <select name="MaxResults">
    <option value="5">5</option>
    <option value="10">10</option>
    <option value="25">25</option>
    <option value="50">50</option>
    <option value="100">100</option>
    <option value="9999999">無上限</option>
    </select><br />
    <input type="submit" value="尋找新迴響" />
    </form>

## 替換模版

一般說來，當有人執行了搜尋動作的時候，預設的搜尋模版 (default.tmpl) 就會被重新繪製來顯示搜尋結果（不過在新評論搜尋的情況下，使用的模版會是 comments.tmpl ）。如果妳有多重網誌，而且這些網誌上都用了搜尋工具，妳可能會希望每一個網誌上的搜尋結果看起來都不一樣。也有可能妳想要做出不同版本的網站版面：大量圖片版本、正常版本以及大量文字版本，來讓不同的讀者各自按照需求選用；所以妳會希望不同版本的搜尋結果仍舊和相對應的站台本體保持相同的感覺及風格。

所以妳可以用替換模版來達成這個功能。例如說每份網誌可以有吻合自己風格的搜尋結果模版，或者妳自己網誌的每個版本都可以有它自己的搜尋結果模版。

1. 建立模版。
   妳可以針對每一種不同的樣子或感覺的板面安排，建立起一個搜尋結果模版，然後把他們都放到 search_templates/ 目錄裡。

2. 把模版加進妳的組態中。
   用任何文字編輯器開啟妳的 mt.cfg 檔案，然後用 AltTemplate 指令來組態替換模版。例如說，如果妳有兩份網誌（ `Work` 和 `Play` ），而且妳想要讓妳的網誌有自己的模版，妳可能會加上這些東西：

       AltTemplate work work.tmpl
       AltTemplate play play.tmpl

3. 組態搜尋表單。
   要在建造搜尋結果頁面的時候告訴 Movable Type 要用哪一個模版的話，妳就得用一個隱藏的表單輸入。例如說妳就可以把下列的搜尋表單加入妳的 `Work` 網誌：

       <input type="hidden" name="Template" value="work" />

   注意：如果妳祇想要把搜尋範圍限定在祇有一個網誌內，妳也許也會想要在表單裡加上：

       <input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />

## 從前一版的 mt-search 轉換

如果妳先前用了 Jay 的搜尋引擎，那麼妳將會需要把它轉換成現在這個整合過的版本。請按照以下的步驟：

1. 更新妳的 Movable Type 。
   雖然妳已經更新過了，但是唯有更新到 Movable Type 2.5 版之後，纔會包含有整合過的搜尋引擎。

2. 複製組態設定。
   現在搜尋引擎已經整合進 Movable Type 了，所以妳再也不需要使用那兩個額外的組態檔案（ mt-search.cfg 和 mt.cfg ）了。這個新版的搜尋引擎會假設妳的搜尋組態就在妳的標準 mt.cfg 檔裡。

   所以妳得用文字編輯器開啟 mt.cfg 和 mt-search.cfg ，然後把所有 mt-search.cfg 內的內容複製到 mt.cfg 裡。

3. 更新妳的 AltTemplate 設定值。
   新版的搜尋功能用了簡化過的 AltTemplate 格式，讓妳可以使用無限多的替代模版。如果妳的 mt-search 正在使用替換模版，妳也會需要把妳的 AltTemplateN 指令修改成 AltTemplate 。也就是說妳應該要把指令結尾的數字覆蓋掉。舉例來說，如果妳原來的設定值像這樣：

       AltTemplate1 work work.tmpl

   那麼妳就應該要把它改成

       AltTemplate work work.tmpl

4. 把妳的 TemplateDir 設定值更名。
   為了要消除 TemplatePath 設定值產生的困惑，新版的搜尋功能把 TemplateDir 設定值更名成 SearchTemplatePath 。所以如果妳原來的設定值像這樣：

       TemplateDir /path/to/search_templates

   那麼妳就應該要把它改成

       SearchTemplatePath /path/to/search_templates

Copyright © 2001-2003 Six Apart. All Rights Reserved.