如何在sphinxQL全文搜索中转义特殊字符?

aur*_*ora 1 full-text-search sphinx escaping

在sphinx changelog中它说0.9.8:

"添加了查询转义支持查询语言和EscapeString()API调用"

我可以假设,还应该支持为sphinxQL转义特殊的狮身人面像字符(@,!, - ,...)吗?如果是这样,也许有人可以指出我这方面的一个例子.我无法在文档或网络上的其他地方找到任何相关信息.

如果搜索短语包含一个特殊字符,你如何进行全文搜索(使用spinxQL)?我不喜欢在索引编制过程中"掩盖"它们的想法.

谢谢!

jgi*_*les 13

sphinxapi转义函数的PHP版本在测试中对我不起作用.此外,它不提供针对SQL注入类型字符的保护(例如单引号).

我需要这个功能:

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

请注意Sphinx特定字符上的额外反斜杠.我认为发生的是他们将整个查询通过一个SQL解析器,它为SQL目的删除了逃避反斜杠的"无关"(即'\&' - >'&').然后,它将MATCH子句放入全文解析器,突然'&'是一个特殊字符.因此,您需要在开头添加额外的反斜杠.


小智 5

在每个API(php/python/java/ruby​​)中都有相应的函数EscapeString,但为了使用SphinxQL进行转义,你必须在应用程序中编写类似的东西,因为SphinxQL没有这样的功能.

该功能本身是在线的

def EscapeString(self, string):
 return re.sub(r"([=\(\)|\-!@~\"&/\\\^\$\=])", r"\\\1", string)
Run Code Online (Sandbox Code Playgroud)

您可以轻松将其转换为您的应用程序的代码.