MariaDB 全文索引

MariaDB 和 MySQL 的全文索引的建立方式与查找方式,都和普通的索引不同。

建立索引

建立索引的语法可以简单也可以复杂:

FULLTEXT(title)
FULLTEXT(title,content)
FULLTEXT INDEX post_title_content_ft_index(title,content)

查询

1. 按照自然语言查询,匹配完整单词。比如查询 rabbit 可以匹配 rabbit, rabbits, Rabbits,但是查询 rab 不能匹配 rabbit 。

MATCH(title,content) AGAINST('rabbit')

2. 按照字符匹配查询,从单词开头开始。查询 rab 可以匹配 rabbit ,但是查询 bit 不能匹配 rabbit 。

MATCH(title,content) AGAINST('rabbit' IN BOOLEAN MODE)

多列索引与单列索引

对于普通的索引,如果建立了(title,content)的联合索引,就不必单独建立 title 和 content 的索引,也可以搜索单列。但是全文索引就不行,索引的列必须和查询的列完全一致。如果查询 title ,就要建立 title 单列的全文索引;如果查询 (title, content) 就要建立只包含 (title, content) 两列的索引。

搜索中文

MySQL 和 MariaDB 的全文索引一开始就不是为东亚语言设计的。单词断字是按照空格和标点符号的,但是中日韩文字单词之间没有空格。因此搜索“明月”无法匹配“床前明月光”。使用 IN NATURAL LANGUAGE MODE 只有在搜索整句的时候才能匹配到,基本上没有什么用处。使用 IN BOOLEAN MODE 的时候,只能搜索一句的开头,比如“床前*”可以匹配,而“明月*”就不行。* 通配符只能放在单词的结尾。

因此对中文而言,全文索引反而没有 %LIKE% 的效果好,虽然 %LIKE% 的效率很低。小型网站,可以采用。

MySQL 提供了额外的 ngram 技术,支持每 n 个字符断字。这样就可以用逐字搜索中日韩文字。但 MariaDB 还没有引进此功能。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.