Как избежать специальных символов в полнотекстовом поиске sphinxQL? - PullRequest
1 голос
/ 08 июня 2011

в журнале изменений sphinx для 0.9.8:

"добавлен запрос, избегающий поддержки языка запросов, и вызов API EscapeString ()"

могу ли я предположить, что должно бытьподдержка экранирования специальных символов sphinx (@,!, -, ...) для sphinxQL тоже?если так, возможно, кто-то мог бы указать мне пример на этом.Я не могу найти что-либо об этом в документации или в другом месте в сети.

как вы выполняете полнотекстовый поиск (используя spinxQL), если поисковая фраза содержит один из специальных символов?мне не очень нравится идея "маскировать" их во время индексации.

спасибо!

Ответы [ 2 ]

13 голосов
/ 24 августа 2011

PHP-версия функции выхода sphinxapi у меня не работала в тестах.Кроме того, он не обеспечивает защиту от символов 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 через синтаксический анализатор полного текста, и внезапно '&' становится специальным символом.Итак, в начале вам понадобятся дополнительные обратные слеши.

5 голосов
/ 09 июня 2011

В каждом API есть соответствующие функции EscapeString (php / python / java / ruby), но для того, чтобы ускользнуть от работы с SphinxQL, вы должны написать что-то похожее в своем приложении, так как SphinxQL не имеет такой функции.

Сама функция onliner

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

, вы можете легко перевести ее в код вашего приложения.

...