MySQL MATCH AGAINST布尔模式得分异常,精确匹配未获最高分
问题描述
我执行了以下SQL语句:
SELECT id, cleanDescription, (MATCH (cleanDescription) AGAINST ('amazon com' IN BOOLEAN MODE)) AS score FROM Foo
得到的结果集如下:
[ { "id": "1", "cleanDescription": "amazon prime pmts", "score": 4.788609504699707 }, { "id": "2", "cleanDescription": "amazon prime", "score": 4.788609504699707 }, { "id": "3", "cleanDescription": "amazon com", "score": 4.788609504699707 }, { "id": "4", "cleanDescription": "amazon com amzn com bi", "score": 4.788609504699707 }, { "id": "5", "cleanDescription": "amazon com amzn com bi", "score": 4.788609504699707 } ]
我很困惑:id为3的记录是查询字符串的精确匹配,但所有结果的得分完全相同,没有拿到最高分。这是忽略了什么细节吗?
问题原因与解决方案
核心原因:MySQL布尔模式的得分逻辑
MySQL的IN BOOLEAN MODE设计初衷是判断匹配与否,而非生成精细化的相关性得分:
- 当你用
'amazon com'在布尔模式下查询时,等价于要求记录同时包含amazon和com两个词。 - 所有满足这个条件的记录,默认会获得相同的基础得分,不会因为是精确短语匹配、关键词出现次数多寡等因素产生得分差异。
可行的解决方法
1. 切换为自然语言模式
自然语言模式会依据词频、文档长度、逆文档频率等因素计算相关性得分,精确匹配的记录通常会得到更高的分数。修改后的SQL:
SELECT id, cleanDescription, (MATCH (cleanDescription) AGAINST ('amazon com')) AS score FROM Foo
2. 在布尔模式中手动提升短语匹配权重
通过双引号指定精确短语,并给该短语增加权重(+符号强化匹配优先级并提升得分),这样精确匹配的记录得分会高于仅包含单个词的记录:
SELECT id, cleanDescription, (MATCH (cleanDescription) AGAINST ('+"amazon com" amazon com' IN BOOLEAN MODE)) AS score FROM Foo
3. 补充自定义排序逻辑
如果需要保留布尔模式的匹配规则,同时让精确匹配的记录排在最前面,可以在ORDER BY中增加额外的判断条件:
SELECT id, cleanDescription, (MATCH (cleanDescription) AGAINST ('amazon com' IN BOOLEAN MODE)) AS score FROM Foo ORDER BY score DESC, (cleanDescription = 'amazon com') DESC
内容的提问来源于stack exchange,提问作者benhowdle89
相关产品推荐
相关产品推荐

