使用xunsearch实现按docid排序

由于项目需要,在使用xunsearch中需要按docid排序
但看了xunsearch文档api,只找到setDocOrder这个接口
但它并不能真正按docid排序,它还是按权重排序的,同权重的再按docid排序。
研究了一下xapian文章,下面是它关于按date排序的介绍
If you want to offer a "sort by date" feature, and can arrange for documents to be indexed in date order (or a close-enough approximation), then you can implement a very efficient "sort by date" feature by using a boolean search (i.e. call enquire.set_weighting_scheme(Xapian::BoolWeight());) with enquire.set_docid_order(Xapian::Enquire::DESCENDING); (for newest first) or enquire.set_docid_order(Xapian::Enquire::ASCENDING); (for oldest first). There's no inherent reason why this technique can't be used for sorting by something other than date, but it's usually much easier to arrange for new documents to arrive in date order than in other orders.
所以按docid排序是可以实现的,而且效率比按date要好
要实现真正按docid排序,只能去修改xunsearch的源码了
下载xunsearch后 ,解压软件
tar -xjf xunsearch-full-dev.tar.bz2
cd xunsearch-full-dev
cd packages
然后解压 xunsearch-1.4.10-dev.tar.bz2 这个包
tar -xjf xunsearch-1.4.10-dev.tar.bz2
然后修改里面的task.cc文件
找到这段
if (type == CMD_SORT_TYPE_DOCID) {
zarg->eq->set_docid_order(reverse ? Xapian::Enquire::DESCENDING : Xapian::Enquire::ASCENDING);
}
在下面添加
elseif (type == CMD_SORT_TYPE_DOC_ID) {
zarg->eq->set_weighting_scheme(Xapian::BoolWeight());
zarg->eq->set_docid_order(reverse ? Xapian::Enquire::DESCENDING : Xapian::Enquire::ASCENDING);
}
然后打开xs_cmd.h 添加 #define CMD_SORT_TYPE_DOC_ID 6
保存之后,打包命令tar jcvf xunsearch-1.4.10-dev.tar.bz2 xunsearch-1.4.10-dev/
然后安装xunsearch
下面修改sdk中的XS.php
添加
define('XS_CMD_SORT_TYPE_DOC_ID', 6);

然后给XSSearch添加函数
public function setIdOrder($asc = false)
{
$type = XS_CMD_SORT_TYPE_DOC_ID | ($asc ? XS_CMD_SORT_FLAG_ASCENDING : 0);
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT, $type);
$this->execCommand($cmd);
return $this;
}
搜索的时候调用setIdOrder()就可以了

猜你喜欢

转载自strayly.iteye.com/blog/2308300