MySQL全文搜索:匹配单词复数而非任意后缀字符的优化方法
MySQL全文搜索匹配指定单词变体(避免超长后缀误匹配)
你的问题出在布尔模式下的*前缀通配会匹配所有以目标词开头的内容,不管后缀长度。要只匹配Mary、Marys或Mary's,可以用以下两种方案:
方案1:精确指定匹配项
直接在全文搜索中列出所有需要匹配的完整词,用双引号包裹实现精确匹配:
SELECT * FROM newssitestwo WHERE MATCH(snippet, name) AGAINST('"Mary" "Marys" "Mary\'s"' IN BOOLEAN MODE) ORDER BY datePublished DESC LIMIT 300
这种方式最直接,适合你只需要处理简单加s复数和所有格的场景,不会出现误匹配。
方案2:结合正则表达式过滤
如果需要保留一定的灵活性,先通过全文搜索缩小范围,再用正则限制后缀:
SELECT * FROM newssitestwo WHERE MATCH(snippet, name) AGAINST('Mary*' IN BOOLEAN MODE) AND (snippet REGEXP '[[:<:]]Mary(''s|s)?[[:>:]]' OR name REGEXP '[[:<:]]Mary(''s|s)?[[:>:]]') ORDER BY datePublished DESC LIMIT 300
这里[[:<:]]和[[:>:]]是MySQL的单词边界标记,确保匹配的是独立单词;(''s|s)?表示可选的s或's后缀,精准限制了允许的变体形式。
内容的提问来源于stack exchange,提问作者Jimmison Johnson
相关产品推荐
相关产品推荐

