本文介绍了如何使用全文检索的分词器和自定义词典。

在大部分场景下,默认分词器(AliNLP)可以获得很好的分词效果,不需要人工进行干预。您也可以自行选择使用IK分词器。在一些特殊场景下,您可以使用自定义词典影响分词结果,获取更贴近业务实践场景的分词结果。AnalyticDB MySQL版 3.0提供灵活的自定义词典能力,您可以像操作普通表一样操作自定义词典,并对新写入的数据实时生效。并且,AnalyticDB MySQL版 3.0中的自定义词典可以应用于索引级别,大大提高了自定义词典使用的灵活性。

说明 全文索引的分词器可以支持英语和其他国语言,具体以使用的分词器的效果评估。

自定义分词器

AnalyticDB MySQL版 3.0全文检索功能支持AliNLP分词器和IK分词器,您可以在创建全文索引时按需指定分词器,不指定的情况下系统默认采用ALiNLP分词器。

自定义分词器示例:

CREATE TABLE fulltext_test (
    id int,
    title varchar,
    body varchar,
    FULLTEXT INDEX t_idx(title) WITH ANALYZER alinlp,
    FULLTEXT INDEX b_idx(title) WITH ANALYZER ik,
    PRIMARY KEY (id)
)
DISTRIBUTE BY HASH(id);

自定义词典

全文检索功能在构建索引和查询时,都需要对文档或待查询语句进行分词,分词结果直接影响索引构建及查询结果。AliNLP在大部分场景下可以得到理想的分词结果,但在一些特定的场景下,分词结果会造成查询结果差异,并不能满足业务实际需求,自定义词典提供的灵活扩充词库能力,可以很好的解决这个问题。

AnalyticDB MySQL版 3.0的全文检索支持自定义词典,您可以对词典表进行增加和删除以达到维护词典的目的,也可以按需创建多张词典表,以达到不同的应用场景使用不同词典的目的。

创建自定义词典表

AnalyticDB MySQL版 3.0中,具体的创建语法如下:
CREATE TABLE `ext_dict` (
  `value` varchar(255) NOT NULL COMMENT '扩展词/停止词值',
  `type` varchar(4) NOT NULL DEFAULT 'main' COMMENT 'main表示扩展词, stop表示停止词(暂不支持停止词)',
  PRIMARY KEY (`value`,`type`)
) COMMENT='用户词典表'
FULLTEXT_DICT = 'Y';
约束:
  1. 词典只能有两个字段:value和type;
  2. value和type字段都为varchar类型,并且不能为空;
  3. 词典表主键必须同时包含value和type字段;
字段解释:
  1. value字段表示具体的词条内容;
  2. type字段用来标记词条类型,比如扩展词和停止词,在目前的应用场景中,只有扩展词(main)是合法的,其他类型的词条可以写入,但不会生效。

AnalyticDB MySQL版对可以创建的全文词典的数量进行了限制。目前一个逻辑库可以创建一个全文词典表,一个物理库中可以创建最多十个全文词典表。

更新自定义词典

词典本身是一张表,读写操作与普通表无异,具体约束为:
  1. 词典表不允许执行Online DDL;
  2. 不支持update和truncate;
  3. 不支持禁用索引;
  4. 不支持使用全文索引、自定义词典、自定义分词器;
  5. 词典表在被其他索引使用时禁止删除。
插入一个词条:
INSERT INTO ext_dict (`value`) VALUES ('China');
删除一个词条:
DELETE FROM ext_dict WHERE `value` = 'China' AND `type` = 'main';

一个词典默认最多允许插入1w条记录,如果需要调整插入记录数,请提交工单。

您插入或者删除词典中的词条后,词典会立刻生效,对于新写入数据表的数据,将使用自定义词典最新的词条进行分词。

使用自定义词典

创建全文索引时,可以指定全文索引使用的自定义词典,以在线创建全文索引为例:

ALTER TABLE `test` ADD FULLTEXT INDEX t_idx(`title`) WITH DICT [logical_schema.]table;

使用with dict指定使用的自定义词典,指定的自定义词典必须满足以下条件:

  1. 是一个自定义词典表;
  2. 当前用户具备对应自定义词典表的SELECT权限。
自定义词典中的单个词条如果是中英文混合,例如车牌号前缀 “浙A”,在指定自定义词典时需要同时指定使用AliNLP分词器,例如:
ALTER TABLE `test` ADD FULLTEXT INDEX t_idx(`title`) WITH DICT ext_dict WITH ANALYZER alinlp;

全文索引可见策略

由于实时构建全文索引的开销比较大,对于实时写入的数据,AnalyticDB MySQL版 3.0采用秒级可见的索引构建策略。如果需要根据业务需求调整索引刷新策略,可联系AnalyticDB MySQL版官方支持进行配置。