﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-学着站在巨人的肩膀上-随笔分类-中文文本信息处理</title><link>http://www.cppblog.com/jrckkyy/category/12532.html</link><description>金融数学,InformationSearch,Compiler,OS,</description><language>zh-cn</language><lastBuildDate>Thu, 10 Dec 2009 15:07:47 GMT</lastBuildDate><pubDate>Thu, 10 Dec 2009 15:07:47 GMT</pubDate><ttl>60</ttl><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[6]倒排索引的建立的程序分析(4)</title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102949.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 15:03:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102949.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102949.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102949.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102949.html</trackback:ping><description><![CDATA[<p>以下是根据正向索引建立倒排索引的注释</p>
<p>&nbsp;</p>
<p>int main(int argc, char* argv[])&nbsp;&nbsp;&nbsp; //./CrtInvertedIdx moon.fidx.sort &gt; sun.iidx <br>{ <br>&nbsp;&nbsp;&nbsp; ifstream ifsImgInfo(argv[1]); <br>&nbsp;&nbsp;&nbsp; if (!ifsImgInfo)&nbsp; <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "Cannot open " &lt;&lt; argv[1] &lt;&lt; " for input\n"; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1; <br>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; string strLine,strDocNum,tmp1=""; <br>&nbsp;&nbsp;&nbsp; int cnt = 0; <br>&nbsp;&nbsp;&nbsp; while (getline(ifsImgInfo, strLine))&nbsp; <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string::size_type idx; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string tmp; </p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idx = strLine.find("\t"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = strLine.substr(0,idx); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tmp.size()&lt;2 || tmp.size() &gt; 8) continue; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tmp1.empty()) tmp1=tmp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tmp == tmp1)&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strDocNum = strDocNum + " " + strLine.substr(idx+1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( strDocNum.empty() ) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strDocNum = strDocNum + " " + strLine.substr(idx+1); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; tmp1 &lt;&lt; "\t" &lt;&lt; strDocNum &lt;&lt; endl; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp1 = tmp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strDocNum.clear(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strDocNum = strDocNum + " " + strLine.substr(idx+1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cnt++; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //if (cnt==100) break; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; tmp1 &lt;&lt; "\t" &lt;&lt; strDocNum &lt;&lt; endl;&nbsp; //倒排索引中每个字典单词后的文档编号以table键为间隔 </p>
<p>&nbsp;&nbsp;&nbsp; return 0; <br>} </p>
<p>&nbsp;</p>
<p><a href="http://blog.csdn.net/jrckkyy/archive/2008/10/16/3086417.aspx"></a>&nbsp;</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 23:03 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[6]倒排索引的建立的程序分析(2)</title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102947.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 15:02:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102947.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102947.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102947.html</trackback:ping><description><![CDATA[<p>前面的DocIndex程序输入一个Tianwang.raw.*****文件，会产生一下三个文件 Doc.idx, Url.idx, DocId2Url.idx，我们这里对DocSegment程序进行分析。</p>
<p>这里输入 Tianwang.raw.*****，Doc.idx，Url.idx.sort_uniq等三个文件，输出一个Tianwang.raw.***.seg 分词完毕的文件</p>
<p>int main(int argc, char* argv[]) <br>{ <br>&nbsp;&nbsp;&nbsp; string strLine, strFileName=argv[1]; <br>&nbsp;&nbsp;&nbsp; CUrl iUrl; <br>&nbsp;&nbsp;&nbsp; vector&lt;CUrl&gt; vecCUrl; <br>&nbsp;&nbsp;&nbsp; CDocument iDocument; <br>&nbsp;&nbsp;&nbsp; vector&lt;CDocument&gt; vecCDocument; <br>&nbsp;&nbsp;&nbsp; unsigned int docId = 0; </p>
<p>&nbsp;&nbsp;&nbsp; //ifstream ifs("Tianwang.raw.2559638448"); <br>&nbsp;&nbsp;&nbsp; ifstream ifs(strFileName.c_str());&nbsp; //DocSegment Tianwang.raw.**** <br>&nbsp;&nbsp;&nbsp; if (!ifs)&nbsp; <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "Cannot open tianwang.img.info for input\n"; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1; <br>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; ifstream ifsUrl("Url.idx.sort_uniq");&nbsp;&nbsp; //排序并消重后的url字典 <br>&nbsp;&nbsp;&nbsp; if (!ifsUrl)&nbsp; <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "Cannot open Url.idx.sort_uniq for input\n"; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; ifstream ifsDoc("Doc.idx"); //字典文件 <br>&nbsp;&nbsp;&nbsp; if (!ifsDoc)&nbsp; <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "Cannot open Doc.idx for input\n"; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1; <br>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; while (getline(ifsUrl,strLine)) //偏离url字典存入一个向量内存中 <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char chksum[33]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp; docid; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(chksum, 0, 33); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sscanf( strLine.c_str(), "%s%d", chksum, &amp;docid ); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iUrl.m_sChecksum = chksum; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iUrl.m_nDocId = docid; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vecCUrl.push_back(iUrl); <br>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; while (getline(ifsDoc,strLine))&nbsp;&nbsp;&nbsp;&nbsp; //偏离字典文件将其放入一个向量内存中 <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int docid,pos,length; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char chksum[33]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(chksum, 0, 33); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sscanf( strLine.c_str(), "%d%d%d%s", &amp;docid, &amp;pos, &amp;length,chksum ); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iDocument.m_nDocId = docid; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iDocument.m_nPos = pos; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iDocument.m_nLength = length; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iDocument.m_sChecksum = chksum; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vecCDocument.push_back(iDocument); <br>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; strFileName += ".seg"; <br>&nbsp;&nbsp;&nbsp; ofstream fout(strFileName.c_str(), ios::in|ios::out|ios::trunc|ios::binary);&nbsp;&nbsp;&nbsp; //设置完成分词后的数据输出文件 <br>&nbsp;&nbsp;&nbsp; for ( docId=0; docId&lt;MAX_DOC_ID; docId++ ) <br>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // find document according to docId <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length = vecCDocument[docId+1].m_nPos - vecCDocument[docId].m_nPos -1; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *pContent = new char[length+1]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(pContent, 0, length+1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifs.seekg(vecCDocument[docId].m_nPos); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifs.read(pContent, length); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *s; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = pContent; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // skip Head <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bytesRead = 0,newlines = 0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (newlines != 2 &amp;&amp; bytesRead != HEADER_BUF_SIZE-1)&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*s == '\n') <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newlines++; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newlines = 0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s++; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytesRead++; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bytesRead == HEADER_BUF_SIZE-1) continue; </p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // skip header <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytesRead = 0,newlines = 0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (newlines != 2 &amp;&amp; bytesRead != HEADER_BUF_SIZE-1)&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*s == '\n') <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newlines++; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newlines = 0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s++; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytesRead++; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bytesRead == HEADER_BUF_SIZE-1) continue; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //iDocument.m_sBody = s; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iDocument.RemoveTags(s);&nbsp;&nbsp;&nbsp; //去除&lt;&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iDocument.m_sBodyNoTags = s; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete[] pContent; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strLine = iDocument.m_sBodyNoTags; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CStrFun::ReplaceStr(strLine, " ", " "); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CStrFun::EmptyStr(strLine); // set " \t\r\n" to " " </p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // segment the document 具体分词处理 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHzSeg iHzSeg; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strLine = iHzSeg.SegmentSentenceMM(iDict,strLine); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fout &lt;&lt; docId &lt;&lt; endl &lt;&lt; strLine; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fout &lt;&lt; endl; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; return(0); <br>}<br>这里只是浮光掠影式的过一遍大概的代码，后面我会有专题详细讲解 parse html 和 segment docment 等技术</p>
<p>&nbsp;</p>
<p><a href="http://blog.csdn.net/jrckkyy/archive/2008/10/16/3086048.aspx"></a>&nbsp;</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 23:02 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[6]倒排索引的建立的程序分析(3) </title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102948.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 15:02:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102948.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102948.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102948.html</trackback:ping><description><![CDATA[<p>这里介绍正向索引的建立，如果直接建立倒排索引效率上可能会很低，所以可以先产生正向索引为后面的倒排索引打下基础。</p>
<p>&nbsp;</p>
<p>详细的文件功能和介绍都在这里有了介绍自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[5]倒排索引的建立及文件介绍</p>
<p>&nbsp;</p>
<p>CrtForwardIdx.cpp文件</p>
<p>&nbsp;</p>
<p>int main(int argc, char* argv[])&nbsp;&nbsp;&nbsp; //./CrtForwardIdx Tianwang.raw.***.seg &gt; moon.fidx <br>{ <br>&nbsp;&nbsp;&nbsp; ifstream ifsImgInfo(argv[1]); <br>&nbsp;&nbsp;&nbsp; if (!ifsImgInfo)&nbsp; <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "Cannot open " &lt;&lt; argv[1] &lt;&lt; " for input\n"; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1; <br>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; string strLine,strDocNum; <br>&nbsp;&nbsp;&nbsp; int cnt = 0; <br>&nbsp;&nbsp;&nbsp; while (getline(ifsImgInfo, strLine))&nbsp; <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string::size_type idx; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cnt++; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cnt%2 == 1) //奇数行为文档编号 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strDocNum = strLine.substr(0,strLine.size()); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strLine[0]=='\0' || strLine[0]=='#' || strLine[0]=='\n') <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (idx = strLine.find(SEPARATOR)) != string::npos ) //指定查找分界符 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string tmp1 = strLine.substr(0,idx); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; tmp1 &lt;&lt; "\t" &lt;&lt; strDocNum &lt;&lt; endl; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strLine = strLine.substr(idx + SEPARATOR.size()); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //if (cnt==100) break; <br>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; return 0; <br>} </p>
<p>&nbsp;</p>
<p>author:http://hi.baidu.com/jrckkyy</p>
<p>author:http://blog.csdn.net/jrckkyy</p>
<p>&nbsp;</p>
<p><a href="http://blog.csdn.net/jrckkyy/archive/2008/10/16/3086187.aspx"></a>&nbsp;</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 23:02 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[6]倒排索引的建立的程序分析(1)</title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102945.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 15:00:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102945.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102945.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102945.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102945.html</trackback:ping><description><![CDATA[<p>author:http://hi.baidu.com/jrckkyy</p>
<p>author:http://blog.csdn.net/jrckkyy</p>
<p>上一篇主要介绍了倒排索引建立相关的文件及中间文件。<br>TSE建立索引在运行程序上的大致步骤可以简化分为以下几步：</p>
<p>1、运行命令#./DocIndex<br>会用到一个文件 tianwang.raw.520&nbsp;&nbsp;&nbsp; //爬取回来的原始文件，包含多个网页的所有信息，所以很大，这也是一个有待解决的问题，到底存成大文件（如果过大会超过2G或4G的限制，而且文件过大索引效率过低）还是小文件（文件数过多用于打开关闭文件句柄的消耗过大）还有待思考，还就是存储方案的解决最终肯定是要存为分布式的，最终总文件量肯定是会上TB的，TSE只支持小型的搜索引擎需求。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>会产生一下三个文件 Doc.idx, Url.idx, DocId2Url.idx&nbsp;&nbsp;&nbsp; //Data文件夹中的Doc.idx DocId2Url.idx和Doc.idx</p>
<p>2、运行命令#sort Url.idx|uniq &gt; Url.idx.sort_uniq&nbsp;&nbsp;&nbsp; //Data文件夹中的Url.idx.sort_uniq<br>会用到一个文件 Url.idx文件 //md5 hash 之后的url完整地址和document id值对<br>会产生一个文件 Url.idx.sort_uniq //URL消重，md5 hash排序，提高检索效率</p>
<p>3、运行命令#./DocSegment Tianwang.raw.2559638448&nbsp; <br>会用到一个文件 Tianwang.raw.2559638448&nbsp; //Tianwang.raw.2559638448为爬回来的文件 ，每个页面包含http头，分词为后面建立到排索引做准备<br>会产生一个文件 Tianwang.raw.2559638448.seg //分词文件，由一行document id号和一行文档分词组（只对每个文档&lt;html&gt;&lt;/html&gt;中&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;等文字标记中的文本进行分组）构成</p>
<p>4、运行命令#./CrtForwardIdx Tianwang.raw.2559638448.seg &gt; moon.fidx //建立独立的正向索引</p>
<p>5、运行命令<br>#set | grep "LANG"<br>#LANG=en; export LANG;<br>#sort moon.fidx &gt; moon.fidx.sort</p>
<p>6、运行命令#./CrtInvertedIdx moon.fidx.sort &gt; sun.iidx //建立倒排索引</p>
<p>我们先从建立索引的第一个程序DocIndex.cpp开始分析。(注释约定：Tianwang.raw.2559638448是抓回来合并成的大文件，后面就叫大文件，里面包含了很多篇html文档，里面的文档有规律的分隔就叫做一篇一篇的文档)</p>
<p><br>//DocIndex.h start-------------------------------------------------------------</p>
<p>&nbsp;</p>
<p><br>#ifndef _COMM_H_040708_<br>#define _COMM_H_040708_</p>
<p>#include</p>
<p>#include <br>#include <br>#include <br>#include <br>#include <br>#include <br>#include </p>
<p><br>using namespace std;</p>
<p>const unsigned HEADER_BUF_SIZE = 1024;<br>const unsigned RstPerPage = 20;&nbsp;//前台搜索结果数据集返回条数</p>
<p>//iceway<br>//const unsigned MAX_DOC_IDX_ID = 21312;&nbsp;&nbsp;//DocSegment.cpp中要用到<br>const unsigned MAX_DOC_IDX_ID = 22104;</p>
<p><br>//const string IMG_INFO_NAME("./Data/s1.1");<br>const string INF_INFO_NAME("./Data/sun.iidx");&nbsp;//倒排索引文件<br>//朱德&nbsp; 14383 16151 16151 16151 1683 207 6302 7889 8218 8218 8637<br>//朱古力&nbsp; 1085 1222</p>
<p>//9万多条 字元文件 包括特殊符号，标点，汉字<br>const string DOC_IDX_NAME("./Data/Doc.idx");&nbsp;//倒排索引文件<br>const string RAWPAGE_FILE_NAME("./Data/Tianwang.swu.iceway.1.0");</p>
<p>//iceway<br>const string DOC_FILE_NAME = "Tianwang.swu.iceway.1.0";&nbsp;&nbsp;//Docindex.cpp中要用到<br>const string Data_DOC_FILE_NAME = "./Data/Tianwang.swu.iceway.1.0";&nbsp;&nbsp;//Snapshot.cpp中要用到</p>
<p><br>//const string RM_THUMBNAIL_FILES("rm -f ~/public_html/ImgSE/timg/*");</p>
<p>//const string THUMBNAIL_DIR("/ImgSE/timg/");</p>
<p><br>#endif _COMM_H_040708_<br>//DocIndex.h end--------------------------------------------------------------//DocIndex.cpp start-----------------------------------------------------------</p>
<p>#include <br>#include <br>#include "Md5.h"<br>#include "Url.h"<br>#include "Document.h"</p>
<p>//iceway(mnsc)<br>#include "Comm.h"<br>#include </p>
<p>using namespace std;</p>
<p>int main(int argc, char* argv[])<br>{<br>&nbsp;&nbsp;&nbsp; //ifstream ifs("Tianwang.raw.2559638448");<br>&nbsp;//ifstream ifs("Tianwang.raw.3023555472");<br>&nbsp;//iceway(mnsc)<br>&nbsp;ifstream ifs(DOC_FILE_NAME.c_str());&nbsp;//打开Tianwang.raw.3023555472文件，最原始的文件<br>&nbsp;if (!ifs) <br>&nbsp;{<br>&nbsp;&nbsp;&nbsp; &nbsp;cerr &lt;&lt; "Cannot open " &lt;&lt; "tianwang.img.info" &lt;&lt; " for input\n";<br>&nbsp;&nbsp;&nbsp; &nbsp;return -1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;ofstream ofsUrl("Url.idx", ios::in|ios::out|ios::trunc|ios::binary);&nbsp;//建立并打开Url.idx文件<br>&nbsp;if( !ofsUrl )<br>&nbsp;{<br>&nbsp;&nbsp;cout &lt;&lt; "error open file " &lt;&lt; endl;<br>&nbsp;} </p>
<p>&nbsp;ofstream ofsDoc("Doc.idx", ios::in|ios::out|ios::trunc|ios::binary);&nbsp;//建立并打开Doc.idx文件<br>&nbsp;if( !ofsDoc )<br>&nbsp;{<br>&nbsp;&nbsp;cout &lt;&lt; "error open file " &lt;&lt; endl;<br>&nbsp;} </p>
<p>&nbsp;ofstream ofsDocId2Url("DocId2Url.idx", ios::in|ios::out|ios::trunc|ios::binary);&nbsp;//建立并打开DocId2Url.idx文件<br>&nbsp;if( !ofsDocId2Url )<br>&nbsp;{<br>&nbsp;&nbsp;cout &lt;&lt; "error open file " &lt;&lt; endl;<br>&nbsp;} </p>
<p>&nbsp;int cnt=0;&nbsp;//文档编号从0开始计算<br>&nbsp;string strLine,strPage;<br>&nbsp;CUrl iUrl;<br>&nbsp;CDocument iDocument;<br>&nbsp;CMD5 iMD5;<br>&nbsp;<br>&nbsp;int nOffset = ifs.tellg();<br>&nbsp;while (getline(ifs, strLine)) <br>&nbsp;{<br>&nbsp;&nbsp;if (strLine[0]=='\0' || strLine[0]=='#' || strLine[0]=='\n')<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;nOffset = ifs.tellg();<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;if (!strncmp(strLine.c_str(), "version: 1.0", 12))&nbsp;//判断第一行是否是version: 1.0如果是就解析下去<br>&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;if(!getline(ifs, strLine)) break;<br>&nbsp;&nbsp;&nbsp;if (!strncmp(strLine.c_str(), "url: ", 4))&nbsp;//判断第二行是否是url: 如果是则解析下去<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;iUrl.m_sUrl = strLine.substr(5);&nbsp;//截取url: 五个字符之后的url内容<br>&nbsp;&nbsp;&nbsp;&nbsp;iMD5.GenerateMD5( (unsigned char*)iUrl.m_sUrl.c_str(), iUrl.m_sUrl.size() );&nbsp;//对url用md5 hash处理<br>&nbsp;&nbsp;&nbsp;&nbsp;iUrl.m_sChecksum = iMD5.ToString();&nbsp;//将字符数组组合成字符串这个函数在Md5.h中实现</p>
<p>&nbsp;&nbsp;&nbsp;} else <br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;while (getline(ifs, strLine)) <br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if (!strncmp(strLine.c_str(), "length: ", 8))&nbsp;//一直读下去直到判断澹澹(相对第五行)惺欠袷莑ength: 是则接下下去<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sscanf(strLine.substr(8).c_str(), "%d", &amp;(iDocument.m_nLength));&nbsp;//将该块所代表网页的实际网页内容长度放入iDocument数据结构中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;getline(ifs, strLine);&nbsp;//跳过相对第六行故意留的一个空行</p>
<p>&nbsp;&nbsp;&nbsp;iDocument.m_nDocId = cnt;&nbsp;//将文档编号赋值到iDocument数据结构中<br>&nbsp;&nbsp;&nbsp;iDocument.m_nPos = nOffset;&nbsp;//文档结尾在大文件中的结束行号<br>&nbsp;&nbsp;&nbsp;char *pContent = new char[iDocument.m_nLength+1];&nbsp;//新建该文档长度的字符串指针</p>
<p>&nbsp;&nbsp;&nbsp;memset(pContent, 0, iDocument.m_nLength+1);&nbsp;//每一位初始化为0<br>&nbsp;&nbsp;&nbsp;ifs.read(pContent, iDocument.m_nLength);&nbsp;//根据获得的文档长度读取澹(其中包含协议头)读取文档内容<br>&nbsp;&nbsp;&nbsp;iMD5.GenerateMD5( (unsigned char*)pContent, iDocument.m_nLength );<br>&nbsp;&nbsp;&nbsp;iDocument.m_sChecksum = iMD5.ToString();&nbsp;//将字符数组组合成字符串这个函数在Md5.h中实现<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;delete[] pContent;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;ofsUrl &lt;&lt; iUrl.m_sChecksum ;&nbsp;//将md5hash后的url写入Url.idx文件<br>&nbsp;&nbsp;&nbsp;ofsUrl &lt;&lt; "\t" &lt;&lt; iDocument.m_nDocId &lt;&lt; endl;&nbsp;//在一行中一个tab距离分隔，将文件编号写入Url.idx文件</p>
<p>&nbsp;&nbsp;&nbsp;ofsDoc &lt;&lt; iDocument.m_nDocId ;&nbsp;//将文件编号写入Doc.idx文件<br>&nbsp;&nbsp;&nbsp;ofsDoc &lt;&lt; "\t" &lt;&lt; iDocument.m_nPos ;&nbsp;//在一行中一个tab距离分隔，将该文档结束行号澹(同样也是下一文档开始行号)写入Doc.idx文件<br>&nbsp;&nbsp;&nbsp;//ofsDoc &lt;&lt; "\t" &lt;&lt; iDocument.m_nLength ;<br>&nbsp;&nbsp;&nbsp;ofsDoc &lt;&lt; "\t" &lt;&lt; iDocument.m_sChecksum &lt;&lt; endl;&nbsp;//在一行中一个tab距离分隔，将md5hash后的url写入Doc.idx文件</p>
<p>&nbsp;&nbsp;&nbsp;ofsDocId2Url &lt;&lt; iDocument.m_nDocId ;&nbsp;//将文件编号写入DocId2Url.idx文件<br>&nbsp;&nbsp;&nbsp;ofsDocId2Url &lt;&lt; "\t" &lt;&lt; iUrl.m_sUrl &lt;&lt; endl;&nbsp;//将该文档的完整url写入DocId2Url.idx文件</p>
<p>&nbsp;&nbsp;&nbsp;cnt++;&nbsp;//文档编号加一说明该以文档分析完毕，生成下一文档的编号<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;nOffset = ifs.tellg();</p>
<p>&nbsp;}</p>
<p>&nbsp;//最后一行只有文档号和上一篇文档结束号<br>&nbsp;ofsDoc &lt;&lt; cnt ; <br>&nbsp;ofsDoc &lt;&lt; "\t" &lt;&lt; nOffset &lt;&lt; endl;</p>
<p><br>&nbsp;return(0);<br>}</p>
<p>//DocIndex.cpp end-----------------------------------------------------------author:http://hi.baidu.com/jrckkyy </p>
<p>author:http://blog.csdn.net/jrckkyy </p>
<p>&nbsp;</p>
<p><a href="http://blog.csdn.net/jrckkyy/archive/2008/07/30/2739710.aspx"></a>&nbsp;</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 23:00 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[5]倒排索引的建立及文件介绍</title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102943.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 14:55:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102943.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102943.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102943.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102943.html</trackback:ping><description><![CDATA[<p>不好意思让大家久等了，前一阵一直在忙考试，终于结束了。呵呵！废话不多说了下面我们开始吧！</p>
<p>TSE用的是将抓取回来的网页文档全部装入一个大文档，让后对这一个大文档内的数据整体统一的建索引，其中包含了几个步骤。</p>
<p>view plaincopy to clipboardprint?<br>1.&nbsp; The document index (Doc.idx) keeps information about each document.&nbsp;&nbsp; <br>&nbsp; <br>It is a fixed width ISAM (Index sequential access mode) index, orderd by docID.&nbsp;&nbsp; <br>&nbsp; <br>The information stored in each entry includes a pointer into the repository,&nbsp;&nbsp; <br>&nbsp; <br>a document length, a document checksum.&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//Doc.idx&nbsp; 文档编号 文档长度&nbsp;&nbsp;&nbsp; checksum hash码&nbsp;&nbsp; <br>&nbsp; <br>0&nbsp;&nbsp; 0&nbsp;&nbsp; bc9ce846d7987c4534f53d423380ba70&nbsp;&nbsp; <br>&nbsp; <br>1&nbsp;&nbsp; 76760&nbsp;&nbsp; 4f47a3cad91f7d35f4bb6b2a638420e5&nbsp;&nbsp; <br>&nbsp; <br>2&nbsp;&nbsp; 141624&nbsp; d019433008538f65329ae8e39b86026c&nbsp;&nbsp; <br>&nbsp; <br>3&nbsp;&nbsp; 142350&nbsp; 5705b8f58110f9ad61b1321c52605795&nbsp;&nbsp; <br>&nbsp; <br>//Doc.idx&nbsp;&nbsp; end&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; The url index (url.idx) is used to convert URLs into docIDs.&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//url.idx&nbsp;&nbsp; <br>&nbsp; <br>5c36868a9c5117eadbda747cbdb0725f&nbsp;&nbsp;&nbsp; 0&nbsp; <br>&nbsp; <br>3272e136dd90263ee306a835c6c70d77&nbsp;&nbsp;&nbsp; 1&nbsp; <br>&nbsp; <br>6b8601bb3bb9ab80f868d549b5c5a5f3&nbsp;&nbsp;&nbsp; 2&nbsp; <br>&nbsp; <br>3f9eba99fa788954b5ff7f35a5db6e1f&nbsp;&nbsp;&nbsp; 3&nbsp; <br>&nbsp; <br>//url.idx&nbsp;&nbsp; end&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>It is a list of URL checksums with their corresponding docIDs and is sorted by&nbsp;&nbsp; <br>&nbsp; <br>checksum. In order to find the docID of a particular URL, the URL's checksum&nbsp;&nbsp; <br>&nbsp; <br>is computed and a binary search is performed on the checksums file to find its&nbsp;&nbsp; <br>&nbsp; <br>docID.&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ./DocIndex&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; got Doc.idx, Url.idx, DocId2Url.idx //Data文件夹中的Doc.idx DocId2Url.idx和Doc.idx中&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//DocId2Url.idx&nbsp;&nbsp; <br>&nbsp; <br>0&nbsp;&nbsp; <a href="http://*.*.edu.cn/index.aspx">http://*.*.edu.cn/index.aspx</a>&nbsp;&nbsp; <br>&nbsp; <br>1&nbsp;&nbsp; <a href="http://*.*.edu.cn/showcontent1.jsp?NewsID=118">http://*.*.edu.cn/showcontent1.jsp?NewsID=118</a>&nbsp;&nbsp; <br>&nbsp; <br>2&nbsp;&nbsp; <a href="http://*.*.edu.cn/0102.html">http://*.*.edu.cn/0102.html</a>&nbsp;&nbsp; <br>&nbsp; <br>3&nbsp;&nbsp; <a href="http://*.*.edu.cn/0103.html">http://*.*.edu.cn/0103.html</a>&nbsp;&nbsp; <br>&nbsp; <br>//DocId2Url.idx end&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>2.&nbsp; sort Url.idx|uniq &gt; Url.idx.sort_uniq&nbsp;&nbsp;&nbsp; //Data文件夹中的Url.idx.sort_uniq&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//Url.idx.sort_uniq&nbsp;&nbsp; <br>&nbsp; <br>//对hash值进行排序&nbsp;&nbsp; <br>&nbsp; <br>000bfdfd8b2dedd926b58ba00d40986b&nbsp;&nbsp;&nbsp; 1111&nbsp; <br>&nbsp; <br>000c7e34b653b5135a2361c6818e48dc&nbsp;&nbsp;&nbsp; 1831&nbsp; <br>&nbsp; <br>0019d12f438eec910a06a606f570fde8&nbsp;&nbsp;&nbsp; 366&nbsp; <br>&nbsp; <br>0033f7c005ec776f67f496cd8bc4ae0d&nbsp;&nbsp;&nbsp; 2103&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>3. Segment document to terms, (with finding document according to the url)&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ./DocSegment Tianwang.raw.2559638448&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Tianwang.raw.2559638448为爬回来的文件 ，每个页面包含http头&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; got Tianwang.raw.2559638448.seg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//Tianwang.raw.2559638448&nbsp;&nbsp; 爬取的原始网页文件在文档内部每一个文档之间应该是通过version，&lt;/html&gt;和回车做标志位分割的&nbsp;&nbsp; <br>&nbsp; <br>version: 1.0&nbsp; <br>&nbsp; <br>url: <a href="http://***.105.138.175/Default2.asp?lang=gb">http://***.105.138.175/Default2.asp?lang=gb</a>&nbsp;&nbsp; <br>&nbsp; <br>origin: <a href="http://***.105.138.175/">http://***.105.138.175/</a>&nbsp;&nbsp; <br>&nbsp; <br>date: Fri, 23 May 2008 20:01:36 GMT&nbsp;&nbsp; <br>&nbsp; <br>ip: 162.105.138.175&nbsp; <br>&nbsp; <br>length: 38413&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>HTTP/1.1 200 OK&nbsp;&nbsp; <br>&nbsp; <br>Server: Microsoft-IIS/5.0&nbsp; <br>&nbsp; <br>Date: Fri, 23 May 2008 11:17:49 GMT&nbsp;&nbsp; <br>&nbsp; <br>Connection: keep-alive&nbsp;&nbsp; <br>&nbsp; <br>Connection: Keep-Alive&nbsp;&nbsp; <br>&nbsp; <br>Content-Length: 38088&nbsp; <br>&nbsp; <br>Content-Type: text/html; Charset=gb2312&nbsp;&nbsp; <br>&nbsp; <br>Expires: Fri, 23 May 2008 11:17:49 GMT&nbsp;&nbsp; <br>&nbsp; <br>Set-Cookie: ASPSESSIONIDSSTRDCAB=IMEOMBIAIPDFCKPAEDJFHOIH; path=/&nbsp;&nbsp; <br>&nbsp; <br>Cache-control: private&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&nbsp; <br>&nbsp; <br>"<a href="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>"&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;html&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;head&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;title&gt;Apabi数字资源平台&lt;/title&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;META NAME="ROBOTS" CONTENT="INDEX,NOFOLLOW"&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;META NAME="DESCRIPTION" CONTENT="数字图书馆 方正数字图书馆 电子图书 电子书 ebook e书 Apabi 数字资源平台"&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;link rel="stylesheet" type="text/css" href="css\common.css"&gt;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&lt;style type="text/css"&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;!--&nbsp;&nbsp; <br>&nbsp; <br>.style4 {color: #666666}&nbsp;&nbsp; <br>&nbsp; <br>--&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;/style&gt;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&lt;script LANGUAGE="vbscript"&gt;&nbsp;&nbsp; <br>&nbsp; <br>...&nbsp;&nbsp; <br>&nbsp; <br>&lt;/script&gt;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&lt;Script Language="javascript"&gt;&nbsp;&nbsp; <br>&nbsp; <br>...&nbsp;&nbsp; <br>&nbsp; <br>&lt;/Script&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;/head&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;body leftmargin="0" topmargin="0"&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;/body&gt;&nbsp;&nbsp; <br>&nbsp; <br>&lt;/html&gt;&nbsp;&nbsp; <br>&nbsp; <br>//Tianwang.raw.2559638448&nbsp;&nbsp; end&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//Tianwang.raw.2559638448.seg&nbsp;&nbsp; 将每个页面分成一行如下(注意中间没有回车作为分隔)&nbsp;&nbsp; <br>&nbsp; <br>1&nbsp; <br>&nbsp; <br>...&nbsp;&nbsp; <br>&nbsp; <br>...&nbsp;&nbsp; <br>&nbsp; <br>...&nbsp;&nbsp; <br>&nbsp; <br>2&nbsp; <br>&nbsp; <br>...&nbsp;&nbsp; <br>&nbsp; <br>...&nbsp;&nbsp; <br>&nbsp; <br>...&nbsp;&nbsp; <br>&nbsp; <br>//Tianwang.raw.2559638448.seg&nbsp;&nbsp; end&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//下是 Tiny search 非必须因素&nbsp;&nbsp; <br>&nbsp; <br>4. Create forward index (docic--&gt;termid)&nbsp;&nbsp;&nbsp;&nbsp; //建立正向索引&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ./CrtForwardIdx Tianwang.raw.2559638448.seg &gt; moon.fidx&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//Tianwang.raw.2559638448.seg 将每个页面分成一行如下&lt;BR&gt;//分词&nbsp;&nbsp; DocID&lt;BR&gt;1&lt;BR&gt;三星/&nbsp; s/&nbsp; 手机/&nbsp; 论坛/&nbsp; ,/&nbsp; 手机/&nbsp; 铃声/&nbsp; 下载/&nbsp; ,/&nbsp; 手机/&nbsp; 图片/&nbsp; 下载/&nbsp; ,/&nbsp; 手机/&lt;BR&gt;2&lt;BR&gt;...&lt;BR&gt;...&lt;BR&gt;...&nbsp; </p>
<p>1.&nbsp; The document index (Doc.idx) keeps information about each document.</p>
<p>It is a fixed width ISAM (Index sequential access mode) index, orderd by docID.</p>
<p>The information stored in each entry includes a pointer into the repository,</p>
<p>a document length, a document checksum.</p>
<p>&nbsp;</p>
<p>//Doc.idx&nbsp; 文档编号&nbsp;文档长度&nbsp;checksum hash码</p>
<p>0&nbsp;0&nbsp;bc9ce846d7987c4534f53d423380ba70</p>
<p>1&nbsp;76760&nbsp;4f47a3cad91f7d35f4bb6b2a638420e5</p>
<p>2&nbsp;141624&nbsp;d019433008538f65329ae8e39b86026c</p>
<p>3&nbsp;142350&nbsp;5705b8f58110f9ad61b1321c52605795</p>
<p>//Doc.idx&nbsp;end</p>
<p>&nbsp;</p>
<p>&nbsp; The url index (url.idx) is used to convert URLs into docIDs.</p>
<p>&nbsp;</p>
<p>//url.idx</p>
<p>5c36868a9c5117eadbda747cbdb0725f&nbsp;0</p>
<p>3272e136dd90263ee306a835c6c70d77&nbsp;1</p>
<p>6b8601bb3bb9ab80f868d549b5c5a5f3&nbsp;2</p>
<p>3f9eba99fa788954b5ff7f35a5db6e1f&nbsp;3</p>
<p>//url.idx&nbsp;end</p>
<p>&nbsp;</p>
<p>It is a list of URL checksums with their corresponding docIDs and is sorted by</p>
<p>checksum. In order to find the docID of a particular URL, the URL's checksum</p>
<p>is computed and a binary search is performed on the checksums file to find its</p>
<p>docID.</p>
<p>&nbsp;</p>
<p>&nbsp;./DocIndex</p>
<p>&nbsp;&nbsp;got Doc.idx, Url.idx, DocId2Url.idx&nbsp;//Data文件夹中的Doc.idx DocId2Url.idx和Doc.idx中</p>
<p>&nbsp;</p>
<p>//DocId2Url.idx</p>
<p>0&nbsp;<a href="http://*.*.edu.cn/index.aspx">http://*.*.edu.cn/index.aspx</a></p>
<p>1&nbsp;<a href="http://*.*.edu.cn/showcontent1.jsp?NewsID=118">http://*.*.edu.cn/showcontent1.jsp?NewsID=118</a></p>
<p>2&nbsp;<a href="http://*.*.edu.cn/0102.html">http://*.*.edu.cn/0102.html</a></p>
<p>3&nbsp;<a href="http://*.*.edu.cn/0103.html">http://*.*.edu.cn/0103.html</a></p>
<p>//DocId2Url.idx&nbsp;end</p>
<p>&nbsp;</p>
<p>2.&nbsp; sort Url.idx|uniq &gt; Url.idx.sort_uniq&nbsp;//Data文件夹中的Url.idx.sort_uniq</p>
<p>&nbsp;</p>
<p>//Url.idx.sort_uniq</p>
<p>//对hash值进行排序</p>
<p>000bfdfd8b2dedd926b58ba00d40986b&nbsp;1111</p>
<p>000c7e34b653b5135a2361c6818e48dc&nbsp;1831</p>
<p>0019d12f438eec910a06a606f570fde8&nbsp;366</p>
<p>0033f7c005ec776f67f496cd8bc4ae0d&nbsp;2103</p>
<p>&nbsp;</p>
<p>3. Segment document to terms, (with finding document according to the url)</p>
<p>&nbsp;./DocSegment Tianwang.raw.2559638448&nbsp;&nbsp;//Tianwang.raw.2559638448为爬回来的文件 ，每个页面包含http头</p>
<p>&nbsp;&nbsp;got Tianwang.raw.2559638448.seg&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p>//Tianwang.raw.2559638448&nbsp;爬取的原始网页文件在文档内部每一个文档之间应该是通过version，&lt;/html&gt;和回车做标志位分割的</p>
<p>version: 1.0</p>
<p>url: <a href="http://***.105.138.175/Default2.asp?lang=gb">http://***.105.138.175/Default2.asp?lang=gb</a></p>
<p>origin: <a href="http://***.105.138.175/">http://***.105.138.175/</a></p>
<p>date: Fri, 23 May 2008 20:01:36 GMT</p>
<p>ip: 162.105.138.175</p>
<p>length: 38413</p>
<p>&nbsp;</p>
<p>HTTP/1.1 200 OK</p>
<p>Server: Microsoft-IIS/5.0</p>
<p>Date: Fri, 23 May 2008 11:17:49 GMT</p>
<p>Connection: keep-alive</p>
<p>Connection: Keep-Alive</p>
<p>Content-Length: 38088</p>
<p>Content-Type: text/html; Charset=gb2312</p>
<p>Expires: Fri, 23 May 2008 11:17:49 GMT</p>
<p>Set-Cookie: ASPSESSIONIDSSTRDCAB=IMEOMBIAIPDFCKPAEDJFHOIH; path=/</p>
<p>Cache-control: private</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</p>
<p>"<a href="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>"&gt;</p>
<p>&lt;html&gt;</p>
<p>&lt;head&gt;</p>
<p>&lt;title&gt;Apabi数字资源平台&lt;/title&gt;</p>
<p>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;</p>
<p>&lt;META NAME="ROBOTS" CONTENT="INDEX,NOFOLLOW"&gt;</p>
<p>&lt;META NAME="DESCRIPTION" CONTENT="数字图书馆 方正数字图书馆 电子图书 电子书 ebook e书 Apabi 数字资源平台"&gt;</p>
<p>&lt;link rel="stylesheet" type="text/css" href="css\common.css"&gt;</p>
<p>&nbsp;</p>
<p>&lt;style type="text/css"&gt;</p>
<p>&lt;!--</p>
<p>.style4 {color: #666666}</p>
<p>--&gt;</p>
<p>&lt;/style&gt;</p>
<p>&nbsp;</p>
<p>&lt;script LANGUAGE="vbscript"&gt;</p>
<p>...</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>&lt;Script Language="javascript"&gt;</p>
<p>...</p>
<p>&lt;/Script&gt;</p>
<p>&lt;/head&gt;</p>
<p>&lt;body leftmargin="0" topmargin="0"&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>//Tianwang.raw.2559638448&nbsp;end</p>
<p>&nbsp;</p>
<p>//Tianwang.raw.2559638448.seg&nbsp;将每个页面分成一行如下(注意中间没有回车作为分隔)</p>
<p>1</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>2</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>//Tianwang.raw.2559638448.seg&nbsp;end</p>
<p>&nbsp;</p>
<p>//下是 Tiny search 非必须因素</p>
<p>4. Create forward index (docic--&gt;termid)&nbsp;&nbsp;//建立正向索引</p>
<p>&nbsp;./CrtForwardIdx Tianwang.raw.2559638448.seg &gt; moon.fidx</p>
<p>&nbsp;</p>
<p>//Tianwang.raw.2559638448.seg 将每个页面分成一行如下//分词&nbsp;&nbsp; DocID1三星/&nbsp; s/&nbsp; 手机/&nbsp; 论坛/&nbsp; ,/&nbsp; 手机/&nbsp; 铃声/&nbsp; 下载/&nbsp; ,/&nbsp; 手机/&nbsp; 图片/&nbsp; 下载/&nbsp; ,/&nbsp; 手机/2.........view plaincopy to clipboardprint?<br>//Tianwang.raw.2559638448.seg end&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>//moon.fidx&nbsp;&nbsp; <br>&nbsp; <br>//每篇文档号对应文档内分出来的&nbsp;&nbsp;&nbsp; 分词&nbsp; DocID&nbsp;&nbsp; <br>&nbsp; <br>都会&nbsp; 2391&nbsp; <br>&nbsp; <br>使&nbsp;&nbsp; 2391&nbsp; <br>&nbsp; <br>那些&nbsp; 2391&nbsp; <br>&nbsp; <br>拥有&nbsp; 2391&nbsp; <br>&nbsp; <br>它&nbsp;&nbsp; 2391&nbsp; <br>&nbsp; <br>的&nbsp;&nbsp; 2391&nbsp; <br>&nbsp; <br>人&nbsp;&nbsp; 2391&nbsp; <br>&nbsp; <br>的&nbsp;&nbsp; 2391&nbsp; <br>&nbsp; <br>视野&nbsp; 2391&nbsp; <br>&nbsp; <br>变&nbsp;&nbsp; 2391&nbsp; <br>&nbsp; <br>窄&nbsp;&nbsp; 2391&nbsp; <br>&nbsp; <br>在&nbsp;&nbsp; 2180&nbsp; <br>&nbsp; <br>研究生部&nbsp;&nbsp;&nbsp; 2180&nbsp; <br>&nbsp; <br>主页&nbsp; 2180&nbsp; <br>&nbsp; <br>培养&nbsp; 2180&nbsp; <br>&nbsp; <br>管理&nbsp; 2180&nbsp; <br>&nbsp; <br>栏目&nbsp; 2180&nbsp; <br>&nbsp; <br>下载&nbsp; 2180&nbsp; <br>&nbsp; <br>）&nbsp;&nbsp; 2180&nbsp; <br>&nbsp; <br>、&nbsp;&nbsp; 2180&nbsp; <br>&nbsp; <br>关于&nbsp; 2180&nbsp; <br>&nbsp; <br>做好&nbsp; 2180&nbsp; <br>&nbsp; <br>年&nbsp;&nbsp; 2180&nbsp; <br>&nbsp; <br>国家&nbsp; 2180&nbsp; <br>&nbsp; <br>公派&nbsp; 2180&nbsp; <br>&nbsp; <br>研究生 2180&nbsp; <br>&nbsp; <br>项目&nbsp; 2180&nbsp; <br>&nbsp; <br>//moon.fidx end&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>5.# set | grep "LANG"&nbsp; <br>&nbsp; <br>LANG=en; export LANG;&nbsp;&nbsp; <br>&nbsp; <br>sort moon.fidx &gt; moon.fidx.sort&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>6. Create inverted index (termid--&gt;docid)&nbsp;&nbsp;&nbsp; //建立倒排索引&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ./CrtInvertedIdx moon.fidx.sort &gt; sun.iidx&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>//sun.iidx&nbsp; //文件规模大概减少1/2&nbsp;&nbsp; <br>&nbsp; <br>花工&nbsp;&nbsp; 236&nbsp; <br>&nbsp; <br>花海&nbsp;&nbsp; 2103&nbsp; <br>&nbsp; <br>花卉&nbsp;&nbsp; 1018 1061 1061 1061 1730 1730 1730 1730 1730 1852 949 949&nbsp; <br>&nbsp; <br>花蕾&nbsp;&nbsp; 447 447&nbsp; <br>&nbsp; <br>花木&nbsp;&nbsp; 1061&nbsp; <br>&nbsp; <br>花呢&nbsp;&nbsp; 1430&nbsp; <br>&nbsp; <br>花期&nbsp;&nbsp; 447 447 447 447 447 525&nbsp; <br>&nbsp; <br>花钱&nbsp;&nbsp; 174 236&nbsp; <br>&nbsp; <br>花色&nbsp;&nbsp; 1730 1730&nbsp; <br>&nbsp; <br>花色品种&nbsp;&nbsp;&nbsp;&nbsp; 1660&nbsp; <br>&nbsp; <br>花生&nbsp;&nbsp; 450 526&nbsp; <br>&nbsp; <br>花式&nbsp;&nbsp; 1428 1430 1430 1430&nbsp; <br>&nbsp; <br>花纹&nbsp;&nbsp; 1430 1430&nbsp; <br>&nbsp; <br>花序&nbsp;&nbsp; 447 447 447 447 447 450&nbsp; <br>&nbsp; <br>花絮&nbsp;&nbsp; 136 137&nbsp; <br>&nbsp; <br>花芽&nbsp;&nbsp; 450 450&nbsp; <br>&nbsp; <br>//sun.iidx&nbsp; end&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>TSESearch&nbsp;&nbsp; CGI program for query&nbsp;&nbsp; <br>&nbsp; <br>Snapshot&nbsp;&nbsp;&nbsp; CGI program for page snapshot&nbsp;&nbsp; <br>&nbsp; <br>&nbsp; <br>&lt;P&gt;&nbsp;&nbsp; <br>author:http://hi.baidu.com/jrckkyy&nbsp;&nbsp; <br>&nbsp; <br>author:http://blog.csdn.net/jrckkyy&nbsp;&nbsp; <br>&lt;/P&gt;&nbsp; </p>
<p><a href="http://blog.csdn.net/jrckkyy/archive/2008/07/05/2614693.aspx"></a>&nbsp;</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 22:55 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[4]小结</title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102942.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102942.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102942.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102942.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102942.html</trackback:ping><description><![CDATA[<p>通过前面的三篇文章相信你已经对神秘的搜索引擎有了一个感性的认识，和普通的php类似的脚本语言服务器类似，通过获取前台关键字，通过字典分词，和事先建立建立好的倒排索引进行相关性分析，得出查询结构格式化输出结果。而这里的技术难点在于</p>
<p>1、字典的选取（事实上根据不同时代不同地方人们的语言习惯是不一样的所以说字典的最小元的取值是不同的）</p>
<p>2、倒排索引的建立（这里就要涉及到爬虫的抓取和索引的建立后面将重点介绍这2点，搜索引擎的效率和服务质量实效性瓶颈在这里）</p>
<p>3、相关性分析（对抓回来的文档分词建索引和用户关键字分词算法上要对应）</p>
<p>后面文章会重点介绍爬虫的抓取和索引的建立。</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 22:54 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[3]来到关键字分词及相关性分析程序 </title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102941.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 14:53:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102941.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102941.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102941.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102941.html</trackback:ping><description><![CDATA[<p>有前面注释我们可以知道查询关键字和字典文件准备好好后，将进入用户关键字分词阶段</p>
<p>//TSESearch.cpp中：</p>
<p>view plaincopy to clipboardprint?<br>CHzSeg iHzSeg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //include ChSeg/HzSeg.h&nbsp;&nbsp; <br>&nbsp; <br>//&nbsp;&nbsp; <br>iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);&nbsp; //将get到的查询变量分词分成 "我/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 爱/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你们/ 的/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式"&nbsp;&nbsp; <br>&nbsp; <br>vector&lt;STRING&gt;&lt;/STRING&gt; vecTerm;&nbsp;&nbsp; <br>iQuery.ParseQuery(vecTerm);&nbsp;&nbsp;&nbsp;&nbsp; //将以"/"划分开的关键字一一顺序放入一个向量容器中&nbsp;&nbsp; <br>&nbsp; <br>set&lt;STRING&gt;&lt;/STRING&gt; setRelevantRst;&nbsp;&nbsp;&nbsp; <br>iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst);&nbsp;&nbsp;&nbsp; <br>&nbsp; <br>gettimeofday(&amp;end_tv,&amp;tz);&nbsp;&nbsp; <br>// search end&nbsp;&nbsp; <br>//搜索完毕&nbsp; </p>
<p>&nbsp;CHzSeg iHzSeg;&nbsp;&nbsp;//include ChSeg/HzSeg.h</p>
<p>&nbsp;//<br>&nbsp;iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);&nbsp;//将get到的查询变量分词分成 "我/&nbsp;&nbsp;爱/&nbsp;&nbsp;你们/&nbsp;的/&nbsp;&nbsp;格式"<br>&nbsp;<br>&nbsp;vector vecTerm;<br>&nbsp;iQuery.ParseQuery(vecTerm);&nbsp;&nbsp;//将以"/"划分开的关键字一一顺序放入一个向量容器中<br>&nbsp;<br>&nbsp;set setRelevantRst; <br>&nbsp;iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst); <br>&nbsp;<br>&nbsp;gettimeofday(&amp;end_tv,&amp;tz);<br>&nbsp;// search end<br>&nbsp;//搜索完毕view plaincopy to clipboardprint?<br>看CHzSeg 中的这个方法&nbsp; </p>
<p>看CHzSeg 中的这个方法view plaincopy to clipboardprint?<br>//ChSeg/HzSeg.h&nbsp; </p>
<p>//ChSeg/HzSeg.hview plaincopy to clipboardprint?<br>/**&nbsp;&nbsp; <br>&nbsp;* 程序翻译说明&nbsp;&nbsp; <br>&nbsp;* 进一步净化数据，转换汉字&nbsp;&nbsp; <br>&nbsp;* @access&nbsp; public&nbsp;&nbsp; <br>&nbsp;* @param&nbsp;&nbsp; CDict, string 参数的汉字说明:字典，查询字符串&nbsp;&nbsp; <br>&nbsp;* @return&nbsp; string 0&nbsp;&nbsp; <br>&nbsp;*/&nbsp;&nbsp; <br>// process a sentence before segmentation&nbsp;&nbsp; <br>//在分词前处理句子&nbsp;&nbsp; <br>string CHzSeg::SegmentSentenceMM (CDict &amp;dict, string s1) const&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; string s2="";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; unsigned int i,len;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; while (!s1.empty())&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char ch=(unsigned char) s1[0];&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch&lt;128)&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { // deal with ASCII&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=1;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len = s1.size();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (i&lt;LEN len="s1.length();" i="0;" 中文标点等非汉字字符="" if="" else="" yhf="" s1="s1.substr(i);" by="" added="" ch="=13)" s2="" cr=""&gt;&lt;/LEN&gt;=161)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (!((unsigned char)s1[i]==161 &amp;&amp; ((unsigned char)s1[i+1]&gt;=162 &amp;&amp; (unsigned char)s1[i+1]&lt;=168)))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (!((unsigned char)s1[i]==161 &amp;&amp; ((unsigned char)s1[i+1]&gt;=171 &amp;&amp; (unsigned char)s1[i+1]&lt;=191)))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (!((unsigned char)s1[i]==163 &amp;&amp; ((unsigned char)s1[i+1]==172 || (unsigned char)s1[i+1]==161)&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || (unsigned char)s1[i+1]==168 || (unsigned char)s1[i+1]==169 || (unsigned char)s1[i+1]==186&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || (unsigned char)s1[i+1]==187 || (unsigned char)s1[i+1]==191)))&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii=i+2; // 假定没有半个汉字&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i==0) ii=i+2;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 不处理中文空格&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(ch==161 &amp;&amp; (unsigned char)s1[1]==161))&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &lt;= s1.size())&nbsp; // yhf&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 其他的非汉字双字节字符可能连续输出&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s2 += s1.substr(0, i) + SEPARATOR;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else break; // yhf&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &lt;= s1.size())&nbsp; // yhf&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s1s1=s1.substr(i);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else break;&nbsp;&nbsp;&nbsp;&nbsp; //yhf&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; // 以下处理汉字串&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = 2;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len = s1.length();&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(i&lt;LEN&gt;&lt;/LEN&gt;=176)&nbsp;&nbsp;&nbsp; <br>//&nbsp;&nbsp;&nbsp; while(i&lt;LEN&gt;&lt;/LEN&gt;=128 &amp;&amp; (unsigned char)s1[i]!=161)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i+=2;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s2+=SegmentHzStrMM(dict, s1.substr(0,i));&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &lt;= len)&nbsp;&nbsp;&nbsp; // yhf&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s1s1=s1.substr(i);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else break; // yhf&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; return s2;&nbsp;&nbsp; <br>}&nbsp; </p>
<p>/**<br>&nbsp;* 程序翻译说明<br>&nbsp;* 进一步净化数据，转换汉字<br>&nbsp;* @access&nbsp; public<br>&nbsp;* @param&nbsp;&nbsp; CDict, string 参数的汉字说明:字典，查询字符串<br>&nbsp;* @return&nbsp; string 0<br>&nbsp;*/<br>// process a sentence before segmentation<br>//在分词前处理句子<br>string CHzSeg::SegmentSentenceMM (CDict &amp;dict, string s1) const<br>{<br>&nbsp;string s2="";<br>&nbsp;unsigned int i,len;</p>
<p>&nbsp;while (!s1.empty()) <br>&nbsp;{<br>&nbsp;&nbsp;unsigned char ch=(unsigned char) s1[0];<br>&nbsp;&nbsp;if(ch&lt;128) <br>&nbsp;&nbsp;{ // deal with ASCII<br>&nbsp;&nbsp;&nbsp;i=1;<br>&nbsp;&nbsp;&nbsp;len = s1.size();<br>&nbsp;&nbsp;&nbsp;while (i=161)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (!((unsigned char)s1[i]==161 &amp;&amp; ((unsigned char)s1[i+1]&gt;=162 &amp;&amp; (unsigned char)s1[i+1]&lt;=168)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (!((unsigned char)s1[i]==161 &amp;&amp; ((unsigned char)s1[i+1]&gt;=171 &amp;&amp; (unsigned char)s1[i+1]&lt;=191)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (!((unsigned char)s1[i]==163 &amp;&amp; ((unsigned char)s1[i+1]==172 || (unsigned char)s1[i+1]==161) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || (unsigned char)s1[i+1]==168 || (unsigned char)s1[i+1]==169 || (unsigned char)s1[i+1]==186<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || (unsigned char)s1[i+1]==187 || (unsigned char)s1[i+1]==191))) <br>&nbsp;&nbsp;&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=i+2; // 假定没有半个汉字<br>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;if (i==0) i=i+2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;// 不处理中文空格<br>&nbsp;&nbsp;&nbsp;&nbsp;if (!(ch==161 &amp;&amp; (unsigned char)s1[1]==161)) <br>&nbsp;&nbsp;&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i &lt;= s1.size())&nbsp;// yhf<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 其他的非汉字双字节字符可能连续输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s2 += s1.substr(0, i) + SEPARATOR; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else break; // yhf<br>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;if (i &lt;= s1.size())&nbsp;// yhf<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s1=s1.substr(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;else break;&nbsp;&nbsp;//yhf</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; // 以下处理汉字串</p>
<p>&nbsp;&nbsp;i = 2;<br>&nbsp;&nbsp;len = s1.length();</p>
<p>&nbsp;&nbsp;while(i=176) <br>//&nbsp;&nbsp;&nbsp; while(i=128 &amp;&amp; (unsigned char)s1[i]!=161)<br>&nbsp;&nbsp;&nbsp;i+=2;</p>
<p>&nbsp;&nbsp;s2+=SegmentHzStrMM(dict, s1.substr(0,i));</p>
<p>&nbsp;&nbsp;if (i &lt;= len)&nbsp;// yhf<br>&nbsp;&nbsp;&nbsp;s1=s1.substr(i);<br>&nbsp;&nbsp;else break;&nbsp;// yhf<br>&nbsp;}</p>
<p>&nbsp;return s2;<br>}view plaincopy to clipboardprint?<br>&nbsp;&nbsp; </p>
<p>&nbsp;view plaincopy to clipboardprint?<br>//Query.cpp&nbsp; </p>
<p>//Query.cppview plaincopy to clipboardprint?<br>&lt;PRE class=csharp name="code"&gt;/**&nbsp;&nbsp; <br>&nbsp;* 程序翻译说明&nbsp;&nbsp; <br>&nbsp;* 将以"/"划分开的关键字一一顺序放入一个向量容器中&nbsp;&nbsp; <br>&nbsp;*&nbsp;&nbsp; <br>&nbsp;* @access&nbsp; public&nbsp;&nbsp; <br>&nbsp;* @param&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt; 参数的汉字说明：向量容器&nbsp;&nbsp; <br>&nbsp;* @return&nbsp; void&nbsp;&nbsp; <br>&nbsp;*/&nbsp;&nbsp; <br>void CQuery::ParseQuery(vector&lt;STRING&gt;&lt;/STRING&gt; &amp;vecTerm)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; string::size_type idx;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; while ( (idx = m_sSegQuery.find("/&nbsp; ")) != string::npos ) {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vecTerm.push_back(m_sSegQuery.substr(0,idx));&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_sSegQuerym_sSegQuery = m_sSegQuery.substr(idx+3);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>}&nbsp;&nbsp; <br>&lt;/PRE&gt;&nbsp; <br>&lt;PRE class=csharp name="code"&gt; &lt;/PRE&gt;&nbsp; <br>&lt;PRE class=csharp name="code"&gt;&lt;PRE class=csharp name="code"&gt;/**&nbsp;&nbsp; <br>&nbsp;* 程序翻译说明&nbsp;&nbsp; <br>&nbsp;* 相关性分析查询，构造结果集合setRelevantRst //瓶颈所在&nbsp;&nbsp; <br>&nbsp;*&nbsp;&nbsp; <br>&nbsp;* @access&nbsp; public&nbsp;&nbsp; <br>&nbsp;* @param&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt; map set&lt;STRING&gt;&lt;/STRING&gt; 参数的汉字说明： 用户提交关键字的分词组，倒排索引映射，相关性结果集合&nbsp;&nbsp; <br>&nbsp;* @return&nbsp; string 0&nbsp;&nbsp; <br>&nbsp;*/&nbsp;&nbsp; <br>bool CQuery::GetRelevantRst&nbsp;&nbsp; <br>(&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt; &amp;vecTerm,&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; map &amp;mapBuckets,&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; set&lt;STRING&gt;&lt;/STRING&gt; &amp;setRelevantRst&nbsp;&nbsp; <br>) const&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; set&lt;STRING&gt;&lt;/STRING&gt; setSRst;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; bool bFirst=true;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt;::iterator itTerm = vecTerm.begin();&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; for ( ; itTerm != vecTerm.end(); ++itTerm )&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setSRst.clear();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map mapRstDoc;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string docid;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int doccnt;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator itBuckets = mapBuckets.find(*itTerm);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (itBuckets != mapBuckets.end())&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strBucket = (*itBuckets).second;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string::size_type idx;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idx = strBucket.find_first_not_of(" ");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strBucketstrBucket = strBucket.substr(idx);&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (idx = strBucket.find(" ")) != string::npos )&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docid = strBucket.substr(0,idx);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = 0;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (docid.empty()) continue;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it = mapRstDoc.find(docid);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( it != mapRstDoc.end() )&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = (*it).second + 1;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.erase(it);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.insert( pair(docid,doccnt) );&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strBucketstrBucket = strBucket.substr(idx+1);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // remember the last one&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docid = strBucket;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = 0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it = mapRstDoc.find(docid);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( it != mapRstDoc.end() )&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = (*it).second + 1;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.erase(it);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.insert( pair(docid,doccnt) );&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // sort by term frequencty&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multimap &gt; newRstDoc;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it0 = mapRstDoc.begin();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( ; it0 != mapRstDoc.end(); ++it0 ){&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newRstDoc.insert( pair((*it0).second,(*it0).first) );&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multimap::iterator itNewRstDoc = newRstDoc.begin();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.clear();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string docid = (*itNewRstDoc).second;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bFirst==true) {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.insert(docid);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( setSRst.find(docid) != setSRst.end() ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.insert(docid);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout &lt;&lt; "setRelevantRst.size(): " &lt;&lt; setRelevantRst.size() &lt;&lt; "&lt;BR&gt;";&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bFirst = false;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp; <br>}&lt;/PRE&gt;&nbsp; <br>&lt;/PRE&gt;&nbsp; <br>接下来的就是现实了，前面都只是处理数据得到 setRelevantRst 这个查询结构集合,这里就不多说了下面就和php之类的脚本语言差不多，格式化结果集合并显示出来。&nbsp; </p>
<p>view plaincopy to clipboardprint?/**&nbsp;&nbsp; * 程序翻译说明&nbsp;&nbsp; * 将以"/"划分开的关键字一一顺序放入一个向量容器中&nbsp;&nbsp; *&nbsp;&nbsp; * @access&nbsp; public&nbsp;&nbsp; * @param&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt; 参数的汉字说明：向量容器&nbsp;&nbsp; * @return&nbsp; void&nbsp;&nbsp; */&nbsp; void CQuery::ParseQuery(vector&lt;STRING&gt;&lt;/STRING&gt; &amp;vecTerm)&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string::size_type idx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (idx = m_sSegQuery.find("/&nbsp; ")) != string::npos ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vecTerm.push_back(m_sSegQuery.substr(0,idx));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_sSegQuery = m_sSegQuery.substr(idx+3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; }&nbsp; /**<br>&nbsp;* 程序翻译说明<br>&nbsp;* 将以"/"划分开的关键字一一顺序放入一个向量容器中<br>&nbsp;*<br>&nbsp;* @access&nbsp; public<br>&nbsp;* @param&nbsp;&nbsp; vector 参数的汉字说明：向量容器<br>&nbsp;* @return&nbsp; void<br>&nbsp;*/<br>void CQuery::ParseQuery(vector &amp;vecTerm)<br>{<br>&nbsp;string::size_type idx; <br>&nbsp;while ( (idx = m_sSegQuery.find("/&nbsp; ")) != string::npos ) { <br>&nbsp;&nbsp;vecTerm.push_back(m_sSegQuery.substr(0,idx)); <br>&nbsp;&nbsp;m_sSegQuery = m_sSegQuery.substr(idx+3); <br>&nbsp;}<br>}</p>
<p>view plaincopy to clipboardprint?&nbsp;&nbsp;&nbsp; <br>view plaincopy to clipboardprint?&lt;PRE class=csharp name="code"&gt;/**&nbsp;&nbsp; * 程序翻译说明&nbsp;&nbsp; * 相关性分析查询，构造结果集合setRelevantRst //瓶颈所在&nbsp;&nbsp; *&nbsp;&nbsp; * @access&nbsp; public&nbsp;&nbsp; * @param&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt; map set&lt;STRING&gt;&lt;/STRING&gt; 参数的汉字说明： 用户提交关键字的分词组，倒排索引映射，相关性结果集合&nbsp;&nbsp; * @return&nbsp; string 0&nbsp;&nbsp; */&nbsp; bool CQuery::GetRelevantRst&nbsp;&nbsp; (&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt; &amp;vecTerm,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map &amp;mapBuckets,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&lt;STRING&gt;&lt;/STRING&gt; &amp;setRelevantRst&nbsp;&nbsp; ) const&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&lt;STRING&gt;&lt;/STRING&gt; setSRst;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool bFirst=true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt;::iterator itTerm = vecTerm.begin();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( ; itTerm != vecTerm.end(); ++itTerm )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setSRst.clear();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map mapRstDoc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string docid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int doccnt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator itBuckets = mapBuckets.find(*itTerm);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (itBuckets != mapBuckets.end())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strBucket = (*itBuckets).second;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string::size_type idx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idx = strBucket.find_first_not_of(" ");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strBucket = strBucket.substr(idx);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (idx = strBucket.find(" ")) != string::npos )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docid = strBucket.substr(0,idx);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (docid.empty()) continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it = mapRstDoc.find(docid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( it != mapRstDoc.end() )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = (*it).second + 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.erase(it);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.insert( pair(docid,doccnt) );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strBucket = strBucket.substr(idx+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // remember the last one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docid = strBucket;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it = mapRstDoc.find(docid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( it != mapRstDoc.end() )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = (*it).second + 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.erase(it);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.insert( pair(docid,doccnt) );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // sort by term frequencty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multimap &gt; newRstDoc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it0 = mapRstDoc.begin();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( ; it0 != mapRstDoc.end(); ++it0 ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newRstDoc.insert( pair((*it0).second,(*it0).first) );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multimap::iterator itNewRstDoc = newRstDoc.begin();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.clear();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string docid = (*itNewRstDoc).second;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bFirst==true) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.insert(docid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( setSRst.find(docid) != setSRst.end() ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.insert(docid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout &lt;&lt; "setRelevantRst.size(): " &lt;&lt; setRelevantRst.size() &lt;&lt; "&lt;BR&gt;";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bFirst = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp; }&lt;/PRE&gt;&nbsp; view plaincopy to clipboardprint?/**&nbsp;&nbsp; * 程序翻译说明&nbsp;&nbsp; * 相关性分析查询，构造结果集合setRelevantRst //瓶颈所在&nbsp;&nbsp; *&nbsp;&nbsp; * @access&nbsp; public&nbsp;&nbsp; * @param&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt; map set&lt;STRING&gt;&lt;/STRING&gt; 参数的汉字说明： 用户提交关键字的分词组，倒排索引映射，相关性结果集合&nbsp;&nbsp; * @return&nbsp; string 0&nbsp;&nbsp; */&nbsp; bool CQuery::GetRelevantRst&nbsp;&nbsp; (&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt; &amp;vecTerm,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map &amp;mapBuckets,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&lt;STRING&gt;&lt;/STRING&gt; &amp;setRelevantRst&nbsp;&nbsp; ) const&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set&lt;STRING&gt;&lt;/STRING&gt; setSRst;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool bFirst=true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector&lt;STRING&gt;&lt;/STRING&gt;::iterator itTerm = vecTerm.begin();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( ; itTerm != vecTerm.end(); ++itTerm )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setSRst.clear();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map mapRstDoc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string docid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int doccnt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator itBuckets = mapBuckets.find(*itTerm);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (itBuckets != mapBuckets.end())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strBucket = (*itBuckets).second;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string::size_type idx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idx = strBucket.find_first_not_of(" ");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strBucket = strBucket.substr(idx);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (idx = strBucket.find(" ")) != string::npos )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docid = strBucket.substr(0,idx);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (docid.empty()) continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it = mapRstDoc.find(docid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( it != mapRstDoc.end() )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = (*it).second + 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.erase(it);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.insert( pair(docid,doccnt) );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strBucket = strBucket.substr(idx+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // remember the last one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docid = strBucket;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it = mapRstDoc.find(docid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( it != mapRstDoc.end() )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doccnt = (*it).second + 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.erase(it);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapRstDoc.insert( pair(docid,doccnt) );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // sort by term frequencty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multimap &gt; newRstDoc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map::iterator it0 = mapRstDoc.begin();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( ; it0 != mapRstDoc.end(); ++it0 ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newRstDoc.insert( pair((*it0).second,(*it0).first) );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multimap::iterator itNewRstDoc = newRstDoc.begin();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.clear();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string docid = (*itNewRstDoc).second;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bFirst==true) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.insert(docid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( setSRst.find(docid) != setSRst.end() ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.insert(docid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout &lt;&lt; "setRelevantRst.size(): " &lt;&lt; setRelevantRst.size() &lt;&lt; "&lt;BR&gt;";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bFirst = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp; }&nbsp; /**<br>&nbsp;* 程序翻译说明<br>&nbsp;* 相关性分析查询，构造结果集合setRelevantRst&nbsp;//瓶颈所在<br>&nbsp;*<br>&nbsp;* @access&nbsp; public<br>&nbsp;* @param&nbsp;&nbsp; vector map set 参数的汉字说明： 用户提交关键字的分词组，倒排索引映射，相关性结果集合<br>&nbsp;* @return&nbsp; string 0<br>&nbsp;*/<br>bool CQuery::GetRelevantRst<br>(<br>&nbsp;vector &amp;vecTerm, <br>&nbsp;map &amp;mapBuckets, <br>&nbsp;set &amp;setRelevantRst<br>) const<br>{<br>&nbsp;set setSRst;</p>
<p>&nbsp;bool bFirst=true;<br>&nbsp;vector::iterator itTerm = vecTerm.begin();</p>
<p>&nbsp;for ( ; itTerm != vecTerm.end(); ++itTerm )<br>&nbsp;{</p>
<p>&nbsp;&nbsp;setSRst.clear();<br>&nbsp;&nbsp;copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));</p>
<p>&nbsp;&nbsp;map mapRstDoc;<br>&nbsp;&nbsp;string docid;<br>&nbsp;&nbsp;int doccnt;</p>
<p>&nbsp;&nbsp;map::iterator itBuckets = mapBuckets.find(*itTerm);<br>&nbsp;&nbsp;if (itBuckets != mapBuckets.end())<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;string strBucket = (*itBuckets).second;<br>&nbsp;&nbsp;&nbsp;string::size_type idx;<br>&nbsp;&nbsp;&nbsp;idx = strBucket.find_first_not_of(" ");<br>&nbsp;&nbsp;&nbsp;strBucket = strBucket.substr(idx);</p>
<p>&nbsp;&nbsp;&nbsp;while ( (idx = strBucket.find(" ")) != string::npos ) <br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;docid = strBucket.substr(0,idx);<br>&nbsp;&nbsp;&nbsp;&nbsp;doccnt = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;if (docid.empty()) continue;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;map::iterator it = mapRstDoc.find(docid);<br>&nbsp;&nbsp;&nbsp;&nbsp;if ( it != mapRstDoc.end() )<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doccnt = (*it).second + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapRstDoc.erase(it);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;mapRstDoc.insert( pair(docid,doccnt) );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;strBucket = strBucket.substr(idx+1);<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;// remember the last one<br>&nbsp;&nbsp;&nbsp;docid = strBucket;<br>&nbsp;&nbsp;&nbsp;doccnt = 0;<br>&nbsp;&nbsp;&nbsp;map::iterator it = mapRstDoc.find(docid);<br>&nbsp;&nbsp;&nbsp;if ( it != mapRstDoc.end() )<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;doccnt = (*it).second + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;mapRstDoc.erase(it);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;mapRstDoc.insert( pair(docid,doccnt) );<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// sort by term frequencty<br>&nbsp;&nbsp;multimap &gt; newRstDoc;<br>&nbsp;&nbsp;map::iterator it0 = mapRstDoc.begin();<br>&nbsp;&nbsp;for ( ; it0 != mapRstDoc.end(); ++it0 ){<br>&nbsp;&nbsp;&nbsp;newRstDoc.insert( pair((*it0).second,(*it0).first) );<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;multimap::iterator itNewRstDoc = newRstDoc.begin();<br>&nbsp;&nbsp;setRelevantRst.clear();<br>&nbsp;&nbsp;for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){<br>&nbsp;&nbsp;&nbsp;string docid = (*itNewRstDoc).second;</p>
<p>&nbsp;&nbsp;&nbsp;if (bFirst==true) {<br>&nbsp;&nbsp;&nbsp;&nbsp;setRelevantRst.insert(docid);<br>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;if ( setSRst.find(docid) != setSRst.end() ){&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;setRelevantRst.insert(docid);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;//cout &lt;&lt; "setRelevantRst.size(): " &lt;&lt; setRelevantRst.size() &lt;&lt; "";<br>&nbsp;&nbsp;bFirst = false;<br>&nbsp;}<br>&nbsp;return true;<br>}</p>
<p>接下来的就是现实了，前面都只是处理数据得到 setRelevantRst 这个查询结构集合,这里就不多说了下面就和php之类的脚本语言差不多，格式化结果集合并显示出来。<br>//TSESearch.cpp</p>
<p>view plaincopy to clipboardprint?<br>//下面开始显示&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; CDisplayRst iDisplayRst;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; iDisplayRst.ShowTop();&nbsp;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; float used_msec = (end_tv.tv_sec-begin_tv.tv_sec)*1000&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +((float)(end_tv.tv_usec-begin_tv.tv_usec))/(float)1000;&nbsp;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; iDisplayRst.ShowMiddle(iQuery.m_sQuery,used_msec,&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.size(), iQuery.m_iStart);&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; iDisplayRst.ShowBelow(vecTerm,setRelevantRst,vecDocIdx,iQuery.m_iStart); </p>
<p><a href="http://blog.csdn.net/jrckkyy/archive/2008/06/03/2508524.aspx"></a>&nbsp;</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 22:53 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[2]路过查询处理程序</title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102940.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102940.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102940.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102940.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102940.html</trackback:ping><description><![CDATA[<p>由上一篇文章[原]自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[1]寻找搜索引擎入口 我们可以知道整个程序是从TSESearch.cpp 中的main函数开始的我们重点一下这段代码</p>
<p>//TSESearch.cpp&nbsp;CQuery iQuery;<br>&nbsp;iQuery.GetInputs();&nbsp;&nbsp;//具体程序开始执行<br>&nbsp;// current query &amp; result page number<br>&nbsp;iQuery.SetQuery();<br>&nbsp;iQuery.SetStart();</p>
<p>&nbsp;// begin to search<br>&nbsp;//开始具体搜索程序<br>&nbsp;gettimeofday(&amp;begin_tv,&amp;tz);&nbsp;//开始计时获取程序运行时间差</p>
<p>&nbsp;iQuery.GetInvLists(mapBuckets);&nbsp;&nbsp;//将所有字符集存入映射变量中&nbsp;瓶颈所在<br>&nbsp;iQuery.GetDocIdx(vecDocIdx);&nbsp;&nbsp;//将倒排索引存入向量中&nbsp;&nbsp;瓶颈所在<br>&nbsp;<br>&nbsp;CHzSeg iHzSeg;&nbsp;&nbsp;//include ChSeg/HzSeg.h<br>&nbsp;iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);&nbsp;//将get到的查询变量分词分成 "我/&nbsp;&nbsp;爱/&nbsp;&nbsp;你们/&nbsp;的/&nbsp;&nbsp;格式"<br>&nbsp;<br>&nbsp;vector vecTerm;<br>&nbsp;iQuery.ParseQuery(vecTerm);&nbsp;&nbsp;//将以"/"划分开的关键字一一顺序放入一个向量容器中<br>&nbsp;<br>&nbsp;set setRelevantRst; <br>&nbsp;iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst); <br>&nbsp;<br>&nbsp;gettimeofday(&amp;end_tv,&amp;tz);<br>&nbsp;// search end<br>&nbsp;//搜索完毕按照顺序我们首先深入进iQuery对象的类CQuery&nbsp;&nbsp; </p>
<p>//Query.cpp</p>
<p>1、GetInputs</p>
<p>这个方法的功能是将前台get过来的变量转换到HtmlInputs结构体数组中如下例子和代码：</p>
<p>//假设前台查询的关键字是"1"着HtmlInputs中内容输出如下&nbsp; //HtmlInputs[0].Name word&nbsp; //HtmlInputs[0].Value 1&nbsp; //HtmlInputs[1].Name www&nbsp; //HtmlInputs[1].Value 搜索&nbsp; //HtmlInputs[2].Name cdtype&nbsp; //HtmlInputs[2].Value GB</p>
<p>&nbsp;<br>/* <br>&nbsp;* Get form information throught environment varible.<br>&nbsp;* return 0 if succeed, otherwise exit.<br>&nbsp;*/<br>/**<br>&nbsp;* 程序翻译说明<br>&nbsp;* 处理GET过来的表单<br>&nbsp;*<br>&nbsp;* @access&nbsp; public<br>&nbsp;* @return&nbsp; string 0<br>&nbsp;*/<br>int CQuery::GetInputs()<br>{<br>&nbsp;&nbsp;&nbsp; int i,j;<br>&nbsp;char *mode = getenv("REQUEST_METHOD");&nbsp;//返回环境变量的值 这里环境变量 REQUEST_METHOD 为 get 方法<br>&nbsp;&nbsp;&nbsp; char *tempstr;&nbsp;//GET变量字符串或POST字符串内容<br>&nbsp;char *in_line;&nbsp;<br>&nbsp;int length;&nbsp;&nbsp;//GET变量串长度或POST内容长度</p>
<p>&nbsp;cout &lt;&lt; "Content-type: text/html\n\n";<br>&nbsp;//cout &lt;&lt; "Cache-Control: no-cache\n";<br>&nbsp;//cout &lt;&lt; "Expires: Tue, 08 Apr 1997 17:20:00 GMT\n";<br>&nbsp;//cout &lt;&lt; "Expires: 0\n";<br>&nbsp;//cout &lt;&lt; "Pragma: no-cache\n\n";</p>
<p>&nbsp;cout &lt;&lt; "\n";<br>&nbsp;cout &lt;&lt; "\n";<br>&nbsp;//cout &lt;&lt; "\n";<br>&nbsp;//cout &lt;&lt; "\n";<br>&nbsp;//cout &lt;&lt; "\n";<br>&nbsp;cout &lt;&lt; "\n";<br>&nbsp;cout.flush();&nbsp;//释放输出缓冲区 输出头部head和之前的html标签内容<br>&nbsp;//cout &lt;&lt;"" &lt;&lt; endl;</p>
<p>&nbsp;if (mode==NULL) return 1;</p>
<p>&nbsp;if (strcmp(mode, "POST") == 0) <br>&nbsp;{<br>&nbsp;&nbsp;length = atoi(getenv("CONTENT_LENGTH"));&nbsp;//如果是POST方法着获得环境变量CONTENT_LENGTH的整型值<br>&nbsp;&nbsp;if (length==0 || length&gt;=256)<br>&nbsp;&nbsp;&nbsp;return 1;<br>&nbsp;&nbsp;in_line = (char*)malloc(length + 1);<br>&nbsp;&nbsp;read(STDIN_FILENO, in_line, length);<br>&nbsp;&nbsp;in_line[length]='\0';<br>&nbsp;} <br>&nbsp;else if (strcmp(mode, "GET") == 0) <br>&nbsp;{<br>&nbsp;&nbsp;char* inputstr = getenv("QUERY_STRING");&nbsp;//如果是GET方法着获得环境变量QUERY_STRING的字符串值<br>&nbsp;&nbsp;length = strlen(inputstr);<br>&nbsp;&nbsp;if (inputstr==0 || length&gt;=256)<br>&nbsp;&nbsp;&nbsp;return 1;</p>
<p>&nbsp;&nbsp;//获取get内容长度并把get ？后面的参数赋值给变量in_line<br>&nbsp;&nbsp;in_line = (char*)malloc(length + 1);<br>&nbsp;&nbsp;strcpy(in_line, inputstr);&nbsp;//小心溢出攻击<br>&nbsp;}</p>
<p><br>&nbsp;tempstr = (char*)malloc(length + 1);&nbsp;//获取post内容或get内容长度<br>&nbsp;if(tempstr == NULL)<br>&nbsp;{<br>&nbsp;&nbsp;printf("\n");<br>&nbsp;&nbsp;printf("\n");<br>&nbsp;&nbsp;printf("Major failure #1;please notify the webmaster\n");<br>&nbsp;&nbsp;printf("\n");<br>&nbsp;&nbsp;fflush(stdout);&nbsp;//输出缓冲区<br>&nbsp;&nbsp;exit(2);&nbsp;//错误返回<br>&nbsp;}</p>
<p>&nbsp;j=0;<br>&nbsp;for (i=0; i char<br>&nbsp;&nbsp;&nbsp;strcpy(HtmlInputs[HtmlInputCount].Name,tempstr);<br>&nbsp;&nbsp;&nbsp;if (i == length - 1)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(HtmlInputs[HtmlInputCount].Value,"");<br>&nbsp;&nbsp;&nbsp;&nbsp;HtmlInputCount++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;j=0;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else if ((in_line[i] == '&amp;') || (i==length-1))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if (i==length-1)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(in_line[i] == '+')tempstr[j]=' ';<br>&nbsp;&nbsp;&nbsp;&nbsp;else tempstr[j] = in_line[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;j++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;tempstr[j]='\0';<br>&nbsp;&nbsp;&nbsp;CStrFun::Translate(tempstr);&nbsp;//将URL编码形式的参数转换成字符型 %** -&gt; char<br>&nbsp;&nbsp;&nbsp;strcpy(HtmlInputs[HtmlInputCount].Value,tempstr);<br>&nbsp;&nbsp;&nbsp;HtmlInputCount++;<br>&nbsp;&nbsp;&nbsp;j=0;<br>&nbsp;&nbsp;} <br>&nbsp;&nbsp;else if (in_line[i] == '+') <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;tempstr[j]=' ';<br>&nbsp;&nbsp;&nbsp;j++;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;tempstr[j]=in_line[i];&nbsp;//组合get中的变量如word www cdtype<br>&nbsp;&nbsp;&nbsp;j++;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;//cout&lt;";<br>&nbsp;&nbsp;//cout&lt;";<br>&nbsp;&nbsp;//cout.flush();<br>&nbsp;}</p>
<p>&nbsp;/*<br>&nbsp;for (int kk = 0; kk &lt; HtmlInputCount ; ++kk )<br>&nbsp;{<br>&nbsp;&nbsp;cout&lt;&lt;"Name="&lt;";<br>&nbsp;&nbsp;cout&lt;&lt;"Value="&lt;";<br>&nbsp;}<br>&nbsp;//假设前台查询的关键字是"1"输出如下<br>&nbsp;//Name=word<br>&nbsp;//Value=1<br>&nbsp;//Name=www<br>&nbsp;//Value= 搜索<br>&nbsp;//Name=cdtype<br>&nbsp;//Value=GB<br>&nbsp;*/</p>
<p>&nbsp;if(in_line) free(in_line);<br>&nbsp;if(tempstr) free(tempstr);</p>
<p>&nbsp;return 0;<br>}<br>&nbsp;<br>2、SetQuery<br>&nbsp;<br>//Query.cpp<br>void CQuery::SetQuery()<br>{<br>&nbsp;string q = HtmlInputs[0].Value;<br>&nbsp;CStrFun::Str2Lower(q,q.size());&nbsp;//大写变小写<br>&nbsp;m_sQuery = q;&nbsp;&nbsp;//准备查询关键字<br>}<br>3、SetStart<br>void CQuery::SetQuery()<br>{<br>&nbsp;string q = HtmlInputs[0].Value;<br>&nbsp;CStrFun::Str2Lower(q,q.size());&nbsp;//大写变小写word变量里的值<br>&nbsp;m_sQuery = q;&nbsp;&nbsp;//设置查询关键字<br>}</p>
<p>4、GetInvLists<br>&nbsp;bool CQuery::GetInvLists(map&lt;string, string&gt; &amp;mapBuckets) const<br>{<br>&nbsp;ifstream ifsInvInfo(INF_INFO_NAME.c_str(), ios::binary); //以二进制形式打开一个文件的输入流缓冲，INF_INFO_NAME在头文件Comm.h中定义了的， const string INF_INFO_NAME("./Data/sun.iidx"); <br>&nbsp;//倒排索引文件索引字和文档好之间有一个制表符"\t"<br>&nbsp;//朱德&nbsp; 14383 16151 16151 16151 1683 207 6302 7889 8218 8218 8637<br>&nbsp;//朱古力&nbsp; 1085 1222<br>&nbsp;<br>&nbsp;if (!ifsInvInfo) {<br>&nbsp; cerr &lt;&lt; "Cannot open " &lt;&lt; INF_INFO_NAME &lt;&lt; " for input\n";<br>&nbsp; return false;<br>&nbsp;}<br>&nbsp;string strLine, strWord, strDocNum;<br>&nbsp;//以行读取输入流缓冲到字符串对象strLine中并做处理<br>&nbsp;while (getline(ifsInvInfo, strLine)) {<br>&nbsp; string::size_type idx;<br>&nbsp; string tmp;<br>&nbsp; idx = strLine.find("\t");<br>&nbsp; strWord = strLine.substr(0,idx);<br>&nbsp; strDocNum = strLine.substr(idx+1);<br>&nbsp; mapBuckets.insert(map&lt;string,string&gt;::value_type (strWord, strDocNum)); //倒排表二项二维表存入映射中<br>&nbsp; <br>&nbsp; /*<br>&nbsp; map&lt;string, string&gt;::iterator iter;<br>&nbsp; int kkk = 0;<br>&nbsp; for (iter = mapBuckets.begin(); kkk != 10; ++iter)<br>&nbsp; {<br>&nbsp;&nbsp; cout&lt;&lt;iter-&gt;first&lt;&lt;"&nbsp; "&lt;&lt;iter-&gt;second&lt;&lt;"&lt;br&gt;";<br>&nbsp;&nbsp; ++kkk;<br>&nbsp; }<br>&nbsp; cout.flush();<br>&nbsp; */<br>&nbsp;}<br>&nbsp;return true;<br>}<br>&nbsp;<br>5、GetDocIdx<br>&nbsp;<br>bool CQuery::GetDocIdx(vector &amp;vecDocIdx) const<br>{<br>&nbsp;ifstream ifs(DOC_IDX_NAME.c_str(), ios::binary);&nbsp;<br>&nbsp;//0&nbsp;&nbsp;0&nbsp;&nbsp;bc9ce846d7987c4534f53d423380ba70<br>&nbsp;//1&nbsp;&nbsp;76760&nbsp;4f47a3cad91f7d35f4bb6b2a638420e5<br>&nbsp;//2&nbsp;&nbsp;141624&nbsp;d019433008538f65329ae8e39b86026c</p>
<p>&nbsp;if (!ifs) { <br>&nbsp;&nbsp;cerr &lt;&lt; "Cannot open " &lt;&lt; DOC_IDX_NAME &lt;&lt; " for input\n";&nbsp;//以二进制形式打开一个文件的输入流缓冲，DOC_IDX_NAME在头文件Comm.h中定义了的， const string INF_INFO_NAME("./Data/Doc.idx");&nbsp;<br>&nbsp;&nbsp;return false; <br>&nbsp;} </p>
<p>&nbsp;string strLine, strDocid, strUrl; <br>&nbsp;while (getline(ifs,strLine)){<br>&nbsp;&nbsp;DocIdx di;</p>
<p>&nbsp;&nbsp;sscanf( strLine.c_str(), "%d%d", &amp;di.docid, &amp;di.offset );&nbsp;//只保留了前面两项文档号和偏移量<br>&nbsp;&nbsp;vecDocIdx.push_back(di);&nbsp;//导入结构体向量中<br>&nbsp;}</p>
<p>&nbsp;return true;<br>}</p>
<p><a href="http://blog.csdn.net/jrckkyy/archive/2008/05/29/2494113.aspx"></a>&nbsp;</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 22:52 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[1]寻找搜索引擎入口</title><link>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102939.html</link><dc:creator>学者站在巨人的肩膀上</dc:creator><author>学者站在巨人的肩膀上</author><pubDate>Thu, 10 Dec 2009 14:51:00 GMT</pubDate><guid>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102939.html</guid><wfw:comment>http://www.cppblog.com/jrckkyy/comments/102939.html</wfw:comment><comments>http://www.cppblog.com/jrckkyy/archive/2009/12/10/102939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jrckkyy/comments/commentRss/102939.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jrckkyy/services/trackbacks/102939.html</trackback:ping><description><![CDATA[<p>由于百度博客<a href="http://hi.baidu.com/jrckkyy">http://hi.baidu.com/jrckkyy</a>发表文章字数有限，以后原创文章全部都先发表到csdn和cu上，再发表到百度博客上，百度博客除了放原创的文章还主要放网上寻找到的优秀文章。</p>
<p>本着黑客精神我将陆续把最近分析注释TSE搜索引擎的心得发布出来，老鸟，大虾，大牛，高手飘过就是了，若愿意浪费指点下小弟的在下不甚感激，有问题的朋友直接留言讨论。由于本人水平有限，分析和翻译难免有错大家见笑了。</p>
<p>上学期拜读了James F.Kurose著的《计算机网络-自顶向下方法与internet特色(第三版阴影)》，觉得写得确实不错(希望没看的朋友一定要买来看看)，自己也来搞个高自顶向下的学习方法，先从用户看得到的东西出发分析研究搜索引擎，下面我们就来看看各大搜索引擎搜索界面的代码，你所需要特别注意的是form表单中的action</p>
<p>雅虎<a href="http://www.yohoo.com/">http://www.yohoo.com/</a>：</p>
<p>&lt;form name=s1 style="margin-bottom:0" action="<a href="http://search.yahoo.com/search">http://search.yahoo.com/search</a>"&gt;<br>&lt;table cellpadding=0 cellspacing=0 border=0&gt;&lt;tr&gt;&lt;td&gt;<br>&lt;input type=text size=30 name=p title="enter search terms here"&gt;&amp;nbsp;<br>&lt;input type=submit value=Search&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;font face=arial size=-2&gt;&#183;&amp;nbsp;<br>&lt;a href="<a href='http://search.yahoo.com/search/options?p=">advanced'>http://search.yahoo.com/search/options?p="&gt;advanced</a> search&lt;/a&gt;&lt;br&gt;&#183;&amp;nbsp;<br>&lt;a href="<a href="http://buzz.yahoo.com/%22%3Emost">http://buzz.yahoo.com/"&gt;most</a> popular&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/form&gt;<br>谷歌<a href="http://www.g.cn/">http://www.g.cn</a>：</p>
<p>&lt;form method=GET action=/search&gt;&lt;tr&gt;&lt;td nowrap&gt;<br>&lt;font size=-1&gt;&lt;input type=text name=q size=41 maxlength=2048 value="jrckkyy" title="Google 搜索"&gt; &lt;input type=submit name=btnG value="Google 搜索"&gt;&lt;input type=hidden name=complete value=1&gt;&lt;input type=hidden name=hl value="zh-CN"&gt;&lt;input type=hidden name=newwindow value=1&gt;&lt;input type=hidden name=sa value="2"&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/form&gt;<br>百度<a href="http://www.baidu.com/">http://www.baidu.com</a>：</p>
<p>&lt;form name=f2 action="/s"&gt;<br>&lt;tr valign="middle"&gt;<br>&lt;td nowrap&gt;<br>&lt;input type=hidden name=ct value="0"&gt;<br>&lt;input type=hidden name=ie value="gb2312"&gt;<br>&lt;input type=hidden name=bs value="jrckkyy"&gt;<br>&lt;input type=hidden name=sr&gt;<br>&lt;input type=hidden name=z value=""&gt;<br>&lt;input type=hidden name=cl value=3&gt;<br>&lt;input type=hidden name=f value=8&gt;<br>&lt;input name=wd size="35" class=i value="jrckkyy" maxlength=100&gt;<br>&lt;input type=submit value=百度一下&gt; &lt;input type=button value=结果中找 onclick="return bq(f2,1,0);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;<br>&lt;td nowrap&gt;&lt;a href="<a href="http://utility.baidu.com/quality/quality_form.php?word=jrckkyy">http://utility.baidu.com/quality/quality_form.php?word=jrckkyy</a>"&gt;与百度对话&lt;/a&gt;&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;/form&gt;<br>天网<a href="http://www.tianwang.com/">http://www.tianwang.com/</a>：</p>
<p>&lt;form name=f action="/cgi-bin/tw" method=get&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td valign=center width=634 background=images/index_image_02.gif&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table height=46 cellspacing=0 cellpadding=0 width=600 align=right&nbsp; border=0&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tbody&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td height=50&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table cellspacing=0 cellpadding=0 width=600 border=0&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tbody&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="524" height="30" valign="bottom"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div align="center"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="word" type="text" size="40" maxlength="255" onClick="this.focus();checkWord(this,1)" onblutesr='checkWord(this,0)' value='请输入资源名称'&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;font color=#ffffff&gt; &amp;nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;select onChange=reRange(this.selectedIndex) name=range&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script language=javascript&gt;...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i = 0; i &lt; rescode.length; i++) ...{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i == 0) ...{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.write('&lt;option value="0" selected&gt;' + rescode[i][0] + '&lt;/option&gt;');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else ...{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.write('&lt;option value="' + i + '"&gt;' + rescode[i][0] + '&lt;/option&gt;');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.f.range.selectedIndex = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/select&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/font&gt;-&lt;font color=#ffffff&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;select name=cd&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script language=javascript&gt;...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ind = document.f.range.selectedIndex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var len = (rescode[ind].length - 1) / 2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var sel = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i = 0; i &lt; len; i++) ...{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.write('&lt;option value="' + rescode[ind][2*i+1] + '"&gt;' + rescode[ind][2*i+2] + '&lt;/option&gt;');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rescode[ind][2*i+1] == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel = i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.f.cd.selectedIndex = sel;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/select&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/font&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="71" valign="bottom"&gt;&lt;input id=submit2 type=image height=22 width=40 src="images/so2.gif" align=absMiddle name=submit&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td colspan=3 height=25 class=style16&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div align=center&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tbody&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tbody&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br>测试服务器TSE：</p>
<p>&lt;form method="get" action="/cgi-bin/index/TSESearch" name="tw"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="100%" height="25" align="center"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="word" size="55"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" value=" 搜索" name="www"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="hidden" name="cdtype" value="GB"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;&nbsp;&nbsp;&nbsp; <br>由以上几个form的属性可以看出全部采用的是get方法，CGI做为处理程序，也就是C/C++，CGI全称是&#8220;公共网关界面&#8221;(Common Gateway Interface)，HTTP服务器与你的或其它机器上的程序进行&#8220;交谈&#8221;的一种工具，其程序须运行在网络服务器上。CGI逐渐被近几年来的PHP，JAVA，ASP，PERL，Python，Ruby等动态语言所取代。但是其在速度和运行效率上的优势是无法取代的。</p>
<p>以下是TSE CGI入口程序注释，其他搜索引擎的入口也应该类似</p>
<p>&nbsp;</p>
<p>/**//**<br>&nbsp;* 程序翻译说明<br>&nbsp;* @Copyright (c) 2008, 研发部<br>&nbsp;* All rights reserved.<br>&nbsp;*<br>&nbsp;* @filesource&nbsp; TSESearch.cpp<br>&nbsp;* @author&nbsp; jrckkyy &lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#114;&#99;&#107;&#107;&#121;&#121;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">jrckkyy@163.com</a>&gt;<br>&nbsp;*<br>&nbsp;* Let's start<br>&nbsp;*<br>&nbsp;*/<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;string.h&gt;<br>#include &lt;sys/types.h&gt;<br>#include &lt;sys/stat.h&gt;<br>#include &lt;fcntl.h&gt;<br>#include &lt;sys/time.h&gt;<br>#include &lt;unistd.h&gt;</p>
<p>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;list&gt;</p>
<p>#include "Comm.h"&nbsp;&nbsp;&nbsp; //包含2个索引和1个数据文件<br>#include "Query.h"&nbsp;&nbsp;&nbsp; //包含数据查询处理头文件<br>#include "Document.h"&nbsp;&nbsp;&nbsp; //html文档处理头文件<br>#include "StrFun.h"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //字符串处理头文件<br>#include "ChSeg/Dict.h"&nbsp;&nbsp;&nbsp; //字元字典处理头文件<br>#include "ChSeg/HzSeg.h"&nbsp;&nbsp;&nbsp; <br>#include "DisplayRst.h"&nbsp;&nbsp;&nbsp; //返回查询结果页面头文件，返回结果分为头部，中部，底部</p>
<p>using namespace std;</p>
<p>/**//*<br>&nbsp;* A inverted file(INF) includes a term-index file &amp; a inverted-lists file.<br>&nbsp;* A inverted-lists consists of many bucks(posting lists).<br>&nbsp;* The term-index file is stored at vecTerm, and<br>&nbsp;* the inverted-lists is sored at mapBuckets.<br>&nbsp;*/</p>
<p>/**//**<br>&nbsp;* 程序翻译说明<br>&nbsp;* 搜索程序入口前台关键字提交到该cgi程序 例如：./cgi-bin/index/TSESearch?word=123&amp;start=1<br>&nbsp;* 倒排文件包括一个记录检索词文件和一个倒排列表文件。<br>&nbsp;* 倒排列表包含很多标志（提交名单）。<br>&nbsp;* 记录检索词文件使用vecTerm来排序，和倒排列表是用mapBuckets来排序。<br>&nbsp;*<br>&nbsp;* @access&nbsp; public<br>&nbsp;* @param&nbsp;&nbsp; int char 参数的汉字说明 用于接收前台get传递的参数<br>&nbsp;* @return&nbsp; string 0<br>&nbsp;*/<br>int main(int argc, char* argv[])<br>...{<br>&nbsp;&nbsp;&nbsp; struct timeval begin_tv, end_tv;<br>&nbsp;&nbsp;&nbsp; struct timezone tz;</p>
<p>&nbsp;&nbsp;&nbsp; CDict iDict;<br>&nbsp;&nbsp;&nbsp; map&lt;string, string&gt; dictMap, mapBuckets;<br>&nbsp;&nbsp;&nbsp; vector&lt;DocIdx&gt; vecDocIdx;&nbsp;&nbsp;&nbsp; //Document。h</p>
<p>&nbsp;&nbsp;&nbsp; CQuery iQuery;<br>&nbsp;&nbsp;&nbsp; iQuery.GetInputs();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //具体程序开始执行<br>&nbsp;&nbsp;&nbsp; // current query &amp; result page number<br>&nbsp;&nbsp;&nbsp; iQuery.SetQuery();<br>&nbsp;&nbsp;&nbsp; iQuery.SetStart();</p>
<p>&nbsp;&nbsp;&nbsp; // begin to search<br>&nbsp;&nbsp;&nbsp; //开始具体搜索程序<br>&nbsp;&nbsp;&nbsp; gettimeofday(&amp;begin_tv,&amp;tz);&nbsp;&nbsp;&nbsp; //开始计时获取程序运行时间差</p>
<p>&nbsp;&nbsp;&nbsp; iQuery.GetInvLists(mapBuckets);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将所有字符集存入映射变量中&nbsp;&nbsp;&nbsp; 瓶颈所在<br>&nbsp;&nbsp;&nbsp; iQuery.GetDocIdx(vecDocIdx);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将倒排索引存入向量中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 瓶颈所在<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; CHzSeg iHzSeg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //include ChSeg/HzSeg.h<br>&nbsp;&nbsp;&nbsp; iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);&nbsp;&nbsp;&nbsp; //将get到的查询变量分词分成 "我/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 爱/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你们/&nbsp;&nbsp;&nbsp; 的/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式"<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; vector&lt;string&gt; vecTerm;<br>&nbsp;&nbsp;&nbsp; iQuery.ParseQuery(vecTerm);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将以"/"划分开的关键字一一顺序放入一个向量容器中<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; set&lt;string&gt; setRelevantRst; <br>&nbsp;&nbsp;&nbsp; iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst); <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; gettimeofday(&amp;end_tv,&amp;tz);<br>&nbsp;&nbsp;&nbsp; // search end<br>&nbsp;&nbsp;&nbsp; //搜索完毕</p>
<p>&nbsp;&nbsp;&nbsp; //下面开始显示<br>&nbsp;&nbsp;&nbsp; CDisplayRst iDisplayRst; <br>&nbsp;&nbsp;&nbsp; iDisplayRst.ShowTop(); </p>
<p>&nbsp;&nbsp;&nbsp; float used_msec = (end_tv.tv_sec-begin_tv.tv_sec)*1000 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +((float)(end_tv.tv_usec-begin_tv.tv_usec))/(float)1000; </p>
<p>&nbsp;&nbsp;&nbsp; iDisplayRst.ShowMiddle(iQuery.m_sQuery,used_msec, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRelevantRst.size(), iQuery.m_iStart);</p>
<p>&nbsp;&nbsp;&nbsp; iDisplayRst.ShowBelow(vecTerm,setRelevantRst,vecDocIdx,iQuery.m_iStart); </p>
<p>&nbsp;&nbsp;&nbsp; return 0;</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/jrckkyy/aggbug/102939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jrckkyy/" target="_blank">学者站在巨人的肩膀上</a> 2009-12-10 22:51 <a href="http://www.cppblog.com/jrckkyy/archive/2009/12/10/102939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>