ECSHOP模糊分词搜索和商品列表关键字飘红功能
2013-09-05 16:12
465 查看
最近在用ECSHOP做一个商城,发现ECSHOP的模糊搜索要求太高,需要加入and、空格、加号等,客户搜索的时候不可能这样操作。所以想对搜索功能进行改进,可是在网上没有找到这样的插件,有收费的,结果要2000大元。考虑了一下申请经费的麻烦,自己费点儿力气做一个吧。
考虑到工期的问题,采用了织梦的分词算法,搜索效果虽然不是特别理想,但是这么短的时间也只能这样了。
在此分享给没钱又着急的朋友,需要用到的文件在文章末尾提供下载,大家下载后也可以直接覆盖使用。
一、ECSHOP联想下拉框
1、修改page_header.lbi模版文件,将搜索文本框修改为:
嵌入js文件
嵌入css文件
2、根目录添加php文件search_suggest.php文件
二、分词搜索
根目录增加织梦分词算法函数和词库:lib_splitword_full.php和dededic.csv
1、修改search.php文件第196行
改为:
2、修改search.php文件第382行到403行
修改为:
三、搜索出的产品列表产品关键词飘红功能:
1、修改search.php文件第473行到480行
修改为:
2、修改search.dwt模板文件
将显示商品名称的地方替换为:
四、文中所有涉及的修改和要用到的文件,因为没找到上传文件的地方所有放到其他网站了。下载地址:
http://download.csdn.net/detail/sun04zh3/6216851
考虑到工期的问题,采用了织梦的分词算法,搜索效果虽然不是特别理想,但是这么短的时间也只能这样了。
在此分享给没钱又着急的朋友,需要用到的文件在文章末尾提供下载,大家下载后也可以直接覆盖使用。
一、ECSHOP联想下拉框
1、修改page_header.lbi模版文件,将搜索文本框修改为:
<input name="keywords" type="text" id="keyword" value="<!--{if ($search_keywords neq "")}{$search_keywords|escape}--><!--{else}-->ecshop<!--{/if}-->" class="search-input" onfocus="if(this.value=='ecshop'){this.value='';this.style.color='#000';}" onblur="closediv();if(this.value==''){this.value='ecshop';this.style.color='#999';}" style="color:#999;" onkeyup="keyupdeal(event,this.value);" onkeydown="keydowndeal(event);" onclick="keyupdeal(event,this.value);" autocomplete="off" /> <div id="search_suggest" style="display:none;" onmouseover='javascript:_over();' onmouseout='javascript:_out();'></div>
嵌入js文件
<script type="text/javascript" src="/js/suggest.js"></script>
嵌入css文件
<link href="/themes/default/images/css.css" rel="stylesheet" type="text/css">
2、根目录添加php文件search_suggest.php文件
二、分词搜索
根目录增加织梦分词算法函数和词库:lib_splitword_full.php和dededic.csv
1、修改search.php文件第196行
/* 检查关键字中是否有空格,如果存在就是并 */ $arr = explode(' ', $_REQUEST['keywords']); $operator = " AND ";
改为:
/*调用织梦分词功能-start*/ require("lib_splitword_full.php"); $sp = new SplitWord(); $fenci=$sp->SplitRMM($_REQUEST['keywords']); $sp->Clear(); /* 织梦分词后是使用空格进行划分,所以仍可使用ecshop的按照空格拆分为数组功能:检查关键字中是否有空格,如果存在就是并 */ $arr = explode(' ', $fenci); $arr = array_reverse($arr);//将数组倒序排列,并插入完整关键字到数组末尾 $arr[count($arr)]=$_REQUEST['keywords']; $arr = array_reverse($arr);//再次将数组倒序,使完整关键字可以第一个被检索 array_pop($arr);//删除织梦分词产生的数组最后一个元素为空格 $operator = " and ";//sql检索语句使用union联合检索 $piaohong = $arr;//$arr数组在飘红的时候已经被产品列表占用了,所以另外赋值给一个数组备用。 /*调用织梦分词功能-end*/
2、修改search.php文件第382行到403行
/* 获得符合条件的商品总数 */ $sql = "SELECT COUNT(*) FROM " .$ecs->table('goods'). " AS g ". "WHERE g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 $attr_in ". "AND (( 1 " . $categories . $keywords . $brand . $min_price . $max_price . $intro . $outstock ." ) ".$tag_where." )"; $count = $db->getOne($sql); $max_page = ($count> 0) ? ceil($count / $size) : 1; if ($page > $max_page) { $page = $max_page; } /* 查询商品 */ $sql = "SELECT g.goods_id, g.goods_name, g.market_price, g.is_new, g.is_best, g.is_hot, g.shop_price AS org_price, ". "IFNULL(mp.user_price, g.shop_price * '$_SESSION[discount]') AS shop_price, ". "g.promote_price, g.promote_start_date, g.promote_end_date, g.goods_thumb, g.goods_img, g.goods_brief, g.goods_type ". "FROM " .$ecs->table('goods'). " AS g ". "LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp ". "ON mp.goods_id = g.goods_id AND mp.user_rank = '$_SESSION[user_rank]' ". "WHERE g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 $attr_in ". "AND (( 1 " . $categories . $keywords . $brand . $min_price . $max_price . $intro . $outstock . " ) ".$tag_where." ) " . "ORDER BY $sort $order";
修改为:
/*sun04zh3-20130905-调用织梦分词功能-更改ecshop的sql语句采用union方式-start*/ /*因为后面要用union生成数据集表,所以先根据拆分出的关键词,生成union所需的所有sql语句,*/ $select = "("; foreach($arr AS $se => $t) { $select .= "SELECT click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type FROM(select click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type from".$ecs->table('goods')." where goods_name like '%$t%' order by click_count desc) AS P$se";//第一个关键词是完整关键词 if($se==0)//插入一个当所有拆分关键词在商品名称中为and时的sql语句 { $select .= " UNION SELECT click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type FROM(select click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type from".$ecs->table('goods')." where 1 $keywords order by click_count desc) AS Pa"; } if($se<count($arr)-1)//在每条select语句后增加union,最后一个不加,所以$se小于元素数量-1 { $select.=" UNION "; } } $select.=")"; if($select=="()")//当关键词为空时,没有拆分关键词,所以用于union的$select为空,仍需要调用goods表 { $sql = "SELECT COUNT(*) FROM ".$ecs->table("goods")." AS P " . "WHERE is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1 " ; } else { /* 获得符合条件的商品总数 */ $sql = "SELECT COUNT(*) FROM $select AS P " . "WHERE is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1 " ; } $count = $db->getOne($sql); $max_page = ($count> 0) ? ceil($count / $size) : 1; if ($page > $max_page) { $page = $max_page; } if($select=="()")//当关键词为空时,没有拆分关键词,所以用于union的$select为空,仍需要调用goods表 { /* 查询商品 */ $sql = "SELECT click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type ". "FROM ".$ecs->table("goods")." AS P " . "WHERE is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1 " ; } else { /* 查询商品 */ $sql = "SELECT click_count,goods_sn,is_alone_sale,is_on_sale,is_delete,goods_id, goods_name, market_price, is_new, is_best, is_hot, shop_price AS org_price, shop_price ,promote_price, promote_start_date, promote_end_date, goods_thumb, goods_img, goods_brief, goods_type ". "FROM $select AS P " . "WHERE is_delete = 0 AND is_on_sale = 1 AND is_alone_sale = 1 " ; }
三、搜索出的产品列表产品关键词飘红功能:
1、修改search.php文件第473行到480行
if($display == 'grid') { $arr[$row['goods_id']]['goods_name'] = $GLOBALS['_CFG']['goods_name_length'] > 0 ? sub_str($row['goods_name'], $GLOBALS['_CFG']['goods_name_length']) : $row['goods_name']; } else { $arr[$row['goods_id']]['goods_name'] = $row['goods_name']; }
修改为:
/*根据分词对产品名称进行替换-start*/ $tihuan=$row["goods_name"]; foreach($piaohong AS $ph_count => $ph) { $tihuan = str_replace($ph,"<b style='color:#d90000'>$ph</b>",$tihuan); } $arr[$row['goods_id']]['goods_name'] = $row['goods_name'];//因为前台用到没有替换的商品名称,所以保留goods_name值 $arr[$row['goods_id']]['tihuan'] = $tihuan; /*根据分词对产品名称进行替换-end*/
2、修改search.dwt模板文件
将显示商品名称的地方替换为:
<p><a href="{$goods.url}" title="{$goods.name|escape:html}">{$goods.tihuan}</a></p>
四、文中所有涉及的修改和要用到的文件,因为没找到上传文件的地方所有放到其他网站了。下载地址:
http://download.csdn.net/detail/sun04zh3/6216851
相关文章推荐
- ECSHOP模糊分词搜索和商品列表关键字飘红功能
- Qt实现输入框,组合框提示,模糊查询,搜索关键字下拉提示功能
- js、jquery实现列表模糊搜索功能
- ecshop模糊搜索分词插件 dede 开源插件
- asp.net关键字模糊查询(类似于各大网站搜索功能)
- 将excel文件中的商品数据导入到数据库,并实现相关检索以及模糊搜索功能
- ecshop为商品列表添加销量排序功能
- 1.读取excel文件,将输入存储到数据库中(JXL) 2.完成商品的检索相关功能 1.根据分类,显示分类下所有的商品信息,按照库存量从低到高排序(提供补货依据) 2.模糊搜索,根据商品信息(名
- android开发游记:a-z列表快速查找功能和搜索关键字高亮
- android开发游记:a-z列表快速查找功能和搜索关键字高亮
- ios开发:关于在XCODE编辑器里写入某些关键字没有模糊搜索辅助框
- 数据库模糊搜索时,关键字中有%号,怎么办?
- php mysql 模糊搜索 仿美团搜索门店和商品
- SharePoint 2013 搜索功能,列表项目不能完全被索引
- ecshop二次开发:商品分类添加图片显示功能(附下载)
- ecshop 商品列表页面 按销量排行
- 非常不错的 ecshop增加 浏览过该商品的人还浏览了那些商品 功能
- (转)淘淘商城系列——商品搜索功能测试
- 使用 JavaScript 实现简单候选项推荐功能(模糊搜索)【收藏】【转】
- 利用videoView创建播放器,实现展示视频列表和搜索sd卡功能 以及android6.0的动态授权等功能