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