MySQL全文搜索BOOLEAN模式未返回开头完全匹配记录问题
MySQL全文搜索未返回匹配记录的原因排查
- 最小分词长度限制
MySQL InnoDB引擎默认的innodb_ft_min_token_size参数值为3,MyISAM引擎默认的ft_min_word_len参数值为4。你搜索的关键词10只有2个字符,若最小分词长度设置大于2,这个词会被排除在全文索引之外,不会参与匹配。
你可以执行以下命令查看当前设置:
show variables like '%ft_min%';
如果数值大于2,需要修改my.cnf配置文件调整参数,重启MySQL后重建listingAddress字段的全文索引才能生效。
- 空格字符不匹配
如果存储的地址10 6588 SOUTHOAKS CRESCEN中,10和6588之间的空白是全角空格、不间断空格或者其他不可见特殊字符,分词时会把10和6588识别为同一个整体词,你用半角空格分隔的10 6588自然匹配不到该记录。
你可以执行以下简单查询验证该记录是否能被模糊匹配,排查字符问题:
select listingAddress from listings where listingAddress like '10 6588%' and status = 'sold';
如果上面的查询能返回目标记录,就可以确认是分词时空格字符的问题。
- 全文索引未更新
如果目标记录是在创建listingAddress字段的全文索引之后插入的,且表的自动索引更新机制出现异常,或者你手动关闭了索引自动更新,那么该记录的内容不会被加入到全文索引中,自然无法被搜索命中。
你可以尝试重建全文索引验证:
ALTER TABLE listings DROP INDEX 你的全文索引名称; ALTER TABLE listings ADD FULLTEXT INDEX 你的全文索引名称(listingAddress);
- 停用词过滤
MySQL全文索引默认会过滤停用词(常见无意义词汇),虽然数字默认不在停用词列表中,但如果你自定义了停用词表,刚好把10加入了停用词,那这个词也会被排除在索引之外,无法参与匹配。
可以执行以下命令查看停用词相关配置:
show variables like '%ft_stopword%';
- 布尔模式匹配规则问题
MySQL布尔全文搜索中,空格分隔的多个关键词默认是「或」关系,只要命中任意一个关键词就会返回,权重更高的排在前面。你返回的三条结果都命中了6588,如果目标记录的6588确实被索引但未出现在结果中,你可以调整查询语句,强制要求两个关键词同时命中,加上+前缀:
select id,listingID,listingArea,subArea,city,listingAddress,status from listings where MATCH(listingAddress) AGAINST ('+10 +6588' IN BOOLEAN MODE) and status != 'Terminated' and status != 'Expired' limit 100;
调整后如果仍未返回,就可以排除匹配规则的问题。
内容的提问来源于stack exchange,提问作者kamran07
相关产品推荐
相关产品推荐

