codecamp

编写第一个配置文件

Xunsearch 的配置文件是纯文本的 INI 格式,用任何文本编辑器均可编写,在 Unix 类型的系统下推荐 用 vi,而 Windows 下可以用记事本或EditPlus 进行编写。我们也正在计划不久的将来制作一个 Web 界面的编辑工具,以便进行可视化的设计以及约束检测。

Tip: 目前我们针对新手用户开发了一个 WEB 版本的在线配置文件编辑辅助工具,点击试用。

如果您是从头阅读到这儿,应该对配置文件也有了基本的了解,下面我们以传统的 discuz 论坛贴子为例子, 来学习编写配置文件。

1. Discuz 的论坛贴子 MySQL 表结构

由于我们只是对贴子进行搜索,所以只需要关心它的贴子表即可,表结构如下:

CREATE TABLE `cdb_posts` (

`pid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,

`fid` smallint(6) UNSIGNED NOT NULL DEFAULT '0',

`tid` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',

`first` tinyint(1) NOT NULL DEFAULT '0',

`author` varchar(15) NOT NULL DEFAULT '',

`authorid` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',

`subject` varchar(80) NOT NULL DEFAULT '',

`dateline` int(10) UNSIGNED NOT NULL DEFAULT '0',

`message` mediumtext NOT NULL,

`useip` varchar(15) NOT NULL DEFAULT '',

`invisible` tinyint(1) NOT NULL DEFAULT '0',

`anonymous` tinyint(1) NOT NULL DEFAULT '0',

`usesig` tinyint(1) NOT NULL DEFAULT '0',

`htmlon` tinyint(1) NOT NULL DEFAULT '0',

`bbcodeoff` tinyint(1) NOT NULL DEFAULT '0',

`smileyoff` tinyint(1) NOT NULL DEFAULT '0',

`parseurloff` tinyint(1) NOT NULL DEFAULT '0',

`attachment` tinyint(1) NOT NULL DEFAULT '0',

`rate` smallint(6) NOT NULL DEFAULT '0',

`ratetimes` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',

`status` tinyint(1) NOT NULL DEFAULT '0',

PRIMARY KEY (`pid`),

KEY `fid` (`fid`),

KEY `authorid` (`authorid`),

KEY `dateline` (`dateline`),

KEY `invisible` (`invisible`),

KEY `displayorder` (`tid`, `invisible`, `dateline`),

KEY `first` (`tid`, `first`)

) ENGINE = MyISAM CHARSET = utf8;

2. 搜索的设计与分析

首先得搞明白我们要得到什么样的搜索效果,进行针对性的设计和分析才能确定需要哪些字段。在 这个案例中我们的需求是要对所有的论坛贴子进行标题、内容、作者全文检索,并希望搜索结果能 过滤回贴、按发表时间排序、能按版块过滤。明确了意图之后我们就只需要从数据表中提取必要的 字段即可。

  • pid 主键,必须的

  • fid 按版块检索时需要用到

  • tid 搜索结果阅读链接都是按 tid 来的,必备

  • first 表示该贴子是否为楼主,过滤回贴时用到

  • authorauthorid 按作者检索用得到

  • subject 标题

  • message 贴子内容

  • dateline 发表时间,要用到

其它的有些字段,比如 invisibleanonymous 表面看上去跟搜索结果也是有关系的,但 实际上这些可以在索引入库时进行处理和排除,完全没有必要放到搜索数据中去,所以不列入。

3. 字段设计与分析

得到字段后,进一步分析各个字段的用途与写法。

  • pid 非常明显,它是主键,所以它的类型必须是 id

  • fid 内容为数字的版块ID,但由于我们不需要对它进行排序或区间查找,所以用 string 类型即可, 为了按版块检索,我们必须对它进行索引,而它也不需要分词,所以分词器用内置的 full

  • tid 内容也是数字的主题ID,我们暂不考虑按主题搜索,所以不需要索引,也没有排序等要求,所以 只要当作普通字段存储下来即可。

  • first 用 1/0 不同值来表示是否为楼主,考虑到回贴过滤需求,它也需要索引,整个字段转换成一个 词即可,分词器当然选用 full

  • author 作者名字检索,考虑中文名支持,所以建议这个字段保留使用默认内置的 scws 分词器。 由于希望在默认不指明字段的情况下也能检索作者字段,所以它的过索引方式应为 both

  • authorid 作者 ID,我们只用于搜索结果的作者链接,不需要索引。

  • subject 标题类型为 title

  • message 主内容,类型为 body

  • dateline 时间戳记,由于需要排序,所以该字段不能存为 string,必须用 numeric,但不需要 进行任何索引。

4. 配置文件结果

自此字段分析与设计已然明了,下面给出完整的配置文件内容,实际使用时可以将文件保存至$prefix/sdk/php/app/discuz.ini

project.name = discuzproject.default_charset = GBK;服务端用默认值
;server.index = 8383;server.search = 8384
 [pid]type = id
 [fid]index = selftokenizer = full
 [tid]
 [first]index = selftokenizer = full
 [author]index = both
 [authorid]
 [subject]type = title
 [message]type = body
 [dateline]type = numeric


自定义分词器
索引概述
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

了解基础对象方法

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }