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

时间:2011-06-08 06:36:12

标签: full-text-search escaping sphinx

在sphinx更改日志中它说的是0.9.8:

“添加了查询转义支持查询语言,以及EscapeString()API调用”

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

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

谢谢!

2 个答案:

答案 0 :(得分: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 );
}

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

答案 1 :(得分:5)

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

该功能本身是在线的

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

您可以轻松将其翻译为您的应用程序代码。