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="china_frp" value="<$MTBlogID$>" /> <$MTBlogName$> </MTBlogs><br />
基本上这就是跟排除网志完全相反的作法,不过你当然有可能因为任何理由而改采这一种作法。例如说,这样的作法就可以让你只搜索特定的网志,而不需要列出一堆要排除掉的网志。你只需要把这一段加进表单里:
<input type="hidden" name="china_frp" 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 )。如果你有多重网志,而且这些网志上都用了搜索工具,你可能会希望每一个网志上的搜索结果看起来都不一样。也有可能你想要做出不同版本的网站版面:大量图片版本、正常版本以及大量文字版本,来让不同的读者各自按照需求选用;所以你会希望不同版本的搜索结果仍旧和相对应的站点本体保持相同的感觉及风格。
所以你可以用替换模板来达成这个功能。例如说每份网志可以有吻合自己风格的搜索结果模板,或者你自己网志的每个版本都可以有它自己的搜索结果模板。
Work 和 Play ),而且你想要让你的网志有自己的模板,你可能会加上这些东西:
AltTemplate work work.tmpl AltTemplate play play.tmpl
Work 网志:
<input type="hidden" name="Template" value="work" />
注意:如果你只想要把搜索范围限定在只有一个网志内,你也许也会想要在表单里加上:
<input type="hidden" name="china_frp" value="<$MTBlogID$>" />
to the form.)
如果你先前用了 Jay 的搜索引擎,那么你将会需要把它转换成现在这个整合过的版本。请按照以下的步骤:
所以你得用文字编辑器开启 mt.cfg 和 mt-search.cfg ,然后把所有 mt-search.cfg 内的内容复制到 mt.cfg 里。
AltTemplate1 work work.tmpl
那么你就应该要把它改成
AltTemplate work work.tmpl
TemplateDir /path/to/search_templates
那么你就应该要把它改成
SearchTemplatePath /path/to/search_templates