2011-06-08 48 views
1

在獅身人面像的changelog它說爲0.9.8:如何在sphinxQL全文搜索中轉義特殊字符?

「添加查詢逃逸支持查詢語言,EscapeString()API調用」

我可以假設,應該有轉義特殊獅身人面像支持用於sphinxQL的字符(@,!, - ,...)?如果是這樣,也許有人可以指點我一個例子。我是 在文檔或網絡上的其他地方無法找到任何關於它的信息。

如果搜索詞組包含某個特殊字符,您將如何進行全文搜索(使用spinxQL)?我不太喜歡這個想法,以便在索引期間「掩蓋」它們。

謝謝!

回答

5

在每個API(php/python/java/ruby​​)中都有相應的函數EscapeString,但爲了逃避SphinxQL的工作,您必須在應用程序中編寫類似於SphinxQL沒有的函數。

函數本身onliner

def EscapeString(self, string): 
return re.sub(r"([=\(\)|\[email protected]~\"&/\\\^\$\=])", r"\\\1", string) 

,你可以輕鬆將其轉換成應用程序的代碼。

+0

經過驗證......這確實很容易......非常感謝您指出我的意見。 – aurora 2011-06-09 10:37:26

10

sphinxapi轉義函數的PHP版本在測試中不適用於我。此外,它不提供針對SQL注入排序字符的保護(例如單引號)。

我需要這個功能:

function EscapeSphinxQL ($string) 
{ 
    $from = array ('\\', '(',')','|','-','!','@','~','"','&', '/', '^', '$', '=', "'", "\x00", "\n", "\r", "\x1a"); 
    $to = array ('\\\\', '\\\(','\\\)','\\\|','\\\-','\\\!','\\\@','\\\~','\\\"', '\\\&', '\\\/', '\\\^', '\\\$', '\\\=', "\\'", "\\x00", "\\n", "\\r", "\\x1a"); 
    return str_replace ($from, $to, $string); 
} 

注意具體的獅身人面像的字符額外的反斜線。我認爲會發生什麼是他們通過一個SQL解析器來完成整個查詢,SQL解析器會刪除用於SQL目的的「無關」反斜槓(即'\ &' - >'&')。然後,它通過全文解析器放置MATCH子句,並且突然'&'是一個特殊字符。所以,你一開始就需要額外的反斜槓。

+0

應該有問號嗎?用問號表現奇怪,它正在用「?」進行某種正則表達式搜索代表任何字符(但不包括空格)。 – Radek 2014-04-25 07:24:37