Oracle Text: Как санировать ввод пользователя - PullRequest
3 голосов
/ 20 октября 2008

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

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

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

contains(field, :text) > 0

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

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

Ответы [ 3 ]

2 голосов
/ 27 января 2012

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

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

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

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

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

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

0 голосов
/ 22 января 2017

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

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

0 голосов
/ 21 октября 2008

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

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

...