SELECT user_id, user_name.fullname, live, likes,
MATCH (fullname, email, live) AGAINST (:search_I IN BOOLEAN MODE) AS relevance
FROM profile LEFT JOIN user_name ON user_id=user_id
WHERE MATCH (fullname, email, live) AGAINST (:search_II IN BOOLEAN MODE)
ORDER BY relevance DESC
bindValue(':search_I', $search...);
bindValue(':search_II', $search...);//PDO can't use same one twice
我的查询使用全文搜索,我需要按最接近的匹配排序。
但是这个查询不起作用,它没有订购任何东西。
我做了测试,搜索123@hotmail.com
我的数据库中的2行,abc @ hotmail.com& 123@hotmail.com
返回2行但未将最接近的匹配放在最上面(123@hotmail.com)
谁知道问题出在哪里?答案 0 :(得分:2)
默认情况下,MySQL全文搜索的最小字长为3(请参阅here)。
因此,'123@hotmail.com'
的示例仅与'hotmail'
匹配,两者相同。
您可以更改默认值(和重建索引)。但是,我建议您使用'abcd@hotmail.com'
进行测试。
编辑:
一个单词的定义隐藏在documentation:
中MySQL FULLTEXT实现关注任何真实单词序列 字符(字母,数字和下划线)作为单词。那个序列 也可以包含撇号(“'”),但不能超过一行。 这意味着aaa'bbb被认为是一个单词,但是aaa''bbb是 算是两个字。撇号在开始或结束时 单词被FULLTEXT解析器剥离; 'aaa'bbb'将被解析为 aaa'bbb会
由于where
子句,您可以看到两个电子邮件地址都匹配。那场比赛必须在'hotmail'
。由于默认的最小字长,'com'
和电子邮件名称会被删除。