MongoDB在电子商务网站(Magento)中实际应用的设想之搜索词热度

        第一个设想先挑个简单的,其实我也是想到哪说哪。Magento的搜索机制,会记录每个被搜索词的搜索次数,某个词每被搜索一次就加一。

        MongoDB在电子商务网站(Magento)中实际应用的设想之搜索词热度_第1张图片

        这个数据记录有几个作用,可以作为网站前台显示“热门搜索词”的数据来源,同时也可以用作数据分析,来为业务的发展做服务。在实际使用中,我发现了几个问题,首先,从技术层面,为了记录搜索次数,用户每一次前台的搜索动作,都会对数据库先进行一次读取搜索词(如果该搜索词已存在的话)的操作,然后通过程序加1在存回数据库来做一次写操作。

if ($query->getId()) {
                    $query->setPopularity($query->getPopularity()+1);
                }

        因为这个记录数据没有事务的要求,甚至可以说不要求数据百分百准确,另外,mysql没有自增操作,在遇到这种需要计数的情况时都是采用限度后写的两步走方式,无形中增加了消耗。所以我的设想就是将这个搜索次数的记录转移到MongoDB中来,一方面减轻mysql的读写压力,另一方面,MongoDB的$inc操作符正是最适合这种计数操作的,只需要直接进行一次写操作就可以了。

db.catalogsearch_query.update( { query_text: "nolita" },
                    { $inc: { popularity: 1 } } )

    Magento使用mysql记录这个数据的另一个问题是,只用一个表来记录,所能记录的永远只有总数,但是对数据分析的人来说,往往想看的是不同时间区间的,举个例子,夏天的时候数据分析想看看最近哪些搜索词比较热门,但由于前一个冬天比较冷,“羽绒服”相关的搜索量特别大,结果夏天去看数据的时候,羽绒服依然排在热门搜索词的前列。解决这个问题的方式可以是按时间区间(也许是每月)来分表存储,如果放在mysql里的话要新建大量的新表,我感觉不如放到MongoDB中用动态创建的多个集合来存储,比如

db.catalogsearch_query201401 
db.catalogsearch_query201402 
db.catalogsearch_query201403 
db.catalogsearch_query201404 
db.catalogsearch_query201405 
db.catalogsearch_query201406

    这样每个集合只记录当月的数据,这样的数据才有实际价值去做数据分析了。

    以上暂时只是设想,因为对MongoDB的掌握还不够深入,分析的不一定合理,记录下来后以后有时间尝试去实现,到时候会再写一篇具体实现过程的文章,然后把实现的源码放到github上去。


你可能感兴趣的:(mongodb,Magento)