子查询中的MySQL全文搜索没有返回任何结果

时间:2017-02-12 19:14:22

标签: mysql full-text-search

我正在为我的输入输入设置API,它按名称返回用户并选择了MySQL全文搜索,而不是连接第一个,中间名和姓,这样用户在输入名称时可以更灵活,而不用担心正确的顺序。

E.g。 “Carolina Del”,“Delgado Caro”等都会将用户与first_name =“Carolina”,middle_name =“”,last_name =“Delgado”的user_names表中的相应值进行匹配。

出于某种原因,在user / 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]);
        });
    });
}

2 个答案:

答案 0 :(得分:0)

这是通过将索引存储设置为升序来解决的。

我以前是这样创建索引的:

CREATE FULLTEXT INDEX full_text_index ON `user_names` (`first_name`, `middle_name`, `last_name`)

以下调整后的SQL修复了问题:

CREATE FULLTEXT INDEX full_text_index ON `user_names` (`first_name` ASC, `middle_name` ASC, `last_name` ASC)

这似乎与MySQL的文档背道而驰:

  

index_col_name规范可以以ASC或DESC结尾。这些关键字允许用于将来的扩展,以指定升序或降序索引值存储。目前,他们被解析但被忽略;索引值始终按升序存储。   MySQL 5.7 Docs

但无论如何,对我有用!

答案 1 :(得分:0)

第一个查询没有意义。子查询返回1行 - 一个计数;外部查询应该看到完全要计算的一行。

你从这个提法中得到什么?

SELECT count(*)
    FROM `users` AS u
    JOIN `user_names` AS un  ON un.`user_id` = u.`id`
    WHERE  MATCH(un.first_name, un.middle_name, un.last_name)
           AGAINST ('+carolina' IN BOOLEAN MODE);

将名称放在users表中,而不是单独的表格对我来说更有意义。