我有一个问题。我做了一个简单的搜索引擎,可以根据品牌和车型进行搜索。由于查询性能和数据库中数据量大的原因,我决定使用全文搜索。还好,但是现在我遇到了问题:
我想找到所有品牌为"奥迪",型号为"Q7"的汽车。现在,我有这个SQL查询,但它不能正常工作,因为单词长度"Q7":
SELECT `a`.`id`, `a`.`title`, `a`.`askprice`, `a`.`description`, `a`.`picture`
FROM (`mm_ads` as a)
WHERE `a`.`category` = '227'
AND `a`.`askprice` >= '0'
AND `a`.`askprice` <= '144000'
AND (MATCH(a.title) AGAINST ('+audi +q7' IN BOOLEAN MODE ))
GROUP BY `a`.`id`
ORDER BY `a`.`id` ASC
LIMIT 30
我没有权限修改MySQL配置文件,将ft_min_word_len
设置为2。现在的值是3。还有别的办法吗?
还有一个问题:
我想要所有的汽车品牌"宝马"和型号"116"。例如,我有一辆名为BMW, 1, 116i
的汽车。我的SQL查询是:
`SELECT `a`.`id`, `a`.`title`, `a`.`askprice`, `a`.`description`, `a`.`picture`
FROM (`mm_ads` as a)
WHERE `a`.`category` = '227'
AND `a`.`askprice` >= '0'
AND `a`.`askprice` <= '144000'
AND (MATCH(a.title) AGAINST ('+bmw +116' IN BOOLEAN MODE))
GROUP BY `a`.`id`
ORDER BY `a`.`id` ASC
LIMIT 30`
搜索返回0行。为什么?所有输入字符串("BMW","116")的最小长度为3。我做错了什么?
问候,马里奥
我在处理match against(关于文本长度)时遇到了类似的问题,我的答案是先筛选字符串,然后在like和match against之间切换较短的单词。这不是我所说的优雅,但这是我所能做的,因为我也没有权限访问配置。
关于第二个问题,你确定默认值不是4吗?我记得我不能搜索"艺术"这个词。三个字母。
除非您可以访问配置文件并可以更改它,否则恐怕没有什么可做的。
修改ft_min_word_len需要重新启动服务器并重新构建全文索引。
试试这个:
查找:"bmw 116i"
(MATCH(a.title) AGAINST ('+bmw +116i "bmw 116i"' IN BOOLEAN MODE))
不是最好的解决方案,但可能有帮助…