我今天使用mysqls MATCH()... AGAINST()遇到了问题。
因为我想我可能更容易解决我的问题,所以我创建了一个小SQLFiddle。
我完全理解,为什么“Foo Bar Foo”与“选择”声明的工作方式中的“Foo Bar”更相关。但我想要的是“完全匹配”术语的处理具有更高的相关性,然后是“完全匹配和更多一点”的术语。
title relevance
Foo Bar 0.046829063445329666
Foo Bar Foo 0.031219376251101494
Foo 0
Bar 0
如果不使用“union”组合两个语句,这个结果是否可行?
回答(感谢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
答案 0 :(得分:1)
您可以在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
这可以满足您对示例数据的要求。它可能无法正常工作,因为除了单词匹配的次数和字符串的长度之外,相关性计算还有其他因素。