2
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)

有谁知道问题出在哪里?

4

1 回答 1

2

默认情况下,MySQL 全文搜索的最小字长为 3(参见此处)。

所以,你的例子'123@hotmail.com'只是匹配,'hotmail'两者是等价的。

您可以更改默认值(重建索引)。但是,我建议您'abcd@hotmail.com'改为进行测试。

编辑:

一个词的定义在文档中被隐藏了一点:

MySQL FULLTEXT 实现将任何真正的单词字符(字母、数字和下划线)序列视为一个单词。该序列也可能包含撇号(“'”),但连续不超过一个。这意味着aaa'bbb被视为一个单词,但aaa''bbb被视为两个单词。FULLTEXT 解析器会去除单词开头或结尾的撇号;'aaa'bbb' 将被解析为 aaa'bbb。

由于该where子句,您可以看到两个电子邮件地址都匹配。那场比赛必须开'hotmail'。由于'com'默认的最小字长,电子邮件名称被截断。

于 2013-09-15T14:45:51.017 回答