codecamp

自定义分词器

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(_)


项目配置文件详解
编写第一个配置文件
温馨提示
下载编程狮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; }