API的參考實現是用PHP寫成的,因為(我們相信)較之其他語言,Sphinx在PHP中應用最廣泛。因此這份參考文檔基於PHP API的參考,而且這節中的所有的代碼樣例都用PHP給出。
當然,其他所有API都提供相同的方法,也使用完全相同的網絡協議。因此這份文檔對他們同樣適用。在方法命名習慣方面或者具體數據結構的使用上可能會有小的差別。但不同語言的API提供的功能上絕不會有差異。
原型: function GetLastError()
以可讀形式返回最近的錯誤描述信息。如果前一次API調用沒有錯誤,返回空字符串。
任何其他函數(如 Query())失敗后(函數失敗一般返回false),都應該調用這個函數,它將返回錯誤的描述。
此函數本身並不重置對錯誤描述,因此如有必要,可以多次調用。
原型: function GetLastWarning ()
以可讀格式返回最近的警告描述信息。如果前一次API調用沒有警告,返回空字符串。
您應該調用這個函數來確認您的請求(如 Query())是否雖然完成了但產生了警告。例如,即使幾個遠程代理超時了,對分布式索引的搜索查詢也可能成功完成。這時會產生一個警告信息。
此函數本身不會重置警告信息,因此如有必要,可以多次調用。
原型: function SetServer ( $host, $port )
設置searchd
的主機名和TCP端口。此后的所有請求都使用新的主機和端口設置。默認的主機和端口分別是“localhost”和9312。
原型: function SetRetries ( $count, $delay=0 )
設置分布式搜索重試的次數和延遲時間。
對於暫時的失敗,searchd
對每個代理重試至多$count
次。$delay
是兩次重試之間延遲的時間,以毫秒為單位。默認情況下,重試是禁止的。注意,這個調用不會使API本身對暫時失敗進行重試,它只是讓searchd
這樣做。目前暫時失敗包括connect()調用的各種失敗和遠程代理超過最大連接數(過於繁忙)的情況。
原型: function SetConnectTimeout ( $timeout )
設置連接超時時間,在與服務器連接時,如果超過這個時間沒有連上就放棄。
有時候服務器在響應上會有所延遲,這有可能由於網絡的延時,也有可能是因為服務器未處理完的查詢太多,堆積所致。不管是什么情況,有了這個選項,就給客戶端應用程序提供了一定的控制權,讓它可以決定當searchd
不可用的時候如何處理,而且可以避免腳本由於超過運行限制而運行失敗(尤其是在PHP里)
當連接失敗的而時候,會將合適的錯誤碼返回給應用程序,以便在應用程序級別進行錯誤處理和通知用戶。
原型: function SetArrayResult ( $arrayresult )
PHP專用。控制搜索結果集的返回格式(匹配項按數組返回還是按hash返回)
$arrayresult
參數應為布爾型。如果$arrayresult
為false
(默認),匹配項以PHP hash格式返回,文檔ID為鍵,其他信息(權重、屬性)為值。如果$arrayresult
為true
,匹配項以普通數組返回,包括匹配項的全部信息(含文檔ID)
這個調用是對MVA屬性引入分組支持時同時引入的。對MVA分組的結果可能包含重復的文檔ID。因此需要將他們按普通數組返回,因為hash對每個文檔ID僅能保存一個記錄。
原型: 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
個匹配后就強制停止。
原型: function SetMaxQueryTime ( $max_query_time )
設置最大搜索時間,以毫秒為單位。參數必須是非負整數。默認值為0,意思是不做限制。
這個設置與SetLimits()中的$cutoff
相似,不過這個設置限制的是查詢時間,而不是處理的匹配數目。一旦處理時間已經太久,本地搜索查詢會被停止。注意,如果一個搜索查詢了多個本地索引,那這個限制獨立地作用於這幾個索引。
原型: function SetOverride ( $attrname, $attrtype, $values )
設置一個臨時的(只對單個查詢有效)針對不同文檔的屬性值覆蓋。只支持標量屬性。$value是一個哈希表,他的鍵是要覆蓋屬性的文檔ID,之是對應該文檔ID的要覆蓋的值。 於版本0.9.9-rc1引入。
屬性覆蓋特性使用戶可以針對一次查詢“臨時性地”修改一些文檔的值,不影響其他查詢。這個函數可以用來進行數據個性化。例如,假設正在實現一個個性化搜索函數,用來將朋友推薦的帖子排在前面,這類數據不僅是動態的,而且是個性化的,因此不能簡單地把這種數據放入索引,因為不能影響其他用戶的搜索。而覆蓋機制是針對單個查詢的,不會影響其他人。因此可以,比如說,給每個文檔設置一個“friends_weight”屬性,默認值是0,然后臨時將文檔123,456,789(當前用戶的朋友推薦的)的這個屬性設置為1,最后用這個值進行相關度計算。
原型: 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" );
原型: 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
原型: 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。
原型: 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
原型: function SetWeights ( $weights )
按在索引中出現的先后順序給字段設置權重。 不推薦使用, 建議使用 SetFieldWeights()。
原型: function SetFieldWeights ( $weights )
按字段名稱設置字段的權值。參數必須是一個hash(關聯數組),該hash將代表字段名字的字符串映射到一個整型的權值上。
字段權重影響匹配項的評級。Section 4.4, “權值計算” 解釋了詞組相似度如何影響評級。這個調用用於給不同的全文數據字段指定不同於默認值的權值。
給定的權重必須是正的32位整數。最終的權重也是個32位的整數。默認權重為1。未知的屬性名會被忽略。
目前對權重沒有強制的最大限制。但您要清楚,設定過高的權值可能會導致出現32位整數的溢出問題。例如,如果設定權值為10000000並在擴展模式中進行搜索,那么最大可能的權值為10M(您設的值)乘以1000(BM25的內部比例系數,參見Section 4.4, “權值計算”, “權值計算”)再乘以1或更多(詞組相似度評級)。上述結果最少是100億,這在32位整數里面沒法存儲,將導致意想不到的結果。
原型: function SetIndexWeights ( $weights )
設置索引的權重,並啟用不同索引中匹配結果權重的加權和。參數必須為在代表索引名的字符串與整型權值之間建立映射關系的hash(關聯數組)。默認值是空數組,意思是關閉帶權加和。
當在不同的本地索引中都匹配到相同的文檔ID時,Sphinx默認選擇查詢中指定的最后一個索引。這是為了支持部分重疊的分區索引。
然而在某些情況下索引並不僅僅是被分區了,您可能想將不同索引中的權值加在一起,而不是簡單地選擇其中的一個。SetIndexWeights()
允許您這么做。當開啟了加和功能后,最后的匹配權值是各個索引中的權值的加權合,各索引的權由本調用指定。也就是說,如果文檔123在索引A被找到,權值是2,在B中也可找到,權值是3,而且您調用了SetIndexWeights ( array ( "A"=>100, "B"=>10 ) )
,那么文檔123最終返回給客戶端的權值為2*100+3*10 = 230。
原型: function SetIDRange ( $min, $max )
設置接受的文檔ID范圍。參數必須是整數。默認是0和0,意思是不限制范圍。
此調用執行后,只有ID在$min
和$max
(包括$min
和$max
)之間的文檔會被匹配。
原型: function SetFilter ( $attribute, $values, $exclude=false )
增加整數值過濾器。
此調用在已有的過濾器列表中添加新的過濾器。$attribute
是屬性名。$values
是整數數組。$exclude
是布爾值,它控制是接受匹配的文檔(默認模式,即$exclude
為false時)還是拒絕它們。
只有當索引中$attribute
列的值與$values
中的任一值匹配時文檔才會被匹配(或者拒絕,如果$exclude
值為true)
原型: function SetFilterRange ( $attribute, $min, $max, $exclude=false )
添加新的整數范圍過濾器。
此調用在已有的過濾器列表中添加新的過濾器。$attribute
是屬性名, $min
、$max
定義了一個整數閉區間,$exclude
布爾值,它控制是接受匹配的文檔(默認模式,即$exclude
為false時)還是拒絕它們。
只有當索引中$attribute
列的值落在$min
和 $max
之間(包括$min
和 $max
),文檔才會被匹配(或者拒絕,如果$exclude
值為true)。
原型: function SetFilterFloatRange ( $attribute, $min, $max, $exclude=false )
增加新的浮點數范圍過濾器。
此調用在已有的過濾器列表中添加新的過濾器。$attribute
是屬性名, $min
、$max
定義了一個浮點數閉區間,$exclude
必須是布爾值,它控制是接受匹配的文檔(默認模式,即$exclude
為false時)還是拒絕它們。
只有當索引中$attribute
列的值落在$min
和 $max
之間(包括$min
和 $max
),文檔才會被匹配(或者拒絕,如果$exclude
值為true)。
原型: function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )
為地表距離計算設置錨點,並且允許使用它們。
$attrlat
和 $attrlong
是字符串,分別指定了對應經度和緯度的屬性名稱。$lat
和 $long
是浮點值,指定了錨點的經度和緯度值,以角度為單位。
一旦設置了錨點,您就可以在您的過濾器和/或排序表達式中使用"@geodist"
特殊屬性。Sphinx將在每一次全文檢索中計算給定經緯度與錨點之前的地表距離,並把此距離附加到匹配結果上去。SetGeoAnchor
和索引屬性數據中的經緯度值都是角度。而結果會以米為單位返回,因此地表距離1000.0代表1千米。一英里大約是1609.344米。
原型: 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 調用。
原型: 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的計數。
原型: 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()
調用,然后返回匹配的第一個數組元素 (從第一次,也是僅有的一次查詢返回)。
原型: 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,以此類推。這個方便的特性使你在需要這些下標的時候不用手工記錄它們。
原型: function RunQueries ()
連接到searchd,運行由AddQuery()
添加的全部查詢,獲取並返回它們的結果集。若發生一般錯誤(例如網絡I/O失敗)則返回假並設置GetLastError()
信息。若成功則返回結果集的簡單數組。
該數組中的每一個結果集都跟Query()
返回的結果集完全相同。
注意,批量查詢請求自身幾乎總是成功——除非有網絡錯誤、正在進行索引輪換,或者其他導致整個查詢無法被處理的因素。
然而其中的單個的查詢很可能失敗。此時與之對應的結果集只包含一個非空的"error"
信息,而沒有關於匹配或查詢的統計信息。在極端情況下,批量查詢中的所有單個查詢可能都失敗。但這仍然不會導致報告一般錯誤,因為API已經成功地連接到searchd
,提交了批量查詢並得到返回結果——但每個結果集都只包含特定的錯誤信息。
原型: function ResetFilters ()
清除當前設置的過濾器。
通常此調用在使用批量查詢的時候會用到。您可能需要為批量查詢中的不同查詢提供不同的過濾器,為達到這個目的,您需要調用ResetFilters()
然后用其他調用增加新的過濾器。
原型: 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。成功時返回包含有片段(摘要)字符串的數組。
原型: 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,等等。
原型: function BuildKeywords ( $query, $index, $hits )
根據指定索引的符號化(tokenizer)方式的設置,從查詢中抽取關鍵詞,也可以同時返回每個關鍵詞出現次數的統計信息。返回一個數組,其元素是一些字典,每個字典包含一個關鍵字的信息。
$query
是抽取關鍵字的目標。$index
是某個索引的名字,系統會使用這個索引的符號化(tokenizer)設置,關鍵詞出現次數的統計信息也從這個索引中得出。$hits
是一個布爾值,它指定了是否需要返回關鍵詞出現此處的信息。
使用示例:
$keywords = $cl->BuildKeywords ( "this.is.my query", "test1", false );
原型: function EscapeString ( $string )
查詢語言分析器將某些字符理解成特殊操作符,這個函數對字符串中的那些有特殊意義的字符進行轉義。返回轉義后的字符串。
$string
是待轉義的字符串。
表面上看這個函數是多余的,因為可以很容易地在可能調用這個函數的程序里實現這個轉義功能。然而這些特殊字符的集合可能隨着時間而改變,因此理應提供一個API調用來完成這個功能,並保證任何時候都可以正確地轉義全部特殊字符。
使用示例:
$escaped = $cl->EscapeString ( "escaping-sample@query/string" );