diff --git a/mysql/mysql文档/mysql_索引.md b/mysql/mysql文档/mysql_索引.md index b8ab4da..9ece469 100644 --- a/mysql/mysql文档/mysql_索引.md +++ b/mysql/mysql文档/mysql_索引.md @@ -77,6 +77,12 @@ - [配置`ngram_token_size`](#配置ngram_token_size) - [使用ngram parser创建fulltext Index](#使用ngram-parser创建fulltext-index) - [ngram parser space handling](#ngram-parser-space-handling) + - [ngram handle stop word](#ngram-handle-stop-word) + - [natural language mode](#natural-language-mode) + - [boolean mode](#boolean-mode) + - [ngram parser wildcard Search](#ngram--parser-wildcard-search) + - [前缀小于ngram token size](#前缀小于ngram-token-size) + - [前缀大于ngram token size](#前缀大于ngram-token-size) # innodb索引与算法 @@ -931,5 +937,64 @@ ngram parser在处理时消除空格,示例如下: - `ab cd`会被转化为`ab`和`cd` - `a bc`会被转化为`bc` +示例如下: +```sql +create table ngram_t ( + id bigint auto_increment not null, + c1 text, + c2 text, + primary key(id), + fulltext `idx_ft_c1_c2` (c1, c2) with parser ngram +); + +insert into ngram_t(c1, c2) +values + ('突发!泽连斯基最新表态,称将与特朗普举行会谈', '与特朗普举行会谈'), + ('如能换取乌克兰加入北约愿立即辞职','乌克兰总统泽连斯基称将与美国总统特朗普举行会谈,如能换取乌克兰加入北约愿立即辞职'); +``` +执行上述语句后,执行如下语句,分词信息如下所示: +```sql +set global innodb_ft_aux_table='innodb_demo/ngram_t'; +select * from information_schema.INNODB_FT_INDEX_CACHE limit 20; +``` +| WORD | FIRST\_DOC\_ID | LAST\_DOC\_ID | DOC\_COUNT | DOC\_ID | POSITION | +| :--- | :--- | :--- | :--- | :--- | :--- | +| ,如能换 | 3 | 5 | 2 | 3 | 118 | +| ,如能换 | 3 | 5 | 2 | 5 | 118 | +| ,称将与 | 2 | 4 | 2 | 2 | 33 | +| ,称将与 | 2 | 4 | 2 | 4 | 33 | +| !泽连斯 | 2 | 4 | 2 | 2 | 6 | +| !泽连斯 | 2 | 4 | 2 | 4 | 6 | +| 与特朗普 | 2 | 4 | 2 | 2 | 42 | +| 与特朗普 | 2 | 4 | 2 | 2 | 25 | +| 与特朗普 | 2 | 4 | 2 | 4 | 42 | +| 与特朗普 | 2 | 4 | 2 | 4 | 25 | +| 与美国总 | 3 | 5 | 2 | 3 | 82 | +| 与美国总 | 3 | 5 | 2 | 5 | 82 | +| 举行会谈 | 2 | 5 | 4 | 2 | 54 | +| 举行会谈 | 2 | 5 | 4 | 2 | 25 | +| 举行会谈 | 2 | 5 | 4 | 3 | 106 | +| 举行会谈 | 2 | 5 | 4 | 4 | 54 | +| 举行会谈 | 2 | 5 | 4 | 4 | 25 | +| 举行会谈 | 2 | 5 | 4 | 5 | 106 | +| 乌克兰加 | 3 | 5 | 2 | 3 | 12 | +| 乌克兰加 | 3 | 5 | 2 | 3 | 121 | + +### ngram handle stop word +#### natural language mode +对于natural language mode,`被搜索的词`将会被转化为ngram的并集,例如`abc`(假设ngram token size为2)将会被转化为`ab bc`。 + +如果存在两个文档,一个文档包含`ab`,另一个文档包含`abc`,搜索词`ab bc`将会匹配两个文档。 + +#### boolean mode +对于boolean mode,search item将会被转化为ngram phase search,例如`abc`将会被转化为`ab bc`,如果两个文档一个包含`ab`,另一个包含`abc`,那么phase `ab bc`只会匹配包含`abc`的文档。 + +### ngram parser wildcard Search +使用ngram praser时fulltext index只包含ngrams,使用通配符时会按照如下行为进行执行: +#### 前缀小于ngram token size +如果前缀小于ngram token size,那么查询将会返回所有以prefix item开始的行。例如,当`ngram_token_size`为2时,查询`a*`将会返回所有以`a`开头的行 +#### 前缀大于ngram token size +如果前缀大于ngram token size,那么前缀将会转化为ngram phase,并且wildcard将会被忽略。例如,当`ngram_token_size`为2,查询`abc*`将会转换为`ab bc` +