MySQL ngram 全文解析器17 Mar 2025 | 5 分钟阅读 在本文中,我们将学习 MySQL ngram 全文解析器的用法,该解析器支持对日语、中文和韩语等象形文字语言进行全文搜索。 内置的 MySQL 全文解析器使用空格作为单词之间的分隔符,这些分隔符决定了单词的开始和结束。当处理像日语、中文和韩语这样的象形文字语言时,全文解析器存在局限性,因为它们不使用单词分隔符。 MySQL 提供了 ngram 全文解析器来解决这个问题。在 MySQL 5.x 版本之后,MySQL 将 ngram 全文解析器作为内置服务器插件提供。与所有其他内置插件一样,MySQL 在数据库服务器启动时会自动加载此插件。ngram 全文解析器同时支持 InnoDB 和 MyISAM 存储引擎。 根据 MySQL 中的定义,ngram 是给定文本序列中连续的 n 个字符组成的序列。其主要功能是将文本序列分词为连续的 n 个字符序列。例如,使用 ngram 全文解析器,我们可以将字符串“java”分词为不同 N 值的结果,如下所示: 使用 ngram 解析器创建 FULLTEXT 索引我们可以通过在 CREATE TABLE、ALTER TABLE 或 CREATE INDEX 语句中指定 WITH PARSER ngram 来使用 ngram 解析器创建 FULLTEXT 索引。 考虑以下示例,该示例创建一个名为“articles”的表,并为 title 和 body 列添加 ngram 全文解析器。 接下来,我们将使用 SET NAMES 语句将字符集设置为 UTF8MB4,如下所示: 接下来,将示例文本(简体中文)插入此表中,如下所示: 第四,我们将使用以下语句查看 ngram 如何对数据进行分词: 我们将得到如下结果: ![]() 这种类型的语句有助于故障排除。例如,如果我们搜索一个不包含在内的词,那么该词将被视为停用词,并且可能不会被索引,或者可能是其他原因。 设置 ngram 标记大小在前面的示例中,我们可以看到 ngram 中默认的标记大小 (n) 是 2。如果我们想更改默认标记大小,我们需要使用 ngram_token_size 配置选项,其值范围在 1 到 10 之间。需要注意的是,较小的标记大小会产生较小的全文搜索索引,同时也能提供快速的搜索。 ngram_token_size 是一个只读变量,因此我们只能通过以下两种方式设置其值: 1. 在启动字符串中 2. 在配置文件中 ngram 解析器中的空格处理在解析时,ngram 解析器会忽略空格。例如:
ngram 解析器短语搜索MySQL 将短语搜索转换为 ngram 短语搜索。例如,我们有一个短语搜索 "abc",它被转换为 "ab bc",返回包含 "abc" 和 "ab bc" 的结果。 如果我们有一个搜索短语 "abc def",它被转换为 "ab bc de ef",则返回包含 "abc def" 和 "ab bc de ef" 的结果。它不会返回包含 "abcdef" 的文档。 以下语句显示在 articles 表中搜索短语 ??: 这是结果: ![]() 处理不同的 ngram 搜索模式在这里,我们将使用以下模式处理 ngram 的搜索结果: 自然语言模式NATURAL LANGUAGE 搜索模式会将搜索词转换为 ngram 值的并集。例如,如果标记大小为 2,搜索词“mysql”可以转换为 my ys sq 和 ql。请参阅以下语句: 我们将获得所需的结果。 ![]() 布尔模式Boolean 搜索模式将搜索词转换为 ngram 短语搜索。请参阅以下语句: 我们将获得所需的结果。 ![]() ngram 解析器通配符搜索当我们在 ngram 解析器中使用通配符进行搜索时,可能会得到意外的结果。因为 ngram FULLTEXT 索引只包含 ngram,所以它不知道术语的开头。 以下规则用于使用通配符执行 ngram 全文索引搜索: 1. 如果 ngram 标记大小大于通配符中的前缀项,则查询将返回所有包含以该前缀项开头的 ngram 标记的文档。例如: 我们将得到如下结果: ![]() 2. 如果 ngram 标记大小小于通配符中的前缀项,MySQL 将把前缀项转换为 ngram 短语,并忽略通配符运算符。例如: 我们将得到以下结果,其中术语“mysql”被转换为 ngram 短语:“my” “ys” “sq” “ql”。 ![]() 处理 ngram 解析器中的停用词ngram 解析器会将单词与停用词列表中的条目进行比较。如果它们相等,则该单词将从索引中排除。 ngram 解析器对停用词的处理方式有所不同。它会排除包含停用词的标记,而不是排除与停用词列表相等的标记。 例如,如果 ngram_token_size 为 2,并且文档包含“a,b”,则 ngram 解析器会将它们分词为“a,”和“,b”。如果逗号 (",") 是一个停用词,那么“a,”和“,b”都会被排除,因为它们包含逗号。 需要注意的是,ngram 解析器使用默认的英文停用词列表。如果我们要使用其他语言,则必须自己创建。 下一主题MySQL vs MongoDB |
我们请求您订阅我们的新闻通讯以获取最新更新。