全文索引的分词器

本文介绍AnalyticDB for MySQL提供的内置分词器以及分词器的使用方法和分词效果。

分词器介绍

AnalyticDB for MySQL全文索引功能提供多种内置分词器,包括AliNLP分词器IK分词器Standard分词器Ngram分词器Edge_ngram分词器Pattern分词器。您可以根据不同场景,使用默认分词器或其他内置分词器对文本分词。默认内置分词器的策略如下:

  • 3.1.4.15版本之前的集群,系统默认使用AliNLP分词器。

  • 3.1.4.15版本及以上版本的集群,系统默认使用IK分词器。

说明

如何查看集群的内核版本,请参见如何查看实例版本信息

指定分词器

语法

FULLTEXT INDEX idx_name(`column_name`) [ WITH ANALYZER analyzer_name ] [ WITH DICT tbl_dict_name];

参数说明

  • idx_name:全文索引名称。

  • column_name:全文索引的列。

  • WITH ANALYZER analyzer_name:指定分词器。

  • WITH DICT tbl_dict_name:指定自定义词典。AnalyticDB for MySQL支持自定义词典,详情请参见全文索引的自定义词典

示例

在创建全文索引表时指定分词器,示例如下:

CREATE TABLE `tbl_fulltext_demo` (
  `id` int,
  `content` varchar,
  `content_alinlp` varchar,
  `content_ik` varchar,
  `content_standard` varchar,
  `content_ngram` varchar,
  `content_edge_ngram` varchar,
  FULLTEXT INDEX fidx_c(`content`),  // 使用默认分词器
  FULLTEXT INDEX fidx_alinlp(`content_alinlp`) WITH ANALYZER alinlp,
  FULLTEXT INDEX fidx_ik(`content_ik`) WITH ANALYZER ik,
  FULLTEXT INDEX fidx_standard(`content_standard`) WITH ANALYZER standard,
  FULLTEXT INDEX fidx_ngram(`content_ngram`) WITH ANALYZER ngram,
  FULLTEXT INDEX fidx_edge_ngram(`content_edge_ngram`) WITH ANALYZER edge_ngram,
  PRIMARY KEY (`id`)
) DISTRIBUTED BY HASH(id);                

AliNLP分词器

AliNLP分词器是由阿里云与达摩院自然语言处理平台提供的自然语言分词工具包,支持通过全文词典使用实体词和停用词。AliNLP分词器将连续的自然语言文本,切分成语义合理、完整的词条序列,支持中文、英文、印度尼西亚语、马来语、泰语、越南语、法语和西班牙语等语言。

AliNLP配置项

如何查看和修改分词器的配置,请参见查看和修改分词器配置

配置项

取值说明

FULLTEXT_SPLIT_GRANULARITY

分词的粒度。默认值为2,取值范围是2~8之间的整数。

FULLTEXT_FILTER_ST_CONVERT_ENABLED

是否开启词干转换。取值:

  • true:开启词干转换。

  • false(默认值):不开启词干转换。

例如:men经过词干转换后变为man, cars变为car。

FULLTEXT_TOKENIZER_CASE_SENSITIVE

是否区分大小写。取值:

  • true:区分大小写。

  • false(默认值):不区分大小写。

分词效果

默认配置的分词效果如下:

  • 英文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_alinlp_test('Hello world');

    返回结果:

    [hello,  , world]
  • 中文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_alinlp_test('产品和服务');

    返回结果:

    [产品, 和, 服务]
说明

查看分词效果时,必须在SQL语句前添加/*+ mode=two_phase*/ ,否则SQL语句无法正确执行。

IK分词器

IK分词器是一个开源的轻量级中文分词工具包,支持通过全文词典使用实体词和停用词。

IK配置项

如何查看和修改分词器的配置,请参见查看和修改分词器配置

配置项

取值说明

CSTORE_IK_SEGMENTER_USE_SMART_ENABLE

分词的粒度。取值:

  • true:ik_smart粗粒度分词。

  • false(默认值):ik_max_word细粒度分词。

CSTORE_IK_SEGMENTER_LETTER_MIN_LENGTH

分词词条的最小长度。默认值为3,取值范围是2~16之间的整数。

CSTORE_IK_SEGMENTER_LETTER_MAX_LENGTH

分词词条的最大长度。默认值为128,取值范围是2~256之间的整数。

分词效果

默认配置的分词效果如下:

  • 英文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_ik_test('Hello world');

    返回结果:

    [hello, world, or]
  • 中文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_ik_test('产品和服务');

    返回结果:

    [产品, 和服, 服务, 服, 务]
说明

查看分词效果时,必须在SQL语句前添加/*+ mode=two_phase*/ ,否则SQL语句无法正确执行。

Standard分词器

Standard分词器在对文本进行切分时遵循不同的规则,切分英文文本时,先将文本转换为小写形式并去除停用词和标点符号,然后进行切分;切分中文文本时直接按照单字切分。Standard分词器支持通过全文词典使用实体词和停用词。

Standard配置项

如何查看和修改分词器的配置,请参见查看和修改分词器配置

配置

取值说明

FULLTEXT_MAX_TOKEN_LENGTH

被分词文本的最大长度,超出部分不再被分词。默认值为255,取值范围是1~1048576之间的整数。

分词效果

默认配置的分词效果如下:

  • 英文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_standard_test('Hello world');

    返回结果:

    [hello, world]
  • 中文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_standard_test('产品和服务');

    返回结果:

    [产, 品, 和, 服, 务]
说明

查看分词效果时,必须在SQL语句前添加/*+ mode=two_phase*/ ,否则SQL语句无法正确执行。

Ngram分词器

Ngram分词器根据配置项FULLTEXT_NGRAM_TOKEN_SIZE的取值切分文本,支持通过全文词典使用实体词和停用词。使用Ngram分词器可以提升模糊检索的查询效率。

Ngram配置项

如何查看和修改分词器的配置,请参见查看和修改分词器配置

配置

取值说明

FULLTEXT_NGRAM_TOKEN_SIZE

文本切分的长度。默认值为2,取值范围是1~8之间的整数。

例如:对“产品和服务”分词,当FULLTEXT_NGRAM_TOKEN_SIZE=1时,分词为【产, 品, 和, 服, 务】;当FFULLTEXT_NGRAM_TOKEN_SIZE=2时,分词为【产品, 品和, 和服, 服务】;当FULLTEXT_NGRAM_TOKEN_SIZE=3时,分词为【产品和, 品和服, 和服务】。

分词效果

默认配置的分词效果如下:

  • 英文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_ngram_test('Hello world');

    返回结果:

    [he, el, ll, lo, o ,  w, wo, or, rl, ld]
  • 中文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_ngram_test('产品和服务');

    返回结果:

    [产品, 品和, 和服, 服务]
说明

查看分词效果时,必须在SQL语句前添加/*+ mode=two_phase*/ ,否则SQL语句无法正确执行。

Edge_ngram分词器

Edge_ngram分词器使用了与Ngram分词器一样的分词方法。Edge_ngram主要应用于前缀分词和匹配的场景,支持通过全文词典使用实体词和停用词。

Edge_ngram配置项

如何查看和修改分词器的配置,请参见查看和修改分词器配置

配置

取值说明

FULLTEXT_MIN_GRAM_SIZE

前缀切分的最小长度。默认值为1,取值范围是1~8之间的整数。

FULLTEXT_MAX_GRAM_SIZE

前缀切分的最大长度,取值必须大于前缀切分的最小长度。默认值为2,取值范围是1~16之间的整数。

分词效果

默认配置的分词效果如下:

  • 英文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_edge_ngram_test('Hello world');

    返回结果:

    [h, he]
  • 中文文本的分词效果。

    /*+ mode=two_phase*/ SELECT fulltext_edge_ngram_test('产品和服务');

    返回结果:

    [产, 产品]
说明

查看分词效果时,必须在SQL语句前添加/*+ mode=two_phase*/ ,否则SQL语句无法正确执行。

Pattern分词器

Pattern分词器按正则表达式切分文本,不支持通过全文词典使用实体词、停用词和通过SQL语句查询分词效果。

语法

FULLTEXT INDEX fidx_name(`column_name`) WITH ANALYZER pattern_tokenizer("Custom_rule") [ WITH DICT `tbl_dict_name` ];

参数说明

Custom_rule:正则表达式。

示例

  • 指定以-作为切分文本的规则,将“商品的用户价值-和使用价值”切分为[商品的用户价值,和使用价值]

    FULLTEXT INDEX fidx_pattern(`content_pattern`) WITH ANALYZER pattern_tokenizer("-");
  • 指定以/作为切分文本的规则,将“商品的/用户价值/和/使用价值”切分为[商品的,用户价值,和,使用价值]

    FULLTEXT INDEX fidx_pattern(`content_pattern`) WITH ANALYZER pattern_tokenizer("/");

Pattern配置项

如何查看和修改分词器的配置,请参见查看和修改分词器配置

配置

取值说明

FULLTEXT_TOKENIZER_CASE_SENSITIVE

是否区分大小写。取值:

  • true:区分大小写。

  • false(默认值):不区分大小写。

查看和修改分词器配置

AnalyticDB for MySQL支持查看和修改分词器的配置。

查看配置

  • 使用show adb_config查询配置项。

    语法

    show adb_config key <analyzer_param>;

    参数说明

    analyzer_param:配置项名称。

    示例

    show adb_config key FULLTEXT_NGRAM_TOKEN_SIZE;
    说明

    show adb_config命令可以查询默认配置项和修改后的配置项。

  • 使用SELECT查询配置项。

    语法

    SELECT `key`, `value`, `update_time`
    FROM INFORMATION_SCHEMA.kepler_meta_configs
    WHERE key = '<analyzer_param>';

    参数说明

    analyzer_param:配置项名称。

    示例

    SELECT `key`, `value`, `update_time`
    FROM INFORMATION_SCHEMA.kepler_meta_configs
    WHERE key = 'FULLTEXT_NGRAM_TOKEN_SIZE';
    说明

    SELECT语句只能查询修改后的配置项,如果查询默认的配置项,查询结果为空。

修改配置

语法

set adb_config <analyzer_param>=<value>;

参数说明

  • analyzer_param:配置项的名称。

  • value:配置项的取值。

示例

set adb_config FULLTEXT_NGRAM_TOKEN_SIZE=3;