基于多对多关系的文本搜索

Text search on many-to-many relationship

我有三个表:carscolourscars_has_colours,其中前两个表是多对多关系。

我想搜索 cars,最好使用 MATCH 和 AGAINST。如果我想搜索cars.name,这很容易实现。

如果可能,我想用 MATCH 和 AGAINST 搜索 colours。这样做的原因是可以将颜色匹配的结果添加到名称匹配的结果等中。

因此,例如,如果我搜索 "blue",我希望看到任何 "Sky Blue" 或 "Navy Blue" 的汽车。

理想情况下,我想使用文本搜索并能够获得某种相关性分数,而不是使用 WHERE/IN,以便在搜索 "blue"、"Sky Blue" 时和 "Navy Blue" 彩色汽车被返回,但名为 "bluebird" 的汽车也会被返回(即使它不一定与 colours 中的 "blue" 有关系)

我已经在子查询上尝试了 GROUP_CONCAT,它给了我一个包含所有颜色的字符串,但是我不能将它用作 MATCH 中的参数(奇怪的是,我得到的错误告诉我我在 AGAINST 中有一个无效参数,即使我只是按照文档放入一个字符串文字)

我希望这是有道理的。

SELECT c.*, cl.colour, 
       (MATCH (cl.colour AGAINST ('blue') + MATCH(c.name) AGAINST ('blue')) AS score
FROM cars AS c
LEFT JOIN cars_has_colours AS cc ON cc.car_id = c.id
LEFT JOIN colours AS cl ON cc.colour_id = cl.id AND MATCH(cl.colour) AGAINST ('blue')
WHERE MATCH (c.name) AGAINST ('blue') OR cl.id IS NOT NULL
ORDER BY score DESC