给真实文本建FULLTEXT索引,对比自然语言模式的相关度打分和布尔模式的精确必须/排除筛选。
代码CREATE TABLE ft_test (id INT PRIMARY KEY AUTO_INCREMENT, body TEXT, FULLTEXT(body)); INSERT INTO ft_test (body) VALUES ('MySQL is a popular open source database'), ('PostgreSQL is also a popular open source database'), ('Redis is an in-memory data store'), ('MySQL replication uses binary logs'); SELECT id, body, MATCH(body) AGAINST('MySQL database') AS relevance FROM ft_test WHERE MATCH(body) AGAINST('MySQL database') ORDER BY relevance DESC;
id body relevance 1 MySQL is a popular open source database 0.1812381148338318 ← 同时命中MySQL和database 2 PostgreSQL is also a popular open source db... 0.0906190574169159 ← 只命中database 4 MySQL replication uses binary logs 0.0906190574169159 ← 只命中MySQL (Redis那一行真实完全没有出现,两个词都不命中)
只命中一个词的两行,相关度分数真实精确相同(0.0906...),同时命中两个词的那一行,分数真实精确是前者的2倍——这是MySQL默认的相关度算法真实体现出的线性叠加特征,同时也真实自动把完全不命中的行(Redis那条)排除在结果集之外,不需要额外的WHERE过滤逻辑。
SELECT id, body FROM ft_test WHERE MATCH(body) AGAINST('+MySQL -replication' IN BOOLEAN MODE);
→ 只返回 id=1("MySQL is a popular open source database")
真实精确排除了同样含MySQL但也含replication的id=4每一步都是本文上面用真实FULLTEXT查询跑出来的原始结果。
MATCH() AGAINST()自然语言模式 vs IN BOOLEAN MODE