1. 程式人生 > >PHP+Mysql+Sphinx高效的站內搜尋引擎一

PHP+Mysql+Sphinx高效的站內搜尋引擎一

PHP+Mysql+Sphinx高效的站內搜尋引擎搭建詳見https://jingyan.baidu.com/article/95c9d20d9a7176ec4e756119.html
sphinx呼叫API參考(官方手冊)

6.1. 通用API方法
6.1.1. GetLastError (錯誤資訊)
原型: function GetLastError()

以可讀形式返回最近的錯誤描述資訊。如果前一次API呼叫沒有錯誤,返回空字串。

任何其他函式(如 Query())失敗後(函式失敗一般返回false),都應該呼叫這個函式,它將返回錯誤的描述。

此函式本身並不重置對錯誤描述,因此如有必要,可以多次呼叫。

6.1.2. GetLastWarning (告警資訊)
原型: function GetLastWarning ()

以可讀格式返回最近的警告描述資訊。如果前一次API呼叫沒有警告,返回空字串。

您應該呼叫這個函式來確認您的請求(如 Query())是否雖然完成了但產生了警告。例如,即使幾個遠端代理超時了,對分散式索引的搜尋查詢也可能成功完成。這時會產生一個警告資訊。

此函式本身不會重置警告資訊,因此如有必要,可以多次呼叫。

6.1.3. SetServer (設定搜尋服務)
原型: function SetServer ( $host, $port )

設定searchd的主機名和TCP埠。此後的所有請求都使用新的主機和埠設定。預設的主機和埠分別是“localhost”和9312。

6.1.4. SetRetries (設定失敗重試)
原型: function SetRetries ( $count, $delay=0 )

設定分散式搜尋重試的次數和延遲時間。

對於暫時的失敗,searchd對每個代理重試至多$count次。$delay是兩次重試之間延遲的時間,以毫秒為單位。預設情況下,重試是禁止的。注意,這個呼叫不會使API本身對暫時失敗進行重試,它只是讓searchd這樣做。目前暫時失敗包括connect()呼叫的各種失敗和遠端代理超過最大連線數(過於繁忙)的情況。

6.1.5. SetConnectTimeout (設定超時時間)
原型: function SetConnectTimeout ( $timeout )

設定連線超時時間,在與伺服器連線時,如果超過這個時間沒有連上就放棄。

有時候伺服器在響應上會有所延遲,這有可能由於網路的延時,也有可能是因為伺服器未處理完的查詢太多,堆積所致。不管是什麼情況,有了這個選項,就給客戶端應用程式提供了一定的控制權,讓它可以決定當searchd不可用的時候如何處理,而且可以避免指令碼由於超過執行限制而執行失敗(尤其是在PHP裡)

當連線失敗的而時候,會將合適的錯誤碼返回給應用程式,以便在應用程式級別進行錯誤處理和通知使用者。

6.1.6. SetArrayResult (設定結果返回格式)
原型: function SetArrayResult ( $arrayresult )

PHP專用。控制搜尋結果集的返回格式(匹配項按陣列返回還是按hash返回)

$arrayresult 引數應為布林型。如果$arrayresult為false(預設),匹配項以PHP hash格式返回,文件ID為鍵,其他資訊(權重、屬性)為值。如果$arrayresult為true,匹配項以普通陣列返回,包括匹配項的全部資訊(含文件ID)

這個呼叫是對MVA屬性引入分組支援時同時引入的。對MVA分組的結果可能包含重複的文件ID。因此需要將他們按普通陣列返回,因為hash對每個文件ID僅能儲存一個記錄。

6.1.7. IsConnectError (檢查連結錯誤)
原型: function IsConnectError ()

檢查上一個錯誤是API層面的網路錯誤還是searchd返回的遠端錯誤。如果是上一次連線searchd的嘗試在API層面失敗了,返回真,否則返回假(錯誤發生在遠端,或者根本沒有嘗試連線)。 這是在版本0.9.9-rc1引入的。

6.2. 通用搜索設定
6.2.1. SetLimits (設定結果集偏移量)
原型: 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個匹配後就強制停止。

6.2.2. SetMaxQueryTime (設定最大搜索時間)
原型: function SetMaxQueryTime ( $max_query_time )

設定最大搜索時間,以毫秒為單位。引數必須是非負整數。預設值為0,意思是不做限制。

這個設定與SetLimits()中的$cutoff相似,不過這個設定限制的是查詢時間,而不是處理的匹配數目。一旦處理時間已經太久,本地搜尋查詢會被停止。注意,如果一個搜尋查詢了多個本地索引,那這個限制獨立地作用於這幾個索引。

6.2.3. SetOverride (設定臨時屬性值覆蓋)
原型: function SetOverride ( $attrname, $attrtype, $values )

設定一個臨時的(只對單個查詢有效)針對不同文件的屬性值覆蓋。只支援標量屬性。$value是一個雜湊表,他的鍵是要覆蓋屬性的文件ID,之是對應該文件ID的要覆蓋的值。 於版本0.9.9-rc1引入。

屬性覆蓋特性使使用者可以針對一次查詢“臨時性地”修改一些文件的值,不影響其他查詢。這個函式可以用來進行資料個性化。例如,假設正在實現一個個性化搜尋函式,用來將朋友推薦的帖子排在前面,這類資料不僅是動態的,而且是個性化的,因此不能簡單地把這種資料放入索引,因為不能影響其他使用者的搜尋。而覆蓋機制是針對單個查詢的,不會影響其他人。因此可以,比如說,給每個文件設定一個“friends_weight”屬性,預設值是0,然後臨時將文件123,456,789(當前使用者的朋友推薦的)的這個屬性設定為1,最後用這個值進行相關度計算。

6.2.4. SetSelect (設定返回資訊的內容)
原型: function SetSelect ( $clause )

設定select子句,列出具體要取出的屬性以及要計算並取出的expressions。子句的語法模仿了SQL。於版本0.9.9-rc1引入。

SetSelect()於標準SQL查詢中SELECT和FROM之間的部分非常相近。它允許你指定要取出哪些屬性(列),以及在這些列上要計算和取出哪些表示式。與SQL語言的區別是,表示式必須用關鍵字AS給每個表示式取一個別名,別名必須是有效的識別符號(由字母和數字組成)。在SQL裡面可以這樣做,但是不是強制的。Sphinx強制必須有別名,以便計算結果總是可以以一個“正常”的名字在結果集中返回,或者在其他子句中引用,等等。

其他方面基本上等同於SQL。支援星號(“*”),支援函式,支援任意數目的表示式。計算出的表示式可以用於排序、過濾和分組,這與其他常規屬性相同。

從版本0.9.9-rc2開始,允許使用GROUP BY的時候使用聚集函式(AVG(), MIN(), MAX(), SUM())。

表示式排序(Section 4.5, “SPH_SORT_EXPR 模式”)和地表距離計算函式(Section 6.4.5, “SetGeoAnchor (設定地表距離錨點)”)現在的內部實現就是這種表示式計算機制,分別使用“魔法名字”“@expr”和“@geodist”。

示例:
$cl->SetSelect ( "*, @weight+(user_karma+ln(pageviews))*0.1 AS myweight" ); $cl->SetSelect ( "exp_years, salary_gbp*{$gbp_usd_rate} AS salary_usd, IF(age>40,1,0) AS over40" ); $cl->SetSelect ( "*, AVG(price) AS avgprice" );
6.3. 全文搜尋設定
6.3.1. SetMatchMode (設定匹配模式)
原型: function SetMatchMode ( $mode )

設定全文查詢的匹配模式,見Section 4.1, “匹配模式”中的描述。引數必須是一個與某個已知模式對應的常數。

警告: (僅PHP)查詢模式常量不能包含在引號中,那給出的是一個字串而不是一個常量:

$cl->SetMatchMode ( "SPH_MATCH_ANY" ); // INCORRECT! will not work as expected $cl->SetMatchMode ( SPH_MATCH_ANY ); // correct, works OK
6.3.2. SetRankingMode (設定評分模式)
原型: function SetRankingMode ( $ranker )

設定評分模式。目前只在SPH_MATCH_EXTENDED2這個匹配模式中提供。引數必須是與某個已知模式對應的常數。

Sphinx預設計算兩個對最終匹配權重有用的因子。主要是查詢片語與文件文字的相似度。其次是稱之為BM25的統計函式,該函式值根據關鍵字文件中的頻率(高頻導致高權重)和在整個索引中的頻率(低頻導致高權重)在0和1之間取值。

然而,有時可能需要換一種計算權重的方法——或者可能為了提高效能而根本不計算權值,結果集用其他辦法排序。這個目的可以通過設定合適的相關度計算模式來達到。

已經實現的模式包括:

SPH_RANK_PROXIMITY_BM25, 預設模式,同時使用片語評分和BM25評分,並且將二者結合。
SPH_RANK_BM25, 統計相關度計算模式,僅使用BM25評分計算(與大多數全文檢索引擎相同)。這個模式比較快,但是可能使包含多個詞的查詢的結果質量下降。
SPH_RANK_NONE, 禁用評分的模式,這是最快的模式。實際上這種模式與布林搜尋相同。所有的匹配項都被賦予權重1。
SPH_RANK_WORDCOUNT, 根據關鍵詞出現次數排序。這個排序器計算每個欄位中關鍵字的出現次數,然後把計數與欄位的權重相乘,最後將積求和,作為最終結果。
SPH_RANK_PROXIMITY, 版本0.9.9-rc1新增,將原始的片語相似度作為結果返回。在內部,這個模式被用來模擬SPH_MATCH_ALL的查詢。
SPH_RANK_MATCHANY, 版本0.9.9-rc1新增,返回之前在SPH_MATCH_ANY中計算的位次,在內部這個模式用於模擬SPH_MATCH_ANY的查詢。
SPH_RANK_FIELDMASK, 版本0.9.9-rc2新增,返回一個32位掩碼,其中第N位對應第N個全文欄位,從0開始計數,如果某個欄位中出現了滿足查詢的關鍵詞,則對應的標誌位被置1。
6.3.3. SetSortMode (設定排序模式)
原型: function SetSortMode ( $mode, $sortby="" )

設定匹配項的排序模式,見Section 4.5, “排序模式”中的描述。引數必須為與某個已知模式對應的常數。

警告: (僅PHP)查詢模式常量不能包含在引號中,那給出的是一個字串而不是一個常量:

$cl->SetSortMode ( "SPH_SORT_ATTR_DESC" ); // INCORRECT! will not work as expected $cl->SetSortMode ( SPH_SORT_ATTR_ASC ); // correct, works OK
6.3.4. SetWeights (設定權重)
原型: function SetWeights ( $weights )

按在索引中出現的先後順序給欄位設定權重。 不推薦使用, 建議使用 SetFieldWeights()。

6.3.5. SetFieldWeights (設定欄位權重)
原型: function SetFieldWeights ( $weights )

按欄位名稱設定欄位的權值。引數必須是一個hash(關聯陣列),該hash將代表欄位名字的字串對映到一個整型的權值上。

欄位權重影響匹配項的評級。Section 4.4, “權值計算” 解釋了片語相似度如何影響評級。這個呼叫用於給不同的全文資料欄位指定不同於預設值的權值。

給定的權重必須是正的32位整數。最終的權重也是個32位的整數。預設權重為1。未知的屬性名會被忽略。

目前對權重沒有強制的最大限制。但您要清楚,設定過高的權值可能會導致出現32位整數的溢位問題。例如,如果設定權值為10000000並在擴充套件模式中進行搜尋,那麼最大可能的權值為10M(您設的值)乘以1000(BM25的內部比例係數,參見Section 4.4, “權值計算”, “權值計算”)再乘以1或更多(片語相似度評級)。上述結果最少是100億,這在32位整數裡面沒法儲存,將導致意想不到的結果。

6.3.6. SetIndexWeights (設定索引權重)
原型: function SetIndexWeights ( $weights )

設定索引的權重,並啟用不同索引中匹配結果權重的加權和。引數必須為在代表索引名的字串與整型權值之間建立對映關係的hash(關聯陣列)。預設值是空陣列,意思是關閉帶權加和。

當在不同的本地索引中都匹配到相同的文件ID時,Sphinx預設選擇查詢中指定的最後一個索引。這是為了支援部分重疊的分割槽索引。

然而在某些情況下索引並不僅僅是被分割槽了,您可能想將不同索引中的權值加在一起,而不是簡單地選擇其中的一個。SetIndexWeights()允許您這麼做。當開啟了加和功能後,最後的匹配權值是各個索引中的權值的加權合,各索引的權由本呼叫指定。也就是說,如果文件123在索引A被找到,權值是2,在B中也可找到,權值是3,而且您呼叫了SetIndexWeights ( array ( "A"=>100, "B"=>10 ) ),那麼文件123最終返回給客戶端的權值為2*100+3*10 = 230。

6.4. 結果集過濾設定
6.4.1. SetIDRange (設定查詢ID範圍)
原型: function SetIDRange ( $min, $max )

設定接受的文件ID範圍。引數必須是整數。預設是0和0,意思是不限制範圍。

此呼叫執行後,只有ID在$min和$max(包括$min和$max)之間的文件會被匹配。

6.4.2. SetFilter (設定屬性過濾)
原型: function SetFilter ( $attribute, $values, $exclude=false )

增加整數值過濾器。

此呼叫在已有的過濾器列表中新增新的過濾器。$attribute是屬性名。$values是整數陣列。$exclude是布林值,它控制是接受匹配的文件(預設模式,即$exclude為false時)還是拒絕它們。

只有當索引中$attribute列的值與$values中的任一值匹配時文件才會被匹配(或者拒絕,如果$exclude值為true)

6.4.3. SetFilterRange (設定屬性範圍)
原型: function SetFilterRange ( $attribute, $min, $max, $exclude=false )

新增新的整數範圍過濾器。

此呼叫在已有的過濾器列表中新增新的過濾器。$attribute是屬性名, $min 、$max定義了一個整數閉區間,$exclude布林值,它控制是接受匹配的文件(預設模式,即$exclude為false時)還是拒絕它們。

只有當索引中$attribute列的值落在$min 和 $max之間(包括$min 和 $max),文件才會被匹配(或者拒絕,如果$exclude值為true)。

6.4.4. SetFilterFloatRange (設定浮點數範圍)
原型: function SetFilterFloatRange ( $attribute, $min, $max, $exclude=false )

增加新的浮點數範圍過濾器。

此呼叫在已有的過濾器列表中新增新的過濾器。$attribute是屬性名, $min 、$max定義了一個浮點數閉區間,$exclude必須是布林值,它控制是接受匹配的文件(預設模式,即$exclude為false時)還是拒絕它們。

只有當索引中$attribute列的值落在$min 和 $max之間(包括$min 和 $max),文件才會被匹配(或者拒絕,如果$exclude值為true)。

6.4.5. SetGeoAnchor (設定地表距離錨點)
原型: function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )

為地表距離計算設定錨點,並且允許使用它們。

$attrlat 和 $attrlong是字串,分別指定了對應經度和緯度的屬性名稱。$lat 和 $long是浮點值,指定了錨點的經度和緯度值,以角度為單位。

一旦設定了錨點,您就可以在您的過濾器和/或排序表示式中使用"@geodist"特殊屬性。Sphinx將在每一次全文檢索中計算給定經緯度與錨點之前的地表距離,並把此距離附加到匹配結果上去。SetGeoAnchor和索引屬性資料中的經緯度值都是角度。而結果會以米為單位返回,因此地表距離1000.0代表1千米。一英里大約是1609.344米。

6.5. 分組設定
6.5.1. SetGroupBy (設定分組的屬性)
原型: function SetGroupBy ( $attribute, $func, $groupsort="@group desc" )

設定進行分組的屬性、函式和組間排序模式,並啟用分組(參考Section 4.6, “結果分組(聚類)”中的描述)。

$attribute是字串,為進行分組的屬性名。$func為常數,它指定內建函式,該函式以前面所述的分組屬性的值為輸入,目前的可選的值為: SPH_GROUPBY_DAY、SPH_GROUPBY_WEEK、 SPH_GROUPBY_MONTH、 SPH_GROUPBY_YEAR、SPH_GROUPBY_ATTR 。 $groupsort 是控制分組如何排序的子句。其語法與Section 4.5, “SPH_SORT_EXTENDED 模式”中描述的相似。

分組與SQL中的GROUP BY子句本質上相同。此函式呼叫產生的結果與下面虛擬碼產生的結果相同。

SELECT ... GROUP BY $func($attribute) ORDER BY $groupsort
注意,影響最終結果集中匹配項順序的是$groupsort。排序模式(見Section 6.3.3, “SetSortMode (設定排序模式)”)影響每個分組內的順序,即每組內哪些匹配項被視為最佳匹配。比如,組之間可以根據每組中的匹配項數量排序的同時每組組內又根據相關度排序。

從版本 0.9.9-rc2 開始, 聚合函式 (AVG(), MIN(), MAX(), SUM()) 可以在GROUP BY時被 SetSelect() API 呼叫。

6.5.2. SetGroupDistinct (設定分組計算不同值的屬性)
原型: function SetGroupDistinct ( $attribute )

設定分組中需要計算不同取值數目的屬性名。只在分組查詢中有效。

$attribute是包含屬性名的字串。每個組的這個屬性的取值都會被儲存起來(只要記憶體允許),其後此屬性在此組中不同值的總數會被計算出來並返回給客戶端。這個特性與標準SQL中的COUNT(DISTINCT)子句類似。因此如下Sphinx呼叫

$cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" ); $cl->SetGroupDistinct ( "vendor" );
等價於如下的SQL語句:

SELECT id, weight, all-attributes, COUNT(DISTINCT vendor) AS @distinct, COUNT(*) AS @count FROM products GROUP BY category ORDER BY @count DESC
在上述示例虛擬碼中,SetGroupDistinct()呼叫只與COUNT(DISINCT vendor)對應。GROUP BY,ORDER By和COUNT(*)子句則與SetGroupBY()呼叫等價。兩個查詢都會在每類中返回一個匹配的行。除了索引中的屬性,匹配項還可以包含每類的匹配項計數和每類中不同來源 ID的計數。

6.6. 搜尋資料
6.6.1. Query (查詢)
原型: function Query ( $query, $index="*", $comment="" )

連線到searchd伺服器,根據伺服器的當前設定執行給定的查詢,取得並返回結果集。

$query是查詢字串,$index是包含一個或多個索引名的字串。一旦發生一般錯誤,則返回假並設定GetLastError()資訊。若成功則返回搜尋的結果集。 此外, $comment 將被髮送到查詢日誌中搜索部分的前面,這對於除錯是非常有用的。目前,註釋的長度限制為128個字元以內。

$index的預設值是"*",意思是對全部本地索引做查詢。索引名中允許的字元包括拉丁字母(a-z),數字(0-9),減號(-)和下劃線(_),其他字元均視為分隔符。因此,下面的示例呼叫都是有效的,而且會搜尋相同的兩個索引:

$cl->Query ( "test query", "main delta" ); $cl->Query ( "test query", "main;delta" ); $cl->Query ( "test query", "main, delta" );
給出多個索引時的順序是有意義的。如果同一個文件ID的文件在多個索引中找到,那麼權值和屬性值會取最後一個索引中所儲存的作為該文件ID的權值和屬性值,用於排序、過濾,並返回給客戶端(除非用SetIndexWeights()顯式改變預設行為)。因此在上述示例中,索引“delta”中的匹配項總是比索引“main”中的更優先。

如果搜尋成功,Query()返回的結果集包含找到的全部匹配項中的一部分(根據SetLimits()之設定)和與查詢相關的統計資料。結果集是hash(僅PHP,其他語言的API可能使用其他資料結構) ,包含如下鍵和值:

"matches":
是一個hash表,儲存文件ID以及其對應的另一個包含文件權重和屬性值的hash表(或者是陣列,如果啟用了SetArrayResult())。
"total":
此查詢在伺服器檢索所得的匹配文件總數(即伺服器端結果集的大小)。這是在當前設定下,用當前查詢可以從伺服器端獲得的匹配文件數目的上限。
"total_found":
(伺服器上找到和處理了的)索引中匹配文件的總數。
"words":
一個hash,它將查詢關鍵字(關鍵字已經過大小寫轉換,取詞幹和其他處理)對映到一個包含關於關鍵字的統計資料(“docs”——在多少文件中出現,“hits”——共出現了多少次)的小hash表上。
"error":
searchd報告的錯誤資訊(人類可讀的字串)。若無錯誤則為空字串。
"warning":
searchd報告的警告資訊(人類可讀字串)。若無警告則為空串。
需要指出的是 Query() 索執行的操作,與沒有中間步驟的 AddQuery()和 RunQueries() 相同 ; 它類似一次單獨的AddQuery()呼叫,緊跟一次相應的RunQueries()呼叫,然後返回匹配的第一個陣列元素 (從第一次,也是僅有的一次查詢返回)。

6.6.2. AddQuery (增加批量查詢)
原型: function AddQuery ( $query, $index="*", $comment="" )

向批量查詢增加一個查詢。$query為查詢串。$index為包含一個或多個索引名的字串。 此外, 如果提供了$comment,它 將被髮送到查詢日誌中搜索部分的前面,這對於除錯是非常有用的。目前,註釋的長度限制為128個字元以內。返回RunQueries()返回的陣列中的一個下標。

批量查詢(或多查詢)使searchd能夠進行可能的內部優化,並且無論在任何情況下都會減少網路連線和程序建立方面的開銷。相對於單獨的查詢,批量查詢不會引入任何額外的開銷。因此當您的Web頁執行幾個不同的查詢時,一定要考慮使用批量查詢。

例如,多次運行同一個全文查詢,但使用不同的排序或分組設定,這會使searchd僅執行一次開銷昂貴的全文檢索和相關度計算,然後在此基礎上產生多個分組結果。

有時您不僅需要簡單地顯示搜尋結果,而且要顯示一些與類別相關的計數資訊,例如按製造商分組後的產品數目,此時批量查詢會節約大量的開銷。若無批量查詢,您會必須將這些本質上幾乎相同的查詢執行多次並取回相同的匹配項,最後產生不同的結果集。若使用批量查詢,您只須將這些查詢簡單地組成一個批量查詢,Sphinx會在內部優化掉這些冗餘的全文搜尋。

AddQuery() 在內部儲存全部當前設定狀態以及查詢,您也可在後續的AddQuery()呼叫中改變設定。早先加入的查詢不會被影響,實際上沒有任何辦法可以改變它們。下面是一個示例:

$cl->SetSortMode ( SPH_SORT_RELEVANCE ); $cl->AddQuery ( "hello world", "documents" ); $cl->SetSortMode ( SPH_SORT_ATTR_DESC, "price" ); $cl->AddQuery ( "ipod", "products" ); $cl->AddQuery ( "harry potter", "books" ); $results = $cl->RunQueries ();
用上述程式碼,第一個查詢會在“documents”索引上查詢“hello world”並將結果按相關度排序,第二個查詢會在“products”索引上查詢“ipod”並將結果按價格排序,第三個查詢在“books”索引上搜索“harry potter”,結果仍按價格排序。注意,第二個SetSortMode()呼叫並不會影響第一個查詢(因為它已經被添加了),但後面的兩個查詢都會受影響。

此外,在AddQuery()之前設定的任何過濾,都會被後續查詢繼續使用。因此,如果在第一個查詢前使用SetFilter(),則通過AddQuery()執行的第二個查詢(以及隨後的批量查詢)都會應用同樣的過濾,除非你先呼叫ResetFilters()來清除過濾規則。同時,你還可以隨時加入新的過濾規則

AddQuery()並不修改當前狀態。也就是說,已有的全部排序、過濾和分組設定都不會因這個呼叫而發生改變,因此後續的查詢很容易地複用現有設定。

AddQuery()返回RunQueries()結果返回的陣列中的一個下標。它是一個從0開始的遞增整數,即,第一次呼叫返回0,第二次返回1,以此類推。這個方便的特性使你在需要這些下標的時候不用手工記錄它們。

6.6.3. RunQueries (執行批量查詢)
原型: function RunQueries ()

連線到searchd,執行由AddQuery()新增的全部查詢,獲取並返回它們的結果集。若發生一般錯誤(例如網路I/O失敗)則返回假並設定GetLastError()資訊。若成功則返回結果集的簡單陣列。

該陣列中的每一個結果集都跟Query()返回的結果集完全相同。

注意,批量查詢請求自身幾乎總是成功——除非有網路錯誤、正在進行索引輪換,或者其他導致整個查詢無法被處理的因素。

然而其中的單個的查詢很可能失敗。此時與之對應的結果集只包含一個非空的"error"資訊,而沒有關於匹配或查詢的統計資訊。在極端情況下,批量查詢中的所有單個查詢可能都失敗。但這仍然不會導致報告一般錯誤,因為API已經成功地連線到searchd,提交了批量查詢並得到返回結果——但每個結果集都只包含特定的錯誤資訊。

6.6.4. ResetFilters (清除當前設定的過濾器)
原型: function ResetFilters ()

清除當前設定的過濾器。

通常此呼叫在使用批量查詢的時候會用到。您可能需要為批量查詢中的不同查詢提供不同的過濾器,為達到這個目的,您需要呼叫ResetFilters()然後用其他呼叫增加新的過濾器。

6.6.5. ResetGroupBy (清除現有的分組設定)
原型: function ResetGroupBy ()

清除現有的全部分組設定,並關閉分組。

通常此呼叫在使用批量查詢的時候會用到。單獨的分組設定可以用SetGroupBy()和SetGroupDistinct()來改變,但它們不能關閉分組。ResetGroupBy()將之前的分組設定徹底重置並在當前狀態下關閉分組模式,因此後續的AddQuery()可以進行無分組的搜尋。

6.7. 附加方法
6.7.1. BuildExcerpts (產生文字摘要和高亮)
原型: function BuildExcerpts ( $docs, $index, $words, $opts=array() )

該函式用來產生文件片段(摘要)。連線到searchd,要求它從指定文件中產生片段(摘要),並返回結果。

$docs為包含各文件內容的陣列。$index為包含索引名字的字串。給定索引的不同設定(例如字符集、形態學、詞形等方面的設定)會被使用。$words為包含需要高亮的關鍵字的字串。它們會按索引的設定被處理。例如,如果英語取詞幹(stemming)在索引中被設定為允許,那麼即使關鍵詞是“shoe”,“shoes”這個詞也會被高亮。從版本0.9.9-rc1開始,關鍵字可以包含萬用字元,與查詢支援的star-syntax類似。$opts為包含其他可選的高亮引數的hash表:

"before_match":
在匹配的關鍵字前面插入的字串。預設為"<b>"。
"after_match":
在匹配的關鍵字後面插入的字串。預設為 "<b>".
"chunk_separator":
在摘要塊(段落)之間插入的字串。預設為" ... ".
"limit":
摘要最多包含的符號(碼點)數。整數,預設為256.
"around":
每個關鍵詞塊左右選取的詞的數目。整數,預設為5.
"exact_phrase":
是否僅高亮精確匹配的整個查詢片語,而不是單獨的關鍵詞。布林值,預設為false.
"single_passage":
是否僅抽取最佳的一個段落。布林值,預設為false.
"weight_order":
對於抽取出的段落,要麼根據相關度排序(權重下降),要麼根據出現在文件中的順序(位置遞增)。布林型,預設是false.
失敗時返回false。成功時返回包含有片段(摘要)字串的陣列。

6.7.2. UpdateAttributes (更新屬性)
原型: function UpdateAttributes ( $index, $attrs, $values )

立即更新指定文件的指定屬性值。成功則返回實際被更新的文件數目(0或更多),失敗則返回-1。

$index 為待更新的(一個或多個)索引名。$attrs為屬性名字串的陣列,其所列的屬性會被更新。$attrs為hash表,$values表的鍵為文件ID,$values表的值為新的屬性值的簡單陣列。

$index 既可以是一個單獨的索引名,也可以是一個索引名的列表,就像Query()的引數。與Query()不同的是不允許萬用字元,全部待更新的索引必須明確指出。索引名列表可以包含分散式索引。對分散式索引,更新會同步到全部代理上。

只有在docinfo=extern這個儲存策略下才可以執行更新。更新非常快,因為操作完全在記憶體中進行,但它們也可以變成持久的,更新會在searchd乾淨關閉時(收到SIGTERM訊號時)被寫入磁碟。在額外限制條件下,MVA屬性也可以被更新,參見mva_updates_pool詳細瞭解。

使用示例

$cl->UpdateAttributes ( "test1", array("group_id"), array(1=>array(456)) ); $cl->UpdateAttributes ( "products", array ( "price", "amount_in_stock" ), array ( 1001=>array(123,5), 1002=>array(37,11), 1003=>(25,129) ) );
第一條示例語句會更新索引“test1”中的文件1,設定“group_id”為456.第二條示例語句則更新索引“products”中的文件1001,1002和1003。文件1001的“price”會被更新為123,“amount_in_stock”會被更新為5;文件1002,“price”變為37而“amount_in_storage”變為11,等等。

6.7.3. BuildKeywords (獲取分詞結果)
原型: function BuildKeywords ( $query, $index, $hits )

根據指定索引的符號化(tokenizer)方式的設定,從查詢中抽取關鍵詞,也可以同時返回每個關鍵詞出現次數的統計資訊。返回一個數組,其元素是一些字典,每個字典包含一個關鍵字的資訊。

$query 是抽取關鍵字的目標。$index是某個索引的名字,系統會使用這個索引的符號化(tokenizer)設定,關鍵詞出現次數的統計資訊也從這個索引中得出。$hits是一個布林值,它指定了是否需要返回關鍵詞出現此處的資訊。

使用示例:

$keywords = $cl->BuildKeywords ( "this.is.my query", "test1", false );
6.7.4. EscapeString (轉義特殊字元)
原型: function EscapeString ( $string )

查詢語言分析器將某些字元理解成特殊操作符,這個函式對字串中的那些有特殊意義的字元進行轉義。返回轉義後的字串。

$string 是待轉義的字串。

表面上看這個函式是多餘的,因為可以很容易地在可能呼叫這個函式的程式裡實現這個轉義功能。然而這些特殊字元的集合可能隨著時間而改變,因此理應提供一個API呼叫來完成這個功能,並保證任何時候都可以正確地轉義全部特殊字元。

使用示例:

$escaped = $cl->EscapeString ( "[email protected]/string" );
6.7.5. Status (查詢服務狀態)
原型: function Status ()

查詢searchd的狀態,返回一個數組,陣列元素是由狀態變數名和值的鍵值對構成。

使用示例:

$status = $cl->Status (); foreach ( $status as $row ) print join ( ": ", $row ) . "\n";
6.8. 持久連線
“持久連線”特性允許利用一個單獨的網路連線來執行本來需要多個連線的多個命令。

6.8.1. Open (開啟連線)
原型: function Open ()

開啟到伺服器的持久連線。

6.8.2. Close (關閉連線)
原型: function Close ()

關閉先前開啟的持久連線。