匹配模式
有如下可選的匹配模式:
SPH_MATCH_ALL, 匹配所有查詢詞(默認模式);
SPH_MATCH_ANY, 匹配查詢詞中的任意一個;
SPH_MATCH_PHRASE, 將整個查詢看作一個詞組,要求按順序完整匹配;
SPH_MATCH_BOOLEAN, 將查詢看作一個布爾表達式
SPH_MATCH_EXTENDED, 將查詢看作一個CoreSeek/Sphinx內部查詢語言的表達式 . 從版本Coreseek 3/Sphinx 0.9.9開始, 這個選項被選項SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留這個選項是爲了與遺留的舊代碼兼容——這樣即使Sphinx及其組件包括API升級的時候,舊的應用程序代碼還能夠繼續工作。
SPH_MATCH_EXTENDED2, 使用第二版的“擴展匹配模式”對查詢進行匹配.
SPH_MATCH_FULLSCAN, 強制使用下文所述的“完整掃描”模式來對查詢進行匹配。注意,在此模式下,所有的查詢詞都被忽略,儘管過濾器、過濾器範圍以及分組仍然起作用,但任何文本匹配都不會發生.
我們要關注的主要是SPH_MATCH_EXTENDED2擴展匹配模式,擴展匹配模式允許使用一些像mysql的條件語句
//設置擴展匹配模式
$sphinx->SetMatchMode ( "SPH_MATCH_EXTENDED2" );
//查詢中使用條件語句,字段用@開頭,搜索內容包含測試,toid等於1的郵件:
$result = $sphinx->query('@content (測試) & @toid =1', '*');
//用括號和&(與)、|、(或者)、-(非,即!=)設置更復雜的條件
$result = $sphinx->query('(@content (測試) & @subject =呃) | (@fromid -(100))', '*');
//更多語法請查看官方文檔匹配模式的說明
擴展匹配模式中值得一提的是搜索的字段,如果該字段被設置屬性,那麼擴展匹配搜索的字段默認是不包含這些屬性的,只能用SetFilter()或者SetFilterRange()之類
之前我們設置了fromid、toid、sendtime爲屬性,但又想在擴展匹配模式中又想用作條件該怎麼辦?
只要在sql_query語句中再選擇多一次該字段就可以了
sql_query = SELECT emailid,fromid,fromid,toid,toid,subject,content,sendtime,sendtime,attachement FROM email
//設置完成記得重新建立索引
更多條件技巧
只是一些技巧,但不建議使用的部署環境中,至於爲什麼,請看文章結尾
<、<=、>、>=
默認sphinx沒有這些比較符。
假如我想郵件的發送時間大於某一日期怎麼辦?用SetFilterRange()方法模擬一下
//大於等於某一時間截$time
$sphinx->SetFilterRange('sendtime', $time, 10000000000) //時間截最大是10個9,再加1是不可超越了。。
//大於某一時間截$time
$sphinx->SetFilterRange('sendtime', $time+1, 10000000000)
//小於等於某一時間截$time
$sphinx->SetFilterRange('sendtime', -1, $time) //時間截最小是0,所以應該減1
//大於某一時間截$time
$sphinx->SetFilterRange('sendtime', -1, $time - 1)
評分模式。目前只在SPH_MATCH_EXTENDED2這個匹配模式中提供。參數必須是與某個已知模式對應的常數。
Sphinx默認計算兩個對最終匹配權重有用的因子。主要是查詢詞組與文檔文本的相似度。其次是稱之爲BM25的統計函數,該函數值根據關鍵字文檔中的頻率(高頻導致高權重)和在整個索引中的頻率(低頻導致高權重)在0和1之間取值。
然而,有時可能需要換一種計算權重的方法——或者可能爲了提高性能而根本不計算權值,結果集用其他辦法排序。這個目的可以通過設置合適的相關度計算模式來達到。
===========================