大家都知道sphinx是一个全文索引程序,它的高速查询能力也是有目共睹的。除了这些,我们是否还能挖掘点别的功能出来呢?不如作为一个简单的缓存服务器。 先来了解下sphinx的使用的文件,sphinx使用的文件包括 .sph, .spa, .spi, .spd, .spp, .spm ,.spl
大家都知道sphinx是一个全文索引程序,它的高速查询能力也是有目共睹的。除了这些,我们是否还能挖掘点别的功能出来呢?不如作为一个简单的缓存服务器。
先来了解下sphinx的使用的文件,sphinx使用的文件包括 .sph, .spa, .spi, .spd, .spp, .spm ,.spl。
- sph:头文件,保存的是系统的配置文件。
- spi:保存wordid及指向此wordid对应的文档信息在spd文件的指针, spi文件在检索程序启动时完全加载入内存。 spi文件是分块的,块内排序,块之间也排序。分块的目的应该是为了快速检索到wordid, 因为spi中的wordid是变长压缩的,索引需要先在块级别做二分定位,再在快内解压缩查找。
- spa:存储docinfo的文件,检索程序启动时会把此文件加载如内存,sphinx可以指定docinfo的存储方式:
- inline:存储到spd文件中。
- extern:单独存储,就会生成spa文件。
- spd:文档列表。
- spp:关键字所在位置列表。
- spm:在docinfo中,有一种特殊的属性,叫mva,多值属性。 sphinx对此属性特殊处理,需要存储在spm文件中。 检索程序启动时会把此文件加载如内存。 此属性在docinfo对应位置存储其在此文件中的字节偏移量。
- spk:killlist
- spl:索引锁
通过介绍可以得知sphinx存储的文档的属性,在0.98之前的版本是不存储的,我们是不是可以利用这些数据作为缓存使用呢,根据docid获取文档的信息。
通过hack搜索服务添加searchd_command_docinfo指令,客户端api添加getdocinfo函数可以达到预期的效果。
php示例代码:
require 'sphinxapi.php'; $cl = new sphinxclient (); $cl->setserver(); $res = $cl->getdocinfo(1, 'singer'); print_r($res);
结果如下:
array ( [singer_id] => 1 [singer_name] => 阿牛 [cate_id] => 1 [tag_ids] => array ( [0] => 110 [1] => 114 [2] => 127 ) [song_number] => 137 [album_number] => 14 )
patch文件 : https://gist.github.com/2251422
参考文章
- sphinx简析
- sphinx的spx文件格式
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!