ECSHOP模糊分词搜索和商品列表关键字飘红功能

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

时间: 2024-10-08 17:23:01

ECSHOP模糊分词搜索和商品列表关键字飘红功能的相关文章

jQuery制作淘宝商城商品列表多条件查询功能

一.介绍 这几天做网站的时候,突然用到这个功能,找了好久也没有找到.看到"希伟素材网"有这么一个JS,效果很不错,也正是我一直以来想要的结果.附图如下: 二:使用教程      1.HTML代码: <ul class="select"> <li class="select-list"> <dl id="select1"> <dt>上装:</dt> <dd cla

在ECSHOP商品列表页和搜索页面,最后出现空商品的解决办法

有客户购买了我们的ecshop模板后,自己做了大量的修改和改动,后来出现了商品列表页面和搜索页面出现了多一个商品的问题.没有商品数据,但是多显示了一个商品的样式.下面就由我们68ecshop为大家解决一下这个问题吧!解决的方法如下:<!– {if $goods.goods_id} –> <!– {/if} –>代码框起来即可解决.

修改ECSHOP后台的商品列表里显示该商品品牌

如何在在ECSHOP后台的商品列表中也显示商品的品牌”.下面就来最模板讲一下如何来修改.此方法只保证在ECSHOP2.7.2版本下有效,其他版本请参照修改. 第一步:首先我们来打开程序文件: /admin/includes/lib_goods.php 定位到 goods_list  函数部分 找到下面代码(大概在911行左右) $sql = "SELECT goods_id, goods_name, goods_type, goods_sn, shop_price, is_on_sale, is

ecshop实现商品列表页属性筛选区品牌筛选以LOGO形式展示

很多时候ecshop分类页的品牌都是以名称的形式显示的,下面ECSHOP开发中心的技术和大家说说ecshop 如何实现商品列表页属性筛选区品牌筛选以LOGO形式展示 1.修改 category.php 文件,将(大概220行) 找到 1 $sql = "SELECT b.brand_id, b.brand_name, COUNT(*) AS goods_num ". 替换成 1 $sql = "SELECT b.brand_id,b.brand_logo, b.brand_n

ecshop模板将商品列表页属性筛选区的品牌以LOGO形式显示

ecshop模板将商品列表页属性筛选区的品牌以LOGO形式显示 商品列表页属性筛选区品牌以LOGO形式显示1.修改 category.php 文件将(大概215行) $sql = "SELECT b.brand_id, b.brand_name, COUNT(*) AS goods_num ". 修改为 $sql = "SELECT b.brand_id,b.brand_logo, b.brand_name, COUNT(*) AS goods_num ". 把商品

让ECSHOP商品列表页和商品详细页分类树跟首页一样

如何让商品列表页或商品详情页的分类树都跟首页一样,也是显示全部所有的分类呢?修改方法:1.商品列表页修改方法:打开category.php 文件将$smarty->assign('categories',       get_categories_tree($cat_id));修改为$smarty->assign('categories',       get_categories_tree());2.商品详情页修改方法:将$smarty->assign('categories',   

ecshop二次开发 给商品添加自定义字段

说起自定义字段,我想很多的朋友像我一样会想起一些开源的CMS(比如Dedecms.Phpcms.帝国)等,他们是可以在后台直接添加自定义字段的. 抱着这种想法我在Ecshop的后台一顿找,不过肿么都木有找到,木有办法,只能自己动手了. 第一步:进入数据库添加所需要的字段. 对于decimal mysql不了解的请自行百度:点击搜索 第二步:找到goods_info.htm模板文件,添加字段表单. 第三步:找到goods.php添加入库程序. 上面标注红色的框框就是添加和修改入库的地方. 至此自定

商城项目:商品列表ajax加载,ajax加入购物车

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ProductLists.aspx.cs" Inherits="Hidistro.UI.Web.Vshop.ProductLists" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml">

Sphinx + Coreseek 实现中文分词搜索

Sphinx + Coreseek 实现中文分词搜索 Sphinx Coreseek 实现中文分词搜索 全文检索 1 全文检索 vs 数据库 2 中文检索 vs 汉化检索 3 自建全文搜索与使用Google等第三方站点提供的站内全文搜索的差别 Sphinx Coreseek介绍 Coreseek安装使用 1. 全文检索 1.1 全文检索 vs. 数据库 全文检索是数据库的有力补充,全文检索并不能替代数据库在应用系统中的作用.当应用系统的数据以大量的文本信息为主时,採用全文检索技术能够极大的提升应