Xunsearch PHP-SDK v1.4.9 权威指南

# 编写第一个配置文件

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

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

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

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

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

    --
    -- 表的结构 `cdb_posts`
    --
    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  DEFAULT CHARSET=utf8;

## 2. 搜索的设计与分析?

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

- `pid` 主键，必须的
- `fid` 按版块检索时需要用到
- `tid` 搜索结果阅读链接都是按 tid 来的，必备
- `first` 表示该贴子是否为楼主，过滤回贴时用到
- `author`, `authorid` 按作者检索用得到
- `subject` 标题
- `message` 贴子内容
- `dateline` 发表时间，要用到

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

## 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 = discuz
    project.default_charset = GBK
    ;服务端用默认值
    ;server.index = 8383
    ;server.search = 8384

    [pid]
    type = id

    [fid]
    index = self
    tokenizer = full

    [tid]

    [first]
    index = self
    tokenizer = full

    [author]
    index = both

    [authorid]

    [subject]
    type = title

    [message]
    type = body

    [dateline]
    type = numeric

$Id$
« 自定义分词器
索引概述 »
Copyright © 2008-2011 by 杭州云圣网络科技有限公司
All Rights Reserved.