公开搜寻

### 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.