Xunsearch PHP-SDK v1.4.9 权威指南

# 自定义分词器

`Xunsearch` 默认内置了功能强大的 SCWS 分词系统，也附加提供了一些简单常见的分词规则， 但考虑到用户的个性需求，特意提供了自定义分词器的功能。

> Note: 自定义分词器存在一个缺陷，它不支持存储位置信息，也就是不能按短语检索、以及 `NEAR` 之类的 语法检索。相当于该字段配置中的 `phrase` 值恒为 `no`，通常把自定义分词用于一些带有一定规则的简要 字段，而不是更多的考虑语义关系。

## 1. 编写自定义分词器?

自定义分词器必须实现 XSTokenizer 接口。假定您要编写一个名为 `xyz` 的分词器，则您要编写的代码 文件为 `XSTokenizerXyz.class.php`，请将文件统一放入 `$prefix/sdk/php/lib` 目录。

通常来讲，您只需要实现 XSTokenizer::getTokens 即可。该函数接受 2个参数，分别为要分词的值以及 当前的文档对象(可选)；返回值为分好的词汇组成的数组。下面以按 `-` 分割字段为例：

    class XSTokenizerXyz implements XSTokenizer
    {
        public function getTokens($value, XSDocument $doc = null)
        {
            $ret = array();
            if (!empty($value))
                $ret = explode('-', $value);
            return $ret;
        }
    }

> Note: XSTokenizer::getTokens 的参数 `$value` 的编码始终为 UTF-8 。

如果您需要编写带有参数支持的分词器，比如让用户传入按什么字符分割，请参照下面写法编写构造函数：

    class XSTokenizerXyz implements XSTokenizer
    {
        private $delim = '-'; // 默认按 - 分割

        public function __construct($arg = null)
        {
            if ($arg !== null && $arg !== '')
                $this->delim = $arg;
        }

        public function getTokens($value, XSDocument $doc)
        {
            $ret = array();
            if (!empty($value))
                $ret = explode($this->delim, $value);
            return $ret;
        }
    }

## 2. 使用自定义分词器?

编写完了自定义分词器的代码后，您就可以在项目配置文件中使用它了，在需要用这个分词器的字段中 指定 `tokenizer` 选项的值，例子中省略了字段的其它选项，实际编写时可能还包括其它选项。

而在搜索语句中，如果指明了字段搜索前缀 `field:XXX` 那么搜索引擎内部也会 对这个搜索语句执行自定义分词。

    [some_field]
    ; 不带参数的用法
    tokenizer = xyz
    ; 带参数的用法，表示把 _ 作为参数传递给构造函数
    tokenizer = xyz(_)

$Id$
« 项目配置详解
编写第一个配置文件 »
Copyright © 2008-2011 by 杭州云圣网络科技有限公司
All Rights Reserved.