基于多对多关系的文本搜索
Text search on many-to-many relationship
我有三个表:cars
、colours
和cars_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
我有三个表:cars
、colours
和cars_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