如果有人有使用Oracle文本(CTXSYS.CONTEXT
)的经验,我想知道当用户想要搜索可能包含撇号的名称时如何处理用户输入。
逃避'似乎在某些情况下有效,但不是在单词结尾处 - s在停用词列表中,因此似乎被删除。
我们目前将简单查询文本(即只是字母的任何内容)更改为%text%
,例如:
contains(field, :text) > 0
搜索 O'Neil 有效,但 Joe's 却没有。
是否有人使用Oracle Text处理此问题?
答案 0 :(得分:2)
使用反斜杠转义所有特殊字符。大括号搜索不能用于子字符串搜索,因为它们定义了完整的标记。例如,%{ello}%与令牌“Hello”
不匹配转义空格字符将包含在搜索令牌中,因此搜索字符串'%stay \ near \ me%'将被视为文字字符串“靠近我”并且不会调用'near'运算符。< / p>
如果要索引短字符串(如名称等),并且希望Oracle Text的行为与like运算符完全相同,则必须编写自己的词法分析器,这些词法分析器不会为单个单词创建标记。 (遗憾的是CATSEARCH不支持子字符串搜索...)
使用令牌匹配更改搜索以使用oracle文本的语义可能是一个好主意,但对于某些应用程序,多个(短)令牌和数字令牌的通配符扩展将为搜索字符串创建过多的匹配,用户合理地期望工作。
例如,如果索引数据中有大量数字标记,则搜索“%I \ AM \ NUMBER \ 9%”很可能会失败,因为所有标记都以“I”结尾并以“9”开头必须先搜索并合并,然后才能返回结果。
'我'和'AM'可能也在默认的停止列表中并且将被完全忽略,因此对于这个假设的应用程序,如果这些令牌很重要,可以使用空的停止列表。
答案 1 :(得分:0)
索引时使用PARAMETERS('STOPLIST ctxsys.empty_stoplist')
将包括索引中的所有字母标记。重音字符也被编入索引。非字母字符通常被BASIC_LEXER视为空格。
此外,CONTEXT语法使用了许多包含符号和保留字的运算符,如WITHIN,NEAR,ABOUT。这些都必须在输入中以某种方式进行转义。如果您需要搜索子字符串,正确的转义方法是使用\
转义所有字符。这是对相关问题的回答:Oracle text escaping with curly braces and wildcards。如果您的要求是搜索整个术语(名称等),则可以使用更简单的{input}
转义。
答案 2 :(得分:-2)
忘记消毒。为什么?请参阅http://en.wikipedia.org/wiki/SQL_injection。
这取决于您使用的数据库接口API的类型。 Perl DBI,ODBC,JDBC支持参数化查询或预准备语句。如果你使用的是原生DBI并且它不支持它,那么上帝保佑你。