关于mariadb全文索引的调研

项目目的

  • 项目中存在大量的 like "%xxx%" 作为用户名模糊搜索
  • 代替 select * from table where field liken "%好嗨%"

设置ft_min_word_len

ft_min_word_len=1

还有ft_max_word_len参数 我用的是默认的

建立索引

ALTER TABLE `db`.`table` 
ADD FULLTEXT INDEX `ft_field` (`field` ASC);

执行搜索

按照自然语言查询,匹配完整单词

SELECT * FROM table WHERE MATCH(field) AGAINST('aaa')
aaa AAA Aaa . Aaaaaaaaan.
匹配到 匹配到 匹配到 匹配不到

个人觉得 因为 这里的 查询是作为精确匹配的

按照字符匹配查询,从单词开头开始

  • 通配符只能放在单词的结尾
SELECT * FROM table WHERE MATCH(field) AGAINST('好嗨*' IN BOOLEAN MODE)
好嗨哦~ 好嗨哦 82年的好嗨哟 ͡好嗨呦
匹配到 匹配到 匹配不到 匹配不到

count个数

sql count
select count(*) from table WHERE field LIKE "%好嗨%" 21
SELECT count(*) FROM table WHERE MATCH(field) AGAINST('好嗨*' IN BOOLEAN MODE) 19
select count(*) from table WHERE field LIKE "%aaa%" 1887
SELECT count(*) FROM table WHERE MATCH(field) AGAINST('aaa*' IN BOOLEAN MODE) 961

下一步

看mariadb是否能使用 ngram

参考文章