【发布时间】:2017-02-12 19:14:22
【问题描述】:
我正在为我的 typeahead 输入设置 API,它按姓名返回用户,并选择 MySQL 全文搜索而不是连接名字、中间名和姓氏,这样用户在输入姓名时可以有更大的灵活性,而不必担心正确的顺序。
例如'Carolina Del'、'Delgado Caro' 等都会将用户与 first_name="Carolina"、middle_name=""、last_name="Delgado" 的 user_names 表中的相应值进行匹配。
由于某种原因,在用户/用户名约束之后使用全文搜索时,我得到的结果为零,但在使用 LIKE 时,我确实得到了正确的结果。
以下给出 0 个结果
SELECT count(*) FROM `users`
WHERE (select count(*) from `user_names`
WHERE `user_names`.`user_id` = `users`.`id`
AND MATCH(first_name, middle_name, last_name)
AGAINST ('+carolina' IN BOOLEAN MODE)
) >= 1;
当与 LIKE 一起使用时,我们得到 47 个结果
SELECT count(*) FROM `users`
WHERE (select count(*) FROM `user_names`
WHERE `user_names`.`user_id` = `users`.`id`
AND `first_name` LIKE "%carolina%")
>= 1;
为了显示全文索引工作正常,这里是一个直接在用户名表上的查询,它也给出了 47 个结果
SELECT count(*) FROM `user_names`
WHERE MATCH(first_name, middle_name, last_name)
AGAINST ('+carolina' IN BOOLEAN MODE);
对于它的价值,我在 Laravel 查询构建器范围内使用它,但由于它产生的 SQL(以上)不起作用,我需要首先了解原因。
public function scopeForContactName($query, $name)
{
return $query->whereHas('contact.name', function ($query) use ($name) {
$query->where(function ($q) use ($name) {
$q->whereRaw("MATCH(first_name, middle_name, last_name) AGAINST (? IN BOOLEAN MODE)", [$name]);
});
});
}
【问题讨论】: