mysql的全文索引

如果你想在 u_record 表中对 content 字段进行“中文两个字”的模糊匹配,比如想查包含 “全文” 或 “索引” 这样的词语,推荐方式是使用 ngram 分词器 + FULLTEXT 索引,效果类似于 %xx% 的模糊匹配,但性能更好。

✅ 一步步实现:

✅ 1. 确保使用的是 MySQL 5.7+ / 8.0+

并且 InnoDB 引擎支持全文索引(MySQL 5.6+ 开始支持,但推荐用 8.0)

 

✅ 2. 创建全文索引 + 使用 ngram 分词器(适配中文)

sql
ALTER TABLE u_record ADD FULLTEXT INDEX idx_content(content) WITH PARSER ngram;

🔧 默认 ngram_token_size 是 2,表示以“两个字”为一个最小单位切词,非常适合你现在的需求(“查两个字”)

 

✅ 3. 进行模糊查询(用 MATCH ... AGAINST)

比如查包含“全文”这两个字的记录:

sql
SELECT * FROM u_record WHERE MATCH(content) AGAINST('全文' IN NATURAL LANGUAGE MODE);

也可以换成布尔模式(效果略不同):

sql
SELECT * FROM u_record WHERE MATCH(content) AGAINST('全文' IN BOOLEAN MODE);
'

📌 效果说明:

  • ngram 分词会将内容像这样切片:

    ruby
    "这是一个测试全文索引功能" => ["这是", "是一", "一个", "个测", "测试", "试全", "全文", "文索", "索引", "引功", "功能"]
  • 所以当你搜索 "全文",就能准确匹配,效果等价于:

    sql
    SELECT * FROM u_record WHERE content LIKE '%全文%'

    但性能更好,因为是倒排索引。

 

✅ 4. 可选优化:设置更小的粒度

你也可以设置 ngram_token_size = 1(匹配一个字的粒度),但通常不推荐,因为匹配太宽泛,会导致命中率太高 & 精度低:

sql
SET GLOBAL ngram_token_size = 1;

⚠️ 设置后需要重建索引,并且是全局参数,重启后会失效 unless 配置在 my.cnf


🔚 总结

如果你想对表 u_recordcontent 字段进行“中文两个字”的模糊匹配:

  • ✅ 建立全文索引,使用 ngram 分词器

  • ✅ 使用 MATCH(content) AGAINST('两个字')

  • ✅ 效果 ≈ LIKE '%两个字%',但性能更优

 
 
posted @ 2025-04-08 21:59  matengfei  阅读(18)  评论(0)    收藏  举报