2011-06-08 50 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