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

来源:互联网 发布:http借口怎么写java 编辑:程序博客网 时间:2024/05/21 19:34
        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"]=>
        int(0)
        ["shop_area_id"]=>
        int(1)
        ["is_bad_url"]=>
        int(0)
        ["shop_type_id"]=>
        int(17)
        ["shop_site_type"]=>
        int(26)
        ["shop_owner_type"]=>
        int(2)
        ["@groupby"]=>
        int(26)
        ["@count"]=>
        int(469)
      }
    }

!!!!
设置过分组后,$result['matches']数组的长度为 组 的个数(前提是 SetLimits 的限制大于总组数
而且每一个元素只显示 各个组内的 一条代表性记录,而不是 @count 个记录!
原创粉丝点击