Oracle Text: как очистить пользовательский ввод

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

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

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

contains(field, :text) > 0

Поиск O'Neil работает, а Joe's — нет.

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


person chris    schedule 20.10.2008    source источник


Ответы (3)


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

Символы экранированного пробела будут включены в токен поиска, поэтому строка поиска «%stay\ near\ me%» будет рассматриваться как буквальная строка «Stay Near Me» и не будет вызывать оператор «near».

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

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

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

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

person KarlP    schedule 26.01.2012

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

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

person DKroot    schedule 22.01.2017

Забудьте о санитарной обработке. Почему? См. http://en.wikipedia.org/wiki/SQL_injection .

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

person yogman    schedule 21.10.2008
comment
Собственно к вопросу не относится. Аргументы поиска Oracle Text определяются с использованием определенной грамматики и анализируются поисковой системой. (Куча хранимых процедур, в основном) Подготовленные операторы вообще не помогут. Специальные символы и зарезервированные слова должны быть экранированы, если API не должен быть представлен пользователям. - person KarlP; 27.01.2012