opencart用产品关键字搜索产品时,搜索出的结果有很多不是自己想要的跟搜索词不匹配,另外当搜索词前面或后面有空格时
会将所有产品搜索出来。这个原因是opencart搜索时构造sql语句造成的,估计作者时想展现跟多的跟搜索词相关的内容,但这样往往
对用户不够友好,结果就是搜索不到自己想要的东西。
当搜索词前面后面有空格时会搜索出所有产品,这是因为opencart在搜索的时候会将搜索的词拆分为几个单独的词,比如说用户搜“opencart 模板”这个词时,它会将这个词拆分为“opencart”和“模板”这两个词在产品表中搜索,如果某个产品名中含有其中一个词就会将这个产品给搜索出来。这个也就解释了为什么当搜索词开头或后面有空格时会将所有产品搜索出来了,它会将空格当成一个字符在产品表中搜索,往往产品名字是一串英文单词中间存在空格所以会将所有产品搜索出来。解决出现空格搜索出所有产品只要过滤下搜索词的前后空格就可以了 在
\catalog\controller\product\search.php 这个文件将
$filter_name = $this->request->get['filter_name'];
修改为
$filter_name = trim($this->request->get['filter_name']);
就可以解决搜索词前后出现空格会搜索出所有产品问题。
搜索出的产品和搜索词相关度很低,只要有其中一个搜索的单词出现就会显示出来,当我们搜索”tablets pc”这个词时他的搜索sql语句是这样的
SELECT p.product_id, (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN product_tag pt ON (p.product_id = pt.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND ( LCASE(pd.name) LIKE '%tablets%' OR LCASE(pd.name) LIKE '%pc%' OR LCASE(pt.tag) LIKE'%tablets pc%' AND pt.language_id = '1' OR LCASE(pt.tag) LIKE '%tablets pc%' AND pt.language_id = '1') GROUP BY p.product_id
我们需要的结果的sql语句是这样的
SELECT p.product_id, (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN product_tag pt ON (p.product_id = pt.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND LCASE(pd.name) LIKE '%tablets pc%' AND pt.language_id = '1' OR LCASE(pt.tag) LIKE '%tablets pc%' AND pt.language_id = '1') GROUP BY p.product_id
由于相关代码比较多就不贴出来了,具体的在\catalog\model\catalog\product.php文件的getProducts()函数和getTotalProducts()函数中修改相关sql构造语句即可。