• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ngram全文分析器

    内置的MySQL全文分析器使用单词之间的空白作为定界符来确定单词的开始和结束位置,这在使用不使用单词定界符的表意语言时是一个限制。为了解决此限制,MySQL提供了一个支持中文,日语和朝鲜语(CJK)的ngram全文语法分析器。支持将ngram全文分析器与InnoDB和一起使用MyISAM

    注意

    MySQL还为日语提供了MeCab全文解析器插件,该插件将文档标记化为有意义的单词。有关更多信息,请参见“ MeCab全文分析器插件”。

    ngram是n来自给定文本序列的连续字符序列。ngram解析器将文本序列标记为连续的n字符序列。例如,您可以使用ngram全文分析器将“ abcd ”标记为不同的值n

    n=1: 'a', 'b', 'c', 'd'
    n=2: 'ab', 'bc', 'cd'
    n=3: 'abc', 'bcd'
    n=4: 'abcd'
    

    ngram全文语法分析器是内置的服务器插件。与其他内置服务器插件一样,启动服务器时会自动加载该插件。

    “全文搜索功能”中描述的全文搜索语法适用于ngram解析器插件。本节介绍了解析行为的差异。全文相关的配置选项,除了最小和最大字长选项(innodb_ft_min_token_sizeinnodb_ft_max_token_sizeft_min_word_lenft_max_word_len)也适用。

    配置ngram令牌大小

    ngram解析器的默认ngram令牌大小为2(bigram)。例如,令牌大小为2时,ngram解析器将字符串“ abc def ”解析为四个令牌:“ ab ”,“ bc ”,“ de ”和“ ef ”。

    可以使用ngram_token_size配置选项来配置ngram令牌大小,该选项的最小值为1,最大值为10。

    通常,ngram_token_size设置为要搜索的最大令牌的大小。如果仅打算搜索单个字符,请将其设置ngram_token_size为1。较小的令牌大小将产生较小的全文本搜索索引,并且搜索速度更快。如果您要搜索包含多个字符的单词,请进行相应设置ngram_token_size。例如,“生日快乐”是“生日快乐”简体中国,在“生日”是“生日”和“快乐”译为“快乐”。要搜索诸如此类的两个字符的单词,请将其设置ngram_token_size为2或更高的值。

    作为只读变量,ngram_token_size只能将其设置为启动字符串的一部分或在配置文件中:

    • 启动字符串:

      mysqld --ngram_token_size=2
      
    • 配置文件:

      [mysqld]
      ngram_token_size=2
      
    注意

    下面的最小和最大字长配置选项被忽略FULLTEXT的是使用NGRAM解析器指标:innodb_ft_min_token_sizeinnodb_ft_max_token_sizeft_min_word_len,和ft_max_word_len

    创建使用ngram解析器的FULLTEXT索引

    要创建FULLTEXT一个使用NGRAM解析器指数,指定WITH PARSER ngramCREATE TABLEALTER TABLECREATE INDEX

    下面的示例演示了如何创建具有ngramFULLTEXT索引的表,插入示例数据(简体中文文本)以及在INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE表中参见标记化数据。

    mysql> USE test;
    
    mysql> CREATE TABLE articles (
          id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
          title VARCHAR(200),
          body TEXT,
          FULLTEXT (title,body) WITH PARSER ngram
        ) ENGINE=InnoDB CHARACTER SET utf8mb4;
    
    mysql> SET NAMES utf8mb4;
    
    INSERT INTO articles (title,body) VALUES
        ('数据库管理','在本教程中我将向你展示如何管理数据库'),
        ('数据库应用开发','学习开发数据库应用程序');
        
    mysql> SET GLOBAL innodb_ft_aux_table="test/articles";
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position;
    

    要将FULLTEXT索引添加到现有表中,可以使用ALTER TABLECREATE INDEX。例如:

    CREATE TABLE articles (
          id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
          title VARCHAR(200),
          body TEXT
         ) ENGINE=InnoDB CHARACTER SET utf8;
    
    ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;
    
    # Or:
    
    CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;
    

    ngram解析器空间处理

    ngram解析器在解析时消除空格。例如:

    • “ ab cd ”解析为“ ab ”,“ cd ”
    • “ a bc ”被解析为“ bc ”

    ngram解析器停用词处理

    内置的MySQL全文分析器将单词与停用词列表中的条目进行比较。如果单词等于停用词列表中的条目,则该单词将从索引中排除。对于ngram解析器,停用词处理的执行方式有所不同。ngram解析器不排除与停用词列表中的条目相等的令牌,而是排除包含停用词的令牌。例如,假设ngram_token_size=2将包含“ a,b ”的文档解析为“ a ”和“,b ”。如果将逗号(“,”)定义为停用词,则两者“ a ”和“,b ”从索引中排除,因为它们包含逗号。

    默认情况下,ngram解析器使用默认停用词列表,其中包含英语停用词列表。对于适用于中文,日语或韩语的停用词列表,您必须创建自己的停用词。有关创建停用词列表的信息,请参见“全文停用词”。

    停用词的长度大于ngram_token_size被忽略的词。

    ngram解析器术语搜索

    对于自然语言模式搜索,搜索词将转换为ngram词的并集。例如,字符串“ abc ”(假设ngram_token_size=2)被转换为“ ab bc ”。给定两个文档,一个包含“ ab ”,另一个包含“ abc ”,搜索词“ ab bc ”匹配两个文档。

    对于布尔模式搜索,搜索项将转换为ngram短语搜索。例如,字符串“ abc”(假设ngram_token_size=2)被转换为““ ab bc ””。给定两个文档,一个包含“ ab”,另一个包含“ abc”,搜索词组““ ab bc ””仅与包含“ abc”的文档匹配。

    ngram解析器通配符搜索

    因为FULLTEXTngram索引仅包含ngram,并且不包含有关术语开头的信息,所以通配符搜索可能返回意外结果。以下行为适用于使用ngram FULLTEXT搜索索引的通配符搜索:

    • 如果通配符搜索的前缀词短于ngram令牌大小,则查询将返回所有包含以前缀词开头的ngram令牌的索引行。例如,假设ngram_token_size=2搜索“ a *”将返回以“ a ”开头的所有行。
    • 如果通配符搜索的前缀词长于ngram令牌大小,则该前缀词将转换为ngram短语,并且通配符运算符将被忽略。例如,假设ngram_token_size=2将“ abc *”通配符搜索转换为“ ab bc ”。

    ngram解析器短语搜索

    短语搜索将转换为ngram短语搜索。例如,将搜索短语“ abc ”转换为“ ab bc ”,这将返回包含“ abc ”和“ ab bc ”的文档。

    搜索短语“ abc def ”被转换为“ ab bc de ef ”,这将返回包含“ abc def ”和“ ab bc de ef ”的文档。不返回包含“ abcdef ”的文档。