Oracle Text: Как санировать ввод пользователя

Если у кого-то есть опыт использования текста Oracle (CTXSYS.CONTEXT), Мне интересно, как обрабатывать пользовательский ввод, когда пользователь хочет искать имена, которые могут содержать апостроф.

Экранирование "кажется, работает в некоторых случаях, но не для" в конце слова - "s" находится в списке стоп-слов, и поэтому, похоже, удаляется.

В настоящее время мы меняем простой текст запроса (т.е. все, что только буквы) на %text%, например:

contains(field, :text) > 0

Поиск О'Нила работает, а Джо - нет.

Кто-нибудь, использующий Oracle Text, имел дело с этой проблемой?

3 ответа

Побег всех специальных символов с обратной косой черты. Фигурные скобки не будут работать с поиском подстроки, поскольку они определяют полные токены. Например,%{ello}% не будет соответствовать токену 'Hello'

Экранированные пробелы будут включены в токен поиска, поэтому строка поиска "% stay \ near \ me \" будет восприниматься как буквальная строка "остаться рядом со мной" и не будет вызывать оператор "рядом".

Если вы индексируете короткие строки (например, имена и т. Д.) И хотите, чтобы Oracle Text вел себя точно так же, как оператор like, вы должны написать свой собственный лексер, который не будет создавать токены для отдельных слов. (К сожалению, CATSEARCH не поддерживает поиск по подстроке...)

Вероятно, было бы неплохо изменить поиски, чтобы использовать семантику текста оракула, с сопоставлением токенов, но для некоторых приложений расширение по шаблону нескольких (коротких) токенов и числовых токенов будет создавать слишком много совпадений для строк поиска, что разумно было бы пользователям ожидать работы.

Например, поиск "%I\ AM\ NUMBER\ 9%", скорее всего, завершится неудачей, если в индексированных данных много числовых токенов, так как необходимо искать все токены, заканчивающиеся на "I" и начинающиеся на "9". и объединены, прежде чем результат может быть возвращен.

"I" и "AM", вероятно, также находятся в стоп-листе по умолчанию и будут полностью игнорироваться, поэтому для этого гипотетического приложения может использоваться нулевой стоп-лист, если эти токены важны.

С помощью PARAMETERS('STOPLIST ctxsys.empty_stoplist') при индексации будут включены все алфавитные токены в индексе. Акцентированные символы также индексируются. Не-алфавитные символы обычно рассматриваются как пробелы в BASIC_LEXER.

Кроме того, грамматика CONTEXT использует много операторов, которые включают символы и зарезервированные слова, такие как WITHIN, NEAR, ABOUT. Все это должно быть как-то экранировано на входе. Если вам нужно искать подстроки, правильный подход к экранированию - экранировать все символы с \, Это ответ на связанный с этим вопрос здесь: текст Oracle экранируется фигурными скобками и подстановочными знаками. Если ваши требования заключается в поиске целых терминов (имен и т. Д.), Вы можете использовать более простые {input} побега.

Забудьте о дезинфекции. Зачем? Обратитесь к http://en.wikipedia.org/wiki/SQL_injection.

Это зависит от того, какой API интерфейса базы данных вы используете. Perl DBI, ODBC, JDBC поддерживают параметризованные запросы или подготовленные операторы. Если вы используете собственный DBI, и он не поддерживает его, то благословит вас Бог.

Другие вопросы по тегам