自定义分词器
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(_)