Coreseek $sphinxapi設置實例和$result結構分析

        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 個記錄!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章