主流搜索引擎对用户点选命中的处理

来源:互联网 发布:老舍的人品 知乎 编辑:程序博客网 时间:2024/04/20 20:05

主流搜索引擎对用户点选命中的处理

    可能是因为存储成本的降低吧,现代搜引擎对数据的收集都是贪婪的。原来Google在首页上放了一个页面索引数量,记得最高已达到了8个多billion的页面数。另外搜索引擎记录用户搜索的关键字已不是什么秘密,但是大多搜索引擎还记录了用户点选命中。

   
用户点选命中这个概念是包含于搜索引擎命中这个范畴中的。搜索引擎的命中,就是你敲入关键字后,搜索引擎返回的所有结果。搜索引擎有效命中,是指找出与搜索关键字含义相匹配的网页。而用户点击命中,是指用户在搜索命中的结果中,发现了自己需要的结果,然后点击的网页链接。

   
搜索引擎命中、有效命中和用户点选命中之间的关系如下图:
    
   
绿色Matched Pages是理想的和关键字完全相关的页面。金黄色Result Pages就是搜索返回的结果集,它与Matched Pages交集的多少,决定了搜索引擎的质量。蓝色Clicked Pages就是用户点选命中,它是一个很特殊的区域。首先它一定是被限制在金黄色的Result Pages中,然后由于这个点击是每位搜索用户根据网页标题以及摘要判断后进行的,它将最大限度的包含在Matched Pages中,当然少量判断错误的情况也很自然,所以Clicked Pages又不会完全在Matched Pages中。

   
当搜索引擎记录了Click Pages后,它就可以根据这个记录,调整Result Pages集和该集内条目的排序,把总是不被Click的页面逐渐移出该集合,而将更多将可能的Matched Pages命中移入。即图中A-->B的变化过程,当然理想的情况是Result Pages就是Matched Pages啦,并将Clicked多的结果条目尽可能往前排。目前的主流搜索引擎:GoogleBaiduYahoo和微软Live,其中除了baidu外,其它三种引擎都可能收集了Clicked Page,不过他们在实现技术上又有所差别。

    Google
收集方案:简单、优雅
    
    //
最初好像这里是指向的google的页面,然后再重定向到目的页面

   
当然这里的linkGoogle对其进行了处理:<class=l href="http://bi.u-soft.com.cn/Products/ai2005/" target=_blank onmousedown="return clk(0,'','','res','1','')">极光商智2005概览- 宏信极光商智</a>。简单的加上了一个onmousedown事件,clk函数定义如下:

window.clk=function(b,c,d,h,i,j)
{
    
if(document.images)
    
{
        
var a=window.encodeURIComponent?encodeURIComponent:escape,e="",f="",g="";
        
if(b) {e="&url="+a(b.replace(/#.*/,"")).replace(//+/g,"%2B")}
        
if(c) {f="&oi="+a(c)}
        
if(d) {g="&cad="+a(d)}
        (
new Image).src="/url?sa=T"+f+g+"&ct="+a(h)+"&cd="+a(i)+e+"&ei=hhp7RfHwGpnIwQKr-qiTCA"+j
    }
    
return true
}

    // HTML元素中,除了Image可以直接new外,还有Option对象也可以直接new,不过我也不清楚为什么要这么设计

   
代码混淆过,相当不可读,不过这不是我们关心的重点。这里可以看到Google巧妙的使用了Image对象会预先载入图片的技巧,实现了Clicked Page的回报。这里图片的实际地址是:/url?sa=T&ct=res&cd=1&ei=hhp7RfHwGpnIwQKr-qiTCA,其中的ei=hhp7RfHwGpnIwQKr-qiTCA,应该是连接标识。对该图片访问后的返回结果,Google是做了最佳优化处理的,该请求返回的http响应是204,即:

HTTP/1.1 204 No Content
Cache-Control: private
Content-Type: text/html
Server: GWS/2.1
Content-Length: 0
Date: Sat, 09 Dec 2006 20:41:45 GMT

    // 关于http协议204的解释请参看RFC2616

   
微软Live收集方案:简单、臃肿
   

    怎么简单又臃肿呢,这不是自相矛盾吗?简单是说Live也是用Image对象相来报告Chicked Page的,而臃肿是说微软的这个Live的页面。微软也是简单的对link进行了处理:<href="http://yyq123.wordpress.com/2006/04/" gping="/GLinkPing.aspx?/_1_9SE/1? http://yyq123.wordpress.com/2006/04/ &amp; &amp; DI=6244&amp; IG=e982db6143c048488736e2f890c94aa9&amp; POS=1&amp; CM=WPU&amp; CE=1&amp; CS=AWP&amp; SR=1&amp; sample=0">2006 April « 语虚</a>。似乎是只加了一个gping的自定义属性,但接下来的事情就会让你晕倒死。。。

   
完成GLinkPing(名字取得不错,但怎么感觉是尽整没用的呢)功能的脚本代码为:  

GTracking.GLink = function()
{
    
var TIMEOUT = 3 * 1000;
    
var _timer = null;
    
var _img = null;
    
var _bIsIE = false;
    
var _clickedAnchor = null;
    
var _mouseCapturedElement = null;

    bind_method(document.body, "mousedown", onMouseDown, 
false);
    bind_method(document.body, "mouseup", onMouseUp, 
false);
    bind_method(window, "unload", onUnload, 
false);

    
if(document.body.addEventListener)
    
{
        _bIsIE = 
false;
    }
// document.body.attachEvent is added by atlascompat.js and will confuse this code if loaded.
    else //if(document.body.attachEvent)
     {
        _bIsIE = 
true;
    }

    
function onMouseDown(theEvent)
    
{
        
if(_bIsIE)
            _mouseCapturedElement = window.event.srcElement;
        
else
            _mouseCapturedElement = theEvent.target;
    }
    
    
function onMouseUp(theEvent)
    
{
        
var evt;
        
var src;

        
if(_bIsIE)
        
{
            evt = window.event;
            src = evt.srcElement;
        }
        
else
        
{
            evt = theEvent;
            src = evt.target;            
        }

        
if(_mouseCapturedElement != src || evt.button == 2)
        
{
            _mouseCapturedElement = 
null;
            
return;
        }

        src = getPingElement(src);
        
if(src == null)
        
{
            
return;
        }

        
if(AllowParallelNavigation(evt, src))
        
{
            _img = 
new Image();
            _img.src = src.attributes["gping"].value;
            
return true;
        }
        
        _clickedAnchor = src;

        
if(_bIsIE)
        
{
            evt.returnValue = 
false;
        }
        
else
        
{
            evt.preventDefault();    
        }
        doPing(src.attributes["gping"].value);

        
return false;
    }

    
function AllowParallelNavigation(evt, src)
    
{
        
var retVal = false;
        
if(src.attributes["target"] && src.attributes["target"].nodeValue == "_blank")
            retVal = 
true;
        
        
// new window
        if(evt.shiftKey == true)
            retVal = 
true;
        
        
// new tab
        if(evt.ctrlKey == true)
            retVal = 
true;
            
        
//middle mouse button
        if(evt.button == 4)
            retVal = 
true;

        
return retVal;
    }

    
function getPingElement(src)
    
{
        
var retVal = src;
        
var bHasPing = hasPing(src);

        
while( bHasPing == false )
        
{
            src = src.parentNode;
            
if(src == null)
            
{
                retVal = src;
                
break;
            }

            bHasPing = hasPing(src);

            
if(bHasPing)
            
{
                retVal = src;
                
break;
            }
        }
        
return retVal;
    }

    
// FF was not behaving properly in the terse version of this check
    function hasPing(node)
    
{
        
var retVal = false;
        
        
if(node.attributes)
        
{
            
if(node.attributes["gping"])
                retVal = 
true;
        }

        
return retVal;
    }
    
    
    
function doPing(payload)
    
{
        _img = 
new Image();
        
        bind_method(_img, "load", onPingComplete, 
false);
        _img.src = payload;
       _timer = setTimeout(onPingComplete, TIMEOUT);
    }

    
function onPingComplete()
    
{
        _img = 
null;

        resetTimeout();
        doNav();
    }

    
function resetTimeout()
    
{
        
if(_timer)
        
{
            clearTimeout(_timer);
            _timer = 
null;
        }
    }

    
function doNav()
    
{
        
if(_clickedAnchor)
        
{
            
if( _bIsIE )
            
{
                _clickedAnchor.click();
            }
            
else
            
{
                
var clicker = document.createEvent("MouseEvents");
                clicker.initEvent("click", 
truetrue);
                _clickedAnchor.dispatchEvent(clicker);
            }
        }
    }

    
function onUnload()
    
{    
        unbind_method(document.body, "mouseDown", onMouseDown, 
false);
        unbind_method(document.body, "mouseup", onMouseUp, 
false);
        unbind_method(window, "unload", onUnload, 
false);
    }
}

    // 神啊,救救我吧!Google就用了10来行代码,还做了浏览器兼容

   
算了,这事儿就当微软的程序员写代码效率高,一袋烟的功夫就是近200行。LiveImage访问的地址是:/GLinkPing.aspx?/_1_9SE/1?http://yyq123.wordpress.com/2006/04/&& DI=6244& IG=31498446f2a144f6993cd513bf80c39a& POS=1& CM=WPU& CE=1& CS=AWP& SR=1& sample=0,其中那个IG应该是个GUID,由于Live还回传了该被点击页面的URL(http://yyq123.wordpress.com/2006/04/),所以那个IG可能是关键字标识。最后看看这个Image的返回结果,没有想到微软还真的把这个请求当了回事儿,给浏览器返回了一个gif图片@_@

HTTP/1.1 200 OK
Content-Length: 42
Content-Type: image/gif
X-Powered-By: ASP.NET
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND", policyref="http://privacy.msn.com/w3c/p3p.xml"
X-TraceID: 056743472244460c8331da7eeea643bd
Expires: Sat, 09 Dec 2006 21:17:51 GMT
Cache-Control: max-age=0, no-cache, no-store
Pragma: no-cache
Date: Sat, 09 Dec 2006 21:17:51 GMT
Connection: keep-alive

GIF89a

    // 也就42个字节的gif图片,要是一直缓存在内存中可能也没啥吧

    Yahoo
收集方案:火星、低效
    
    //
这样的导航方式,目前只有在广告中使用使用的比较多,能保证对点击计数

   
这种很火星的方式用在这里还很低效,因为每次访问结果连接都需要进行重定向。结果条目连接为:<class=yschttl  href="http://rds.yahoo.com/ _ylt=A0geuphiK3tF4eEAwClXNyoA; _ylu=X3oDMTE2ZHNkdThpBGNvbG 8DZQRsA1dTMQRwb3MDMQRz ZWMDc3IEdnRpZANFMjY2Xzk3/ SIG=12mo7os6g/ EXP=1165786338/** http%3a//www.microsoft.com/china/sql/solutions/bi/solution/usoft.asp">极光商智商务智能解决方案</a>比如当我们点击了第一个条目:http://rds.yahoo.com/ _ylt=A0geuphiK3tF4eEAwClXNyoA; _ylu=X3oDMTE2ZHNkdThpBGNv bG8DZQRsA1dTMQRwb3MDMQRzZW MDc3IEdnRpZANFMjY2Xzk3/ SIG=12mo7os6g/ EXP=1165786338/  **http%3a//www.microsoft.com/china/sql/solutions/bi/solution/usoft.asp后,首先会访问yahoo.comrds子站点,rds应该就是redirect server的缩写。由于使用redirect,用户浏览器就会进行跳转,所以效率很低。而且点击连接后,跳转到实际目的页面的成败和速度,和rds服务器的状态和响应速度关系很大。

   
访问该连接后返回的结果为:

HTTP/1.1 302 Found
Date: Sat, 09 Dec 2006 21:50:48 GMT
Cache-Control: private, max-age=0, no-cache
P3P: policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Location: http://www.microsoft.com/china/sql/solutions/bi/solution/usoft.asp
Connection: close
Content-Type: text/html

The document has moved 
<HREF="http://www.microsoft.com/china/sql/solutions/bi/solution/usoft.asp">here</A>.<P>
<!-- rd6.search.mud.yahoo.com uncompressed Sat Dec  9 13:50:48 PST 2006 -->


   
注意最后两行,是html正文。当用户浏览器不支持Location参数所设置的redirect操作时,浏览器就会显示一个连接,需要用户再次点击才能访问目的页面。所以说Yahoo的这个方法,确实是火星又低效!

    Baidu
收集方案:给钱了吗?
    

    
    Baidu
对用户通过它的结果得到了什么结果是不关心的,其结果条目为:<href="http://bi.u-soft.com.cn/Products/analysis_report/" target="_blank">分析和报表概览 - 宏信极光商智</a>,非常简陋一个link。因为baidu的搜索结果排名是可以用钱来买的,所以baidu也没有必要关心到底用户希望什么结果尽量靠前出现。但是baidu对用户关心的东东也还是有兴趣的。在搜索结果页面中,baidu单独对用户关键字进行了采集,访问的地址是:http://c.baidu.com/c.gif? t=0& q=%22%BC%AB%B9%E2%C9%CC%D6%C7%22& p=0& pn=1。因为baidu需要把搜索频率高的关键字卖给广告用户,所以这个统计是必须要的。而对于有助于提高检索效果的用户Clicked Pages统计,似乎就无关紧要了。

   
另外,其实BaiduYahoo使用的那种火星提交方式还是会的,不过只用在了广告链接上面:
    
    //
3搜索结果中的广告,使用了Yahoo那种Clicked Page提交方式

   
这种广告链接的跳转实现和Yahoo基本一样,只是返回的结果稍有区别。Baidu返回的结果是:

HTTP/1.1 302 Found
Date: Sat, 09 Dec 2006 22:46:31 GMT
Server: apache 1.0.1.0/apache 1.3.34 (Unix)
Set-Cookie: shifen[12759223]=1165704391
Location: http://www.hyperion.com/cn/products_bi.cfm
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

0


   
这样一来,如果你的浏览器不支持Location指定的跳转,你居然连想看个广告都很难。另外虽然你没有看到这个你点击的广告,但是作为按点击付费的冤大头广告主还是需要掏钱的

posted on 2006-12-10 15:19 birdshome 阅读(3951) 评论(19)  编辑 收藏 网摘 所属分类: 其它编程相关内容

 

评论

 

#1    回复  引用    

观察仔细,m$那位写js地估计也看过谷歌的实现,只不过为了显示一下m$js功底和m$的才气所以......,那个周鸿祎的qihoo也很有意思好像放在div里面的。

2006-12-10 16:00 | A.Z[匿名] [未注册用户]

#2    回复  引用  查看    

赞一个,我们就需要这种耐心仔细分析的精神!

2006-12-10 16:05 | Dflying Chen      

#3    回复  引用  查看    

好详细。

2006-12-10 16:22 | Cat Chen      

#4    回复  引用  查看    

有点意思,通过这个简单的对比可以看到还是 Google 的开发人员素质最好。

2006-12-10 17:05 | 木野狐      

#5    回复  引用    

分析得好,收藏!

2006-12-10 17:56 | wb [未注册用户]

#6    回复  引用  查看    

内容不错, 就是广告太多且恶心了点.
看样子即便是纯技术站点也不得不...

2006-12-10 23:09 | Wisdom-zh      

#7    回复  引用  查看    

10.2.5 204 No Content
The server has fulfilled the request but does not need to return an entity-body, and might want to return updated metainformation. The response MAY include new or updated metainformation in the form of entity-headers, which if present SHOULD be associated with the requested variant.

If the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent's active document view, although any new or updated metainformation SHOULD be applied to the document currently in the user agent's active view.

The 204 response MUST NOT include a message-body, and thus is always terminated by the first empty line after the header fields.

2006-12-11 08:39 | Icebird      

#8    回复  引用    

喜欢微软的代码,代码易读清晰

2006-12-11 09:21 | test[匿名] [未注册用户]

#9    回复  引用  查看    

内容不错,版面就差强人意了。
ie
下比较糟,FF下面更糟。

2006-12-11 10:44 | Klesh Wong      

#10    回复  引用    

好像baidu, yahoo都有个类似google那样的脚本方法

2006-12-11 17:40 | xjdawu [未注册用户]

#11    回复  引用    

// HTML元素中,除了Image可以直接new外,还有Option对象也可以直接new,不过我也不清楚为什么要这么设计
anti-ajax

2006-12-14 09:49 | dvaknheo [未注册用户]

#12    回复  引用    

<a href="http://bi.u-soft.com.cn/Products/analysis_report/" target="_blank">分析和报表概览 - 宏信极光商智</a>

//
说不定某个地方有
var anchors=document.getElementsByTagName("a");
for(var anchor in anchors){
anchor.onclick="foo";
}

2006-12-14 09:55 | dvaknheo [未注册用户]

#13    回复  引用    

好!

2006-12-21 14:51 | mian [未注册用户]

#14    回复  引用    

百度有点选命中处理啊。

这个是处理代码:
function c(e,b,u,s,p,t){if(document.images){var p=window.document.location.href;var t=new Date().getTime();b=b.replace(/<[^<>]+>/g, "");(new Image()).src="http://s.baidu.com/w.gif?query=zzzevazzz&e="+e+"&title="+b+"&url="+escape(u)+"&spos="+s+"&path="+p+"&t="+t;}return true;}

下面是搜索得到的一些链接:
<A onclick="return c('a7d2',this.innerHTML,this.href,3)" href="http://www.ph4nt0m.org/bbs/showthread.php?threadid=32878" target=_blank><FONT size=3>Ph4nt0m Security Team BBS - <FONT color=#c60a00>zzzevazzz</FONT>,WinEggDrop
问你们一个简...</FONT></A>
…………
…………
<A onclick="return c('cd7e',this.innerHTML,this.href,4)" href="http://it.enorth.com.cn/system/2006/04/13/001280578.shtml" target=_blank><FONT size=3>
暴强网络黑名单!中国顶级黑客联络图-黑客,红客,骇客,黑名单-北方..</FONT></A>
…………
…………
<A onclick="return c('3c7e',this.innerHTML,this.href,5)" href="http://zzzevazzz.bokee.com/643032.html" target=_blank><FONT size=3>sendmail.vbs--EVA
的回收站</FONT></A>

链接是动态生成的。直接查看源代码看不到。
可以用下面这个办法:
http://zzzevazzz.bokee.com/678817.html

2007-01-18 19:12 | zzzevazzz [未注册用户]

#15 [楼主]   回复  引用  查看    

@zzzevazzz
BMW
啊,我以为baidu加上了对点击的统计,跑上去一看,还是没有啊。

2007-01-18 22:23 | birdshome      

#16    回复  引用    

老大的分析一阵见血,领教了!

2007-01-25 13:32 | 新手机 [未注册用户]

#17    回复  引用    

onclick="return c('a7d2',this.innerHTML,this.href,3)"
百度的

'a7d2'
是随机生成了,每次访问都不一样,不知道用途。

2007-03-30 20:59 | chuanzai [未注册用户]

#18    回复  引用    

microsoft都不混淆的

2007-06-07 20:49 | yumi301 [未注册用户]

#19    回复  引用    

真是个好东东

2007-08-13 17:33 | 同声传译设备租赁 [未注册用户]