本页二维码,扫一扫分享到朋友圈
朋友圈

Coreseek $sphinxapi设置实例和$result结构分析


阅读234 评论0 赞 28返回首页    go 编程与技术  go 其它


   Yii::import('ext.SphinxClient'); 

        $sphinxapi = new SphinxClient(); 

        $sphinxapi->SetServer('127.0.0.1', 9313); 

        $sphinxapi->SetConnectTimeout(3); 

        $sphinxapi->SetMatchMode(SPH_MATCH_BOOLEAN); 

        $sphinxapi->SetFilter('shop_area_id',$saId,false);       

        $sphinxapi->SetArrayResult(true); 

        $sphinxapi->SetGroupBy('shop_site_type', SPH_GROUPBY_ATTR,"@count desc"); 

        $sphinxapi->SetLimits(0, 9999, 10000); 

        $result = $sphinxapi->Query('', 'main;delta'); 

        unset($sphinxapi); 

 

下面是详细说明: 

        //引用/protected/extensions/SphinxClient.php 

        Yii::import('ext.SphinxClient');                          

        $sphinxapi = new SphinxClient();    

         

        // 设置searchd的主机名和TCP端口 。此后的所有请求都使用新的主机和端口设置。默认的主机和端口分别是“localhost”和9312 

        $sphinxapi->SetServer('127.0.0.1', 9313); 

         

        // 设置连接超时时间 ,在与服务器连接时,如果超过这个时间没有连上就放弃; 

        //有了这个选项,就给客户端应用程序提供了一定的控制权,让它可以决定当searchd不可用的时候如何处理,而且可以避免脚本由于超过运行限制而运行失败(尤其是在PHP里) 

        $sphinxapi->SetConnectTimeout(3);   

                                          

        // 设置全文查询的匹配模式 ,见第 5.1 节 “匹配模式”中的描述。参数必须是一个与某个已知模式对应的常数。   

        /* 

        SPH_MATCH_ALL, 匹配所有查询词(默认模式); 

        SPH_MATCH_ANY, 匹配查询词中的任意一个; 

        SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配; 

        SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式 (参见 第 5.2 节 “布尔查询语法”);如:( cat -dog ) | ( cat -mouse) 使用了 AND OR NOT GROUP特殊运算符 

        SPH_MATCH_EXTENDED, 将查询看作一个CoreSeek/Sphinx内部查询语言的表达式 (参见 第 5.3 节 “扩展查询语法”). 从版本Coreseek 3/Sphinx 0.9.9开始, 这个选项被选项SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容——这样即使Sphinx及其组件包括API升级的时候,旧的应用程序代码还能够继续工作。 

        SPH_MATCH_EXTENDED2, 使用第二版的“扩展匹配模式”对查询进行匹配. 

        SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生. 

        */ 

        $sphinxapi->SetMatchMode(SPH_MATCH_BOOLEAN);     

        

        /* 

         function SetFilter ( $attribute, $values, $exclude=false )

    增加整数值过滤器。

    此调用在已有的过滤器列表中添加新的过滤器。 $attribute 是属性名。 $values 是整数数组。 $exclude 是布尔        值,它控制是接受匹配的文档(默认模式,即 $exclude 为false时)还是拒绝它们。

        只有当索引中 $attribute 列的值与 $values 中的任一值匹配时文档才会被匹配

    (或者拒绝,如果 $exclude 值为true)

        */   

         $sphinxapi->SetFilter('shop_area_id',$saId,false); 

        /* 

        PHP专用。 控制搜索结果集的返回格式 (匹配项按数组返回还是按hash返回) 

        参数应为布尔型。 

        如果$arrayresult为false(默认),匹配项以PHP hash格式返回,文档ID为键,其他信息(权重、属性)为值。 

        如果$arrayresult为true,匹配项以普通数组返回,包括匹配项的全部信息(包含文档ID)。 

        这个调用是对MVA属性引入分组支持时同时引入的。对MVA分组的结果可能包含重复的文档ID。因此需要将他们按普通数组返回,因为hash对每个文档ID仅能保存一个记录。 

        */ 

        $sphinxapi->SetArrayResult(true);                    

         

        /* 

        设置进行分组的属性、函数和组间排序模式,并启用分组 

        $attribute是字符串,为进行分组的属性名。 

        $func为常数,它指定内建函数,该函数以前面所述的分组属性的值为输入, 

                        目前的可选的值为: SPH_GROUPBY_DAY、SPH_GROUPBY_WEEK、 SPH_GROUPBY_MONTH、 SPH_GROUPBY_YEAR、SPH_GROUPBY_ATTR 。 

        $groupsort 是控制分组如何排序的子句。 

         

        SELECT ... GROUP BY $func($attribute) ORDER BY $groupsort 

        */ 

        $sphinxapi->SetGroupBy('shop_site_type', SPH_GROUPBY_ATTR,"@count desc");   

         

        /* 

         function SetLimits ( $offset, $limit, $max_matches=0, $cutoff=0 ) 

        给服务器端结果集设置一个偏移量($offset)和从那个偏移量起向客户端返回的匹配项数目限制($limit)。 

        并且可以在服务器端设定当前查询的结果集大小($max_matches),另有一个阈值($cutoff),当找到的匹配项达到这个阀值时就停止搜索。全部这些参数都必须是非负整数。 

          

         前两个参数的行为与MySQL LIMIT子句中参数的行为相同。他们令searchd从编号为$offset的匹配项开始返回最多$limit个匹配项。 

         偏移量($offset)和结果数限制($limit)的默认值分别是0和20,即返回前20个匹配项。 

         

        max_matches这个设置控制搜索过程中searchd在内存中所保持的匹配项数目。 

        一般来说,即使设置了max_matches为1,全部的匹配文档也都会被处理、评分、过滤和排序。 

        但是任一时刻只有最优的N个文档会被存储在内存中,这是为了性能和内存使用方面的原因,这个设置正是控制这个N的大小。 

         

        注意,max_matches在两个地方设置。针对单个查询的限制由这个API调用指定。 

        但还有一个针对整个服务器的限制,那是由配置文件中的max_matches设置控制的。 

        为防止滥用内存,服务器不允许单个查询的限制高于服务器的限制。 

        在客户端不可能收到超过max_matches个匹配项。 

        默认的限制是1000,您应该不会遇到需要设置得更高的情况。 

        1000个记录足够向最终用户展示了。 

         

        如果您是想将结果传输给应用程序以便做进一步排序或过滤,那么请注意,在Sphinx端完成效率要高得多。 

         

        $cutoff设置是为高级性能优化而提供的。它告诉searchd 在找到并处理$cutoff个匹配后就强制停止。 

        */ 

        $sphinxapi->SetLimits(0, 9999, 10000);      

        /* 

        function Query ( $query, $index="*", $comment="" ) 

        连接到searchd服务器,根据服务器的当前设置执行给定的查询,取得并返回结果集。 

         

        $query是查询字串 

        $index是包含一个或多个索引名的字符串。 

         

        一旦发生一般错误,则返回假并设置GetLastError()信息。 

        若成功则返回搜索的结果集。 

         

        此外, $comment 将被发送到查询日志中搜索部分的前面,这对于调试是非常有用的。目前,注释的长度限制为128个字符以内。 

         

        $index的默认值是"*",意思是对全部本地索引做查询。 

        索引名中允许的字符包括拉丁字母(a-z),数字(0-9),减号(-)和下划线(_),其他字符均视为分隔符。 

         

        给出多个索引时索引的顺序是有意义的。如果同一个文档ID的文档在多个索引中找到, 

        那么权值和属性值会取最后一个索引中所存储的作为该文档ID的权值和属性值,用于排序、过滤,并返回给客户端 

        */ 

        $result = $sphinxapi->Query('', 'main;delta');          

        unset($sphinxapi);       


分析Sphinx返回的 $result=array(9)


[" error "]=> 

  string(0) "" 

  

[" warning "]=> 

  string(0) "" 

  

[" status "]=> 

  int(0) 

  


 [" fields "]=> 

  array(2) { 

    [0]=> 

    string(9) "shop_name" 

    [1]=> 

    string(13) "shop_products" 

} 


 [" attrs "]=> 

  array(8) { 

    ["shop_launch_time"]=> 

    int(2) 

    ["shop_area_id"]=> 

    int(1) 

    ["is_bad_url"]=> 

    int(1) 

    ["shop_type_id"]=> 

    int(1) 

    ["shop_site_type"]=> 

    int(1) 

    ["shop_owner_type"]=> 

    int(1) 

    ["@groupby"]=> 

    int(1) 

    ["@count"]=> 

    int(1) 

  } 


[" total "]=> 

  string(2) "19" 

  

[" total_found "]=> 

  string(2) "19" 

  

total表示客户端实际可以读取的结果数目,而total_found仅表示服务器端存在多少匹配的文档(永远不会比total小) 

[" time "]=> 

  string(5) "0.011" 

} 


一个hash表,存储文档ID以及其对应的另一个包含文档权重和属性值的hash表 

(或者,如果启用了SetArrayResult()则返回数组)。

     

[" matches "]=> 

  array(19) { 

    [0]=> 

    array(3) { 

      ["id"]=> 

      int(1345609) 

      ["weight"]=> 

      string(1) "1" 

      ["attrs"]=> 

      array(8) { 

        ["shop_launch_time"]=> 

        int(0) 

        ["shop_area_id"]=> 

        int(3) 

        ["is_bad_url"]= > 

        int(0) 

        ["shop_type_id"]=> 

        int(13) 

        ["shop_site_type"]=> 

        int(27) 

        ["shop_owner_type"]=> 

        int(2) 

        ["@groupby"]=> 

        int(27) 

        ["@count"]=> 

        int(273) 

      } 

    } 

    [1]=> 

    array(3) { 

      ["id"]=> 

      int(1345033) 

      ["weight"]=> 

      string(1) "1" 

      ["attrs"]=> 

      array(8) { 

        ["shop_launch_time"]=> 

 揭开正则表达式的神秘面纱

  下一篇:go sphinx下的max_matches取值对SetLimits的影响


评论


用QQ登录管理/创建网站 用微博登录管理/创建网站   发布于:04-24