这是半年前没有对外写的文章,现在拿出来分享下。可能会有一些不正确或不严谨的地方,某些语言可能比较轻浮,请见谅。
以上一篇的email数据表为例:
数据结构:
CREATE TABLE email ( emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '邮件id', fromid int(10) unsigned NOT NULL default '0' COMMENT '发送人ID', toid int(10) unsigned NOT NULL default '0' COMMENT '收件人ID', content text unsigned NOT NULL COMMENT '邮件内容', subject varchar(100) unsigned NOT NULL COMMENT '邮件标题', sendtime int(10) NOT NULL COMMENT '发送时间', attachment varchar(100) NOT NULL COMMENT '附件ID,以逗号分割', PRIMARY KEY (emailid), ) ENGINE=MyISAM';
$sphinx = new SphinxClient(); //sphinx的主机名和端口 $sphinx->SetServer ( 'loclahost', 9312 ); //设置返回结果集为php数组格式 $sphinx->SetArrayResult ( true ); //匹配结果的偏移量,参数的意义依次为:起始位置,返回结果条数,最大匹配条数 $sphinx->SetLimits(0, 20, 1000); //最大搜索时间 $sphinx->SetMaxQueryTime(10); //执行简单的搜索,这个搜索将会查询所有字段的信息,要查询指定的字段请继续看下文 $index = 'email' //索引源是配置文件中的 index 类,如果有多个索引源可使用,号隔开:'email,diary' 或者使用'*'号代表全部索引源 $result = $sphinx->query ('搜索关键字', $index); echo '
'; print_r($result); echo '
//emailid的范围 $sphinx->SetIdRange($min, $max); //属性过滤,可过滤的属性必需在配置文件中设置sql_attr_ ,之前我们定义了这些 sql_attr_uint = fromid sql_attr_uint = toid sql_attr_timestamp = sendtime //如果你想再次修改这些属性,配置完成后记得重新建立索引才能生效 //指定一些值 $sphinx->SetFilter('fromid', array(1,2)); //fromid的值只能是1或者2 //和以上条件相反,可增加第三个参数 $sphinx->SetFilter('fromid', array(1,2), false); //fromid的值不能是1或者2 //指定一个值的范围 $sphinx->SetFilterRange('toid', 5, 200); //toid的值在5-200之间 //和以上条件相反,可增加第三个参数 $sphinx->SetFilterRange('toid', 5, 200, false); //toid的值在5-200以外 //执行搜索 $result = $sphinx->query('关键字', '*');
//使用属性排序 //以fromid倒序排序,注意当再次使用SetSortMode会覆盖上一个排序 $sphinx->SetSortMode ( "SPH_SORT_ATTR_DESC", 'fromid'); //如果要使用多个字段排序可使用SPH_SORT_EXTENDED模式 //@id是sphinx内置关键字,这里指emailid,至于为什么是emailid,自己思考一下 $sphinx->SetSortMode ( "SPH_SORT_ATTR_DESC", 'fromid ASC, toid DESC, @id DESC'); //执行搜索 $result = $sphinx->query('关键字', '*');
//设置扩展匹配模式 $sphinx->SetMatchMode ( "SPH_MATCH_EXTENDED2" ); //查询中使用条件语句,字段用@开头,搜索内容包含测试,toid等于1的邮件: $result = $sphinx->query('@content (测试) & @toid =1', '*'); //用括号和&(与)、|、(或者)、-(非,即!=)设置更复杂的条件 $result = $sphinx->query('(@content (测试) & @subject =呃) | (@fromid -(100))', '*'); //更多语法请查看官方文档匹配模式的说明
//大于等于某一时间截$time $sphinx->SetFilterRange('sendtime', $time, 10000000000) //时间截最大是10个9,再加1是不可超越了。。 //大于某一时间截$time $sphinx->SetFilterRange('sendtime', $time+1, 10000000000) //小于等于某一时间截$time $sphinx->SetFilterRange('sendtime', -1, $time) //时间截最小是0,所以应该减1 //大于某一时间截$time $sphinx->SetFilterRange('sendtime', -1, $time - 1)
//设置完成记得重新建立索引 然后PHP中可以使用SetFilter() //搜索包含附件ID为1或2邮件,mysql语法是这样FIND_IN_SET(`attachment`, '1,2') $sphinx->SetFilter('attachment', array(1,2)) //可以使用SetFilterRange,搜索包含附件ID在50-100范围的邮件 $sphinx->SetFilterRange('attachment', 50, 100)