我在使用mysqls MATCH()时遇到了一个问题。。。AGINST()。
因为我想解决我的问题可能更容易,所以我创建了一个小的SQLFiddle。
我完全理解,为什么在Select语句的工作方式上,"Foo-Bar-Foo"比"Foo-Bar"更相关。但我想要的是,"完全匹配"术语的相关性比"完全匹配和多一点"术语更高。
title relevance
Foo Bar 0.046829063445329666
Foo Bar Foo 0.031219376251101494
Foo 0
Bar 0
如果不使用"并集"来组合两个语句,这个结果可能吗?
答案(感谢Gordon Linoff):
SELECT *
FROM FOOBAR
WHERE title LIKE '%Foo Bar%'
ORDER BY (CASE WHEN title LIKE 'Foo Bar%' THEN 1 ELSE 0 end) DESC,
MATCH (title) AGAINST ('Foo Bar' IN BOOLEAN MODE) ASC
您可以在order by
中执行您想要的操作。一种方法是计算匹配的不同单词的数量,然后在每组中按相关性升序排列:
SELECT fb.*,
MATCH (title) AGAINST ('+Foo +Bar' IN BOOLEAN MODE) AS relevance
FROM FOOBAR fb
ORDER BY ((case when title like '%Foo%' then 1 else 0 end) +
(case when title like '%Bar%' then 1 else 0 end)
) desc,
relevance asc
这将为示例数据执行您想要的操作。它通常可能不起作用,因为相关性计算除了单词匹配的次数和字符串的长度之外,还有其他因素。