关闭

sphinx xmlpipe2数据源配置

标签: sphinx
528人阅读 评论(0) 收藏 举报
分类:

首先是一个工具类SphinxXMLFeed用于将数据写入xml:

此处是采用了hash 算法将数据写入10个xml,你可以根据自己需求改动,如果数据量不大只写入一个也行,只需写死文件名。

class SphinxXMLFeed extends XMLWriter
{
private $fields = array();
private $attributes = array();
public static $dir = “/var/log/”;
public function __construct($options = array())
{
$defaults = array(
‘indent’ => false,
);
$options = array_merge($defaults, $options);

// Store the xml tree in memory
$this->openMemory();

if($options[‘indent’]) {
$this->setIndent(true);
}
}

public function setFields($fields) {
$this->fields = $fields;
}

public function setAttributes($attributes) {
$this->attributes = $attributes;
}

public function addDocument($doc,$uid) {
$this->startElement(‘sphinx:document’);
$this->writeAttribute(‘id’, $doc[‘id’]);

foreach($doc as $key => $value) {
// Skip the id key since that is an element attribute
if($key == ‘id’) continue;

$this->startElement($key);
$this->text($value);
$this->endElement();
}

$this->endElement();
$this->save($this->outputMemory(),$uid);
}

public function beginOutput($uid) {

$this->startDocument(‘1.0′, ‘UTF-8′);
$this->startElement(‘sphinx:docset’);
$this->startElement(‘sphinx:schema’);

// add fields to the schema
foreach($this->fields as $field) {
$this->startElement(‘sphinx:field’);
$this->writeAttribute(‘name’, $field);
$this->endElement();
}

// add attributes to the schema
foreach($this->attributes as $attributes) {
$this->startElement(‘sphinx:attr’);
foreach($attributes as $key => $value) {
$this->writeAttribute($key, $value);
}
$this->endElement();
}

// end sphinx:schema
$this->endElement();
$this->save_first($this->outputMemory(),$uid);
}

public function endOutput($uid)
{
// end sphinx:docset
$this->endElement();
$this->save($this->outputMemory(),$uid);
}

public function save($data,$uid){
chmod(dirname(__FILE__), 0777); // 以最高操作权限操作当前目录
// 打开b.php文件,这里采用的是a+,也可以用a,a+为可读可写,a为只写,如果b.php不能存在则会创建它
$file = fopen(self::$dir.self::gethash($uid).”xml”, ‘a+’); //a模式就是一种追加模式,如果是w模式则会删除之前的内容再添加
// 获取需要写入的内容
// 写入追加的内容
fwrite($file, $data);
// 关闭b.php文件
fclose($file);
// 销毁文件资源句柄变量
unset($file);
}

public function save_first($data,$uid){
chmod(dirname(__FILE__), 0777); // 以最高操作权限操作当前目录
// 打开b.php文件,这里采用的是a+,也可以用a,a+为可读可写,a为只写,如果b.php不能存在则会创建它
$file = fopen(self::$dir.self::gethash($uid).”xml”, ‘w+’); //a模式就是一种追加模式,如果是w模式则会删除之前的内容再添加
// 获取需要写入的内容
// 写入追加的内容
fwrite($file, $data);
// 关闭b.php文件
fclose($file);
// 销毁文件资源句柄变量
unset($file);
}

public static function gethash($uid){
$count = 10;
$d =intval(base_convert(substr(md5($uid), 0, 5),16, 10)) %$count;
return “t_user”.’_’.$d;
}

 

 

然后是工具类的调用

 

$doc = new SphinxXMLFeed();
 
//配置sphinxfields字段 用于查询时过滤使用
$doc->setFields(array(
  'title',
  'teaser',
  'content',
));
 
//配置sphinx 的attr字段,搜索会返回该字段,这里q支持string的,大家可以试试
$doc->setAttributes(array(
  array('name' => 'blog_id', 'type' => 'int', 'bits' => '16', 'default' => '0'),
));
 
//以上2个配置必须在调用该方法之前,不在这里配置也行也可以在sphinx的配置文件里配置
//输出xml开头部分
$doc->beginOutput();  

//这里应该是从数据库取出的数据,为了方便我这里直接随机生成了1000条记录 foreach(range(1, 1000) as $id) { $doc->addDocument(array( 'id' => $id, 'blog_id' => rand(1, 10), 'title' => "Article Part {$id}", 'teaser' => "Article {$id} teaster", 'content' => "Article {$id} content", )); }   
//输出xml结尾部分
$doc->endOutput();

//最后是如何在sphinx里调用该 xml文件,

//大家上面看我保存的路径是/var/log/…(我这是Linux系统)

 

source xml_blog_posts
{
    type = xmlpipe
    xmlpipe_command = cat /var/log/你保存的文件名.xml
}

其他配置这里就不赘述了,相信大家也知道了。谢谢


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32908次
    • 积分:686
    • 等级:
    • 排名:千里之外
    • 原创:76篇
    • 转载:8篇
    • 译文:0篇
    • 评论:0条
    文章分类