转自:http://blog.csdn.net/jrckkyy/article/category/402818

由于百度博客http://hi.baidu.com/jrckkyy发表文章字数有限,以后原创文章全部都先发表到csdn和cu上,再发表到百度博客上,百度博客除了放原创的文章还主要放网上寻找到的优秀文章。

本着黑客精神我将陆续把最近分析注释TSE搜索引擎的心得发布出来,老鸟,大虾,大牛,高手飘过就是了,若愿意浪费指点下小弟的在下不甚感激,有问题的朋友直接留言讨论。由于本人水平有限,分析和翻译难免有错大家见笑了。

上学期拜读了James F.Kurose著的《计算机网络-自顶向下方法与internet特色(第三版阴影)》,觉得写得确实不错(希望没看的朋友一定要买来看看),自己也来搞个高自顶向下的学习方法,先从用户看得到的东西出发分析研究搜索引擎,下面我们就来看看各大搜索引擎搜索界面的代码,你所需要特别注意的是form表单中的action

雅虎http://www.yohoo.com/

<form name=s1 style="margin-bottom:0" action="http://search.yahoo.com/search">

<table cellpadding=0 cellspacing=0 border=0><tr><td>

<input type=text size=30 name=p title="enter search terms here">&nbsp;

<input type=submit value=Search>&nbsp;&nbsp;</td><td><font face=arial size=-2>·&nbsp;

<a href="http://search.yahoo.com/search/options?p=">advanced search</a><br>·&nbsp;

<a href="http://buzz.yahoo.com/">most popular</a></font></td></tr></table></form>

谷歌http://www.g.cn

<form method=GET action=/search><tr><td nowrap>

<font size=-1><input type=text name=q size=41 maxlength=2048 value="jrckkyy" title="Google 搜索"> <input type=submit name=btnG value="Google 搜索"><input type=hidden name=complete value=1><input type=hidden name=hl value="zh-CN"><input type=hidden name=newwindow value=1><input type=hidden name=sa value="2"></font></td></tr></form>

百度http://www.baidu.com

<form name=f2 action="/s">

<tr valign="middle">

<td nowrap>

<input type=hidden name=ct value="0">

<input type=hidden name=ie value="gb2312">

<input type=hidden name=bs value="jrckkyy">

<input type=hidden name=sr>

<input type=hidden name=z value="">

<input type=hidden name=cl value=3>

<input type=hidden name=f value=8>

<input name=wd size="35" class=i value="jrckkyy" maxlength=100>

<input type=submit value=百度一下> <input type=button value=结果中找 onclick="return bq(f2,1,0);">&nbsp;&nbsp;&nbsp;</td>

<td nowrap><a href="http://utility.baidu.com/quality/quality_form.php?word=jrckkyy">与百度对话</a></td>

</tr>

</form>

天网http://www.tianwang.com/

<form name=f action="/cgi-bin/tw" method=get>

                <td valign=center width=634 background=images/index_image_02.gif>

                    <table height=46 cellspacing=0 cellpadding=0 width=600 align=right  border=0>

                        <tbody>

                            <tr> 

                                <td height=50>

                                    <table cellspacing=0 cellpadding=0 width=600 border=0>

                                        <tbody>

                                            <tr>

                                  <td width="524" height="30" valign="bottom">

                                        <div align="center">                                  <input name="word" type="text" size="40" maxlength="255" onClick="this.focus();checkWord(this,1)" onblutesr='checkWord(this,0)' value='请输入资源名称'> 

                                            <font color=#ffffff> &nbsp; 

                                            <select onChange=reRange(this.selectedIndex) name=range>

                                                <script language=javascript>

                           <!--

                           ; i < rescode.length; i++) {

                               ) {

                                   document.write(] + '</option>');

                               } else {

                                   document.write(] + '</option>');

                               }

                           }

                           document.f.range.selectedIndex ;

                           -->

                         </script>

                                            </select>

                                            </font>-<font color=#ffffff> 

                                            <select name=cd>

                                                <script language=javascript>

                           <!--

                           var ind = document.f.range.selectedIndex;

                           ;

                           ;

                           ; i < len; i++) {

                               document.write(] + '</option>');

                               )

                                   sel = i;

                           }

                           document.f.cd.selectedIndex = sel;

                           -->

                 </script>

                                            </select>

                                            </font></div>

                                    </td>

                <td width="71" valign="bottom"><input id=submit2 type=image height=22 width=40 src="images/so2.gif" align=absMiddle name=submit></td>

              </tr>

                                            <tr>

                                                <td colspan=3 height=25 class=style16>

                                                    <div align=center></div>

                                                </td>

                                            </tr>

                                        </tbody>

                                    </table>

                                </td>

                            </tr>

                        </tbody>

                    </table>

                </td>

            </form>

测试服务器TSE:

<form method="get" action="/cgi-bin/index/TSESearch" name="tw">

        <td width="100%" height="25" align="center">                           

        <input type="text" name="word" size="55">

        <input type="submit" value=" 搜索" name="www">

        </td>                           

        <input type="hidden" name="cdtype" value="GB">                         

        </form>    

由以上几个form的属性可以看出全部采用的是get方法,CGI做为处理程序,也就是C/C++,CGI全称是“公共网关界面”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI逐渐被近几年来的PHP,JAVA,ASP,PERL,Python,Ruby等动态语言所取代。但是其在速度和运行效率上的优势是无法取代的。

以下是TSE CGI入口程序注释,其他搜索引擎的入口也应该类似

/**

 * 程序翻译说明

 * @Copyright (c) 2008, 研发部

 * All rights reserved.

 *

 * @filesource  TSESearch.cpp

 * @author  jrckkyy <jrckkyy@163.com>

 *

 * Let's start

 *

 */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <sys/time.h>

#include <unistd.h>



#include <iostream>

#include <fstream>

#include <list>



#include "Comm.h"    //包含2个索引和1个数据文件

#include "Query.h"    //包含数据查询处理头文件

#include "Document.h"    //html文档处理头文件

#include "StrFun.h"        //字符串处理头文件

#include "ChSeg/Dict.h"    //字元字典处理头文件

#include "ChSeg/HzSeg.h"    

#include "DisplayRst.h"    //返回查询结果页面头文件,返回结果分为头部,中部,底部



using namespace std;



/*

 * A inverted file(INF) includes a term-index file & a inverted-lists file.

 * A inverted-lists consists of many bucks(posting lists).

 * The term-index file is stored at vecTerm, and

 * the inverted-lists is sored at mapBuckets.

 */



/**

 * 程序翻译说明

 * 搜索程序入口前台关键字提交到该cgi程序 例如:./cgi-bin/index/TSESearch?word=123&start=1

 * 倒排文件包括一个记录检索词文件和一个倒排列表文件。

 * 倒排列表包含很多标志(提交名单)。

 * 记录检索词文件使用vecTerm来排序,和倒排列表是用mapBuckets来排序。

 *

 * @access  public

 * @param   int char 参数的汉字说明 用于接收前台get传递的参数

 * @return  string 0

 */

int main(int argc, char* argv[])

{

    struct timeval begin_tv, end_tv;

    struct timezone tz;



    CDict iDict;

    map<string, string> dictMap, mapBuckets;

    vector<DocIdx> vecDocIdx;    //Document。h



    CQuery iQuery;

    iQuery.GetInputs();        //具体程序开始执行

    // current query & result page number

    iQuery.SetQuery();

    iQuery.SetStart();



    // begin to search

    //开始具体搜索程序

    gettimeofday(&begin_tv,&tz);    //开始计时获取程序运行时间差



    iQuery.GetInvLists(mapBuckets);        //将所有字符集存入映射变量中    瓶颈所在

    iQuery.GetDocIdx(vecDocIdx);        //将倒排索引存入向量中        瓶颈所在

    

    CHzSeg iHzSeg;        //include ChSeg/HzSeg.h

    iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);    //将get到的查询变量分词分成 "我/        爱/        你们/    的/        格式"

    

    vector<string> vecTerm;

    iQuery.ParseQuery(vecTerm);        //将以"/"划分开的关键字一一顺序放入一个向量容器中

    

    set<string> setRelevantRst; 

    iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst); 

    

    gettimeofday(&end_tv,&tz);

    // search end

    //搜索完毕



    //下面开始显示

    CDisplayRst iDisplayRst; 

    iDisplayRst.ShowTop(); 



     

        ; 



    iDisplayRst.ShowMiddle(iQuery.m_sQuery,used_msec, 

            setRelevantRst.size(), iQuery.m_iStart);



    iDisplayRst.ShowBelow(vecTerm,setRelevantRst,vecDocIdx,iQuery.m_iStart); 



    ;



}

http://jrckkyy.cublog.cn (http://blog.chinaunix.net/u2/83460/)

http://blog.csdn.net/jrckkyy

http://hi.baidu.com/jrckkyy

自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[1]寻找搜索引擎入口的更多相关文章

  1. 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02

    百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...

  2. ceph-csi源码分析(3)-rbd driver-服务入口分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(3)-rbd driver-服务入口分析 当ceph-csi组件启动 ...

  3. 从零学脚手架(八)---webpack-dev-server源码分析

    上一篇中介绍了webpack-dev-server属性配置 这一篇就简单的梳理下webpack-dev-server内部实现. 由于涉及到源码解析,所以会涉及到一些比较难啃的知识,我会尽量进行简单化描 ...

  4. windows本地script脚本恶意代码分析(带注释)

    //经过样本分析和抓取,该恶意程序是款下载者木马. //不懂的可以百度百科. http://baike.baidu.com/link?url=0dNqFM8QIjEQhD71ofElH0wHGktIQ ...

  5. C#分析搜索引擎URL得到搜索关键字,并判断页面停留时间以及来源页面

    前台代码: var start; var end; var state; var lasturl = document.referrer; start = new Date($.ajax({ asyn ...

  6. [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈

    我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点:        1.可以了解Python简单爬取图片的一些思路和方法 ...

  7. google搜索引擎使用方法

    搜索引擎命令大全!这是一个我最喜欢的Google搜索技巧的清单: link:URL = 列出到链接到目标URL的网页清单. related:URL = 列出于目标URL地址有关的网页. site:ht ...

  8. 9个基于Java的搜索引擎框架

    在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友欢心,你也会在百度上寻找正规的整容医疗机构(尽管有很大一部分广 ...

  9. [Search Engine] 搜索引擎分类和基础架构概述

    大家一定不会多搜索引擎感到陌生,搜索引擎是互联网发展的最直接的产物,它可以帮助我们从海量的互联网资料中找到我们查询的内容,也是我们日常学习.工作和娱乐不可或缺的查询工具.之前本人也是经常使用Googl ...

随机推荐

  1. Python——杂记

    python 最近出错总结: 1.而for..in ..中不要用else if  x in y:     print  else:     print2.def fibs(num): ...     ...

  2. oracle环境变量详解

    共享存储文件系统(NFS) 通常情况下,ORACLE_SID这个环境变量全称Oracle System Identifier,,用于在一台服务器上标识不同的实例,默认情况下,实例名就是ORACLE_S ...

  3. OSGiBundle出现 Could not find bundle: org.eclipse.equinox.console的解决方案

    按照网上教程创建OSGI HelloWorld实例配置run configuration时出现Could not find bundle: org.eclipse.equinox.console 和C ...

  4. spark技术总结(1)

    1. 请描述spark RDD原理与特征 RDD为Resilient Distributed Datasets缩写,译文弹性分布式数据集. 他是spark系统中的核心数据模型之一,另外一个是DAG模型 ...

  5. mac上安装完成node,就升级好了npm,之后的设置

    1.打开终端输入: npm config list 找到npmrc globalconfig /usr/local/etc/npmrc 2.打开npmrc sudo vim /usr/local/et ...

  6. CRF条件随机场

    CRF的进化 https://flystarhe.github.io/2016/07/13/hmm-memm-crf/参考: http://blog.echen.me/2012/01/03/intro ...

  7. 洛谷P2661信息传递

    传送门啦 一个人要想知道自己的生日,就意味着信息的传递是成环的,因为每轮信息只能传递一个人,传递的轮数就等于环的大小 环的大小就等于环中的两个点到第三个点的距离之和加一,我们就可以在使用并查集时,维护 ...

  8. Spring框架的基本使用(AOP部分)

    AOP,Aspect Oriented Programming,意为面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP采取横向抽取机制,取代了传统纵向继承体系重复 ...

  9. elasticsearch5.5

    1.不能以root用户运行 groupadd es          #增加es组 useradd es -g es -p pwd          #增加es用户并附加到es组 chown -R e ...

  10. WordPress“无法将上传的文件移动至wp-content/uploads/”的解决办法

    WordPress“无法将上传的文件移动至wp-content/uploads/”的问题在有些配置不完善的虚拟主机或服务器中会碰到,一般会出现以下症状:1.无论是从文章编辑页面还是媒体库页面都无法上传 ...