很久以前就听说过“竞价排名”,今天基于TSE也写了一个自己理解的竞价排名雏形,满有意思的。
现在必须手动加入排名靠前的url。
要在CQuery模块中加入一个方法
1 bool CQuery::Get_url_weight(set<string>& weight_set) const { 2 ifstream ifs(Url_Weight_NAME.c_str(), ios::binary); 3 if (!ifs) { 4 cerr << "Cannot open " << Url_Weight_NAME << " for input\n"; 5 return false; 6 } 7 string strLine, strDocid, strUrl; 8 while (getline(ifs, strLine)) { 9 string fst; 10 int idx = strLine.find("\t"); 11 fst=strLine.substr(0,idx); 12 weight_set.insert(fst); 13 } 14 return true; 15 }
在TseSearch.cpp获取相关url集合后,加入下边这段代码,还有一些定义没有写出来,这个很容易搞定,就不贴出来了。
1 //url-->weight 2 set<string> weight_set,final_weight_set,tmp; 3 final_weight_set.clear(); 4 tmp.clear(); 5 iQuery.Get_url_weight(weight_set); 6 set_intersection (weight_set.begin(),weight_set.end(), 7 setRelevantRst.begin(),setRelevantRst.end(), 8 inserter(final_weight_set, final_weight_set.begin())); 9 10 set_difference (setRelevantRst.begin(),setRelevantRst.end(), 11 weight_set.begin(),weight_set.end(), 12 inserter(tmp, tmp.begin())); 13 setRelevantRst.clear(); 14 setRelevantRst=tmp; 15 /////////////
还有最后调用ShowBelow的时候,ShowBelow这个函数也要修改,我是加了一个参数
iDisplayRst.ShowBelow(vecTerm,setRelevantRst,final_weight_set,vecDocIdx,iQuery.m_iStart);
先对“竞价的”(final_weight_set)的输出,再对其他的(setRelevantRst)输出
很容易实现的,我是直接把循环的代码复制一遍得到的,代码就不贴啦。
吐槽一下,STL的algorithm真尼玛不好用。