Tag Archives: 网站优化

摇篮网(yaolan.com)站内搜索优化实践(一)

Yaolan.com现在是国内领先的母婴类网站,我们的使命是面向全球年轻父母,提供从母亲怀孕到孩子六岁期间权威的怀孕生养全方位的专业知识、最新产品服务咨询,为用户提供一流的内容,摇篮网自1998年在硅谷成立以来,一直致力于降低用户获取有价值信息的门槛,而站内搜索,无疑是实现这个目标的最有效的工具。

现有搜索简介 (search.yaolan.com)

摇篮网现有的搜索引擎,是我们基于lucene开源项目,自己研发的,目前支持了yaolan最重要的基础服务搜索,包括bbs,问答产品,空间产品,相册产品,用户,知识类产品的全文检索需求。支持了标签聚合页的信息聚合需求,支持了相关好友推荐的需求,支持了SEO弹层相关内容推荐的需求,支持了文章最终页相关内容的需求。

站内搜索的另外一个功能是站内信息挖掘,用户搜索行为分析,我们通过对用户搜索行为的记录,分析用户查询最多的关键词以及我们的搜索结果输出情况,通过观察跳出率,可以分析用户到底是不满意我们的搜索结果,还是我们根本没有相关的内容给用户。如果是后者,可以作为我们内容团队选题的关键参考因素。如果是前者,那是我们的算法需要优化。

本次优化会涉及到以下方面的问题

  1. 现状分析,Google Analytic,这个大家都知道,网站优化的必备工具。通过Ga了解现状的运营数据。4QSurvey,在线的用户调查工具,经过4Qsurvey,我们用户目前碰到的最大的问题是,很难找到自己需要的内容。这个问题,本身就是个复杂问题,比如是因为搜索结果不够相关?还是yaolan缺乏相关的内容,亦或是用户的使用习惯,选择了错误的关键词。这些都需要细致的饿分析。进而制定下一步的优化策略。同时,我们还详细分析站内搜索的Traffice source,用户从搜索结果点击出去以后的行为情况。
  2. 产品形态优化,这个具体的工作方法,还是要依赖 step 1 的结果。我们会采用A/B测试 ,尝试不同的表现形式,这里会依赖Google的工具Google website optimizer 。工作到这个阶段以后,我会有后续的Blog跟大家share优化实施的结果。
  3. 搜索算法的优化,新的权重模型的需求收集,设计。站内搜索最大的优势,就是他能够跟产品的运营模型深入绑定,比如在社区搜素搜索中,用户会很关注针对网友的搜索,针对精华帖的搜索,针对时间的排序。而在我们的知识类的搜索,能够广泛的匹配相关的问题,对用户也是非常重要的能力。因此针对不同产品的逻辑定制化,是提升站内搜索易用性的重要手段。另外也是我一直想做的,就是调整lucene的针对文章长短的权重设定,默认lucene会对短文章给予高的权重(TF/IDF)统计模型会占优,但是显然这个逻辑有些问题,在这次优化中,我们会尝试解决这个问题。

目前我在yaolan.com 负责了多项产品,我们人力资源暂时有限,因此这项优化,会持续很长的时间,这个项目的最新进展,体会,我会随时跟大家Share.

深入了解Etag

给各位同学,补充下基础知识

本期,我们讲etag  (Entity tags)

 

Etag,也叫做实体标签,是http1.1协议的一部分,顾名思义,就是标识实体的一个字符串,因为是

标识,所以唯一性,也是etag需要解决的问题。这里面所谓的实体(Entity)

包括图片、script脚本,样式表,文档等等。

 

Etag存在的意义,在于提供一种机制,验证浏览器是否在已经cache了服务器端的实体。

 

因此,eTag从本质上说,提供了一种实体验证机制,比last-modified更加灵活。

 

下面的例子,说明了Etag工作的流程

一个GET 

Request Headers

Host 192.168.1.39:81

User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4

Accept image/png,image/*;q=0.8,*/*;q=0.5

Accept-Language zh-cn

Accept-Encoding gzip,deflate

Accept-Charset gb2312,utf-8;q=0.7,*;q=0.7

Keep-Alive 300

Connection keep-alive

Referer http://192.168.1.39:81/frame.php?frameon=yes&referer=http%3A//192.168.1.39%3A81/

If-Modified-Since Wed, 17 Dec 2008 08:12:18 GMT

If-None-Match “125835640”

Cache-Control max-age=0

 


Response Headers

Expires Thu, 22 Jan 2009 07:14:08 GMT

Cache-Control max-age=2592000

Content-Type image/gif

Accept-Ranges bytes

Etag “125835640”

Last-Modified Wed, 17 Dec 2008 08:12:18 GMT

Date Tue, 23 Dec 2008 07:14:08 GMT

Server lighttpd/1.4.20

HTTP/1.1 304 Not Modified   

 

客户端发起Get请求,请求里面包含了

If-Modified-Since    用来标识实体的最后修改时间

If-None-Match 用来向服务器端,传递etag

 

服务器端,拿到etag后,比较一下,资源是否更新,如果

没有更新,那么直接返回304

 

so,一切看起来很完美,etag也是标准协议的一部分。

那么,事情真的这么美好吗?

 

问题出在etag的计算方式上

apache 1,2.x都是通过文件系统的inode-size-timestamp来计算的

iis,通过Filetimestamp:ChangeNumber 来计算的(changeNumber是iis服务器变更配置文件的次数)

 

那么我们现在的网站,都做了Load balance,就是用户请求会在

不同的服务器之间切换,问题出来了,因为计算方式的问题,部署

在不同服务器上面的文件的etag是不一样的,所以,即使客户端缓存了

资源实体,在负载均衡系统切换不同的服务器的时候,也会造成额外的200请求,而非

304请求。


解决方案:

    在apache配置文件里面,增加FileETag none,通过mod_expire来做失效控制

    在IIS下面 参考 http://support.microsoft.com/?id=922733  

 

额外的好处:

    少了Etag,节约了网络带宽,流量,尤其是在采用负载均衡的情况下