代码之家  ›  专栏  ›  技术社区  ›  chris

oracle文本:如何清理用户输入

  •  3
  • chris  · 技术社区  · 16 年前

    如果有人有使用Oracle文本的经验( CTXSYS.CONTEXT ),我想知道当用户想要搜索可能包含撇号的名称时,如何处理用户输入。

    在某些情况下,逃离“似乎是可行的,但在单词结尾的“for”不起作用-s在停止词列表中,因此似乎被删除。

    我们目前将简单的查询文本(即任何只是字母的内容)更改为 %text% ,例如:

    contains(field, :text) > 0
    

    寻找 奥尼尔 作品,但 不。

    有人使用oracle文本处理过这个问题吗?

    3 回复  |  直到 10 年前
        1
  •  2
  •   KarlP    13 年前

    用反斜杠转义所有特殊字符。大括号不能用于子字符串搜索,因为它们定义了完整的标记。例如,%{ello}%与标记“hello”不匹配

    转义空格字符将包含在搜索标记中,因此搜索字符串'%stay\near\me%'将被视为文字字符串“stay near me”,并且不会调用'near'运算符。

    如果要为短字符串(如名称等)编制索引,并且希望Oracle文本的行为与LIKE运算符完全相同,则必须编写自己的lexer,该lexer不会为单个单词创建标记。(很遗憾,catsearch不支持子字符串搜索…)

    将搜索更改为使用Oracle文本的语义(具有标记匹配)可能是一个好主意,但对于某些应用程序,多个(短)标记和数字标记的通配符扩展将为搜索字符串创建太多的点击,而用户可以合理地预期其工作。

    例如,如果索引数据中有大量数字标记,则搜索%i\am\number\9%很可能失败,因为在返回结果之前,必须搜索并合并以“i”结尾和以“9”开头的所有标记。

    “i”和“am”可能也在默认的停止列表中,将被完全忽略,因此对于这个假设应用程序,如果这些标记很重要,则可以使用空的停止列表。

        2
  •  0
  •   Community CDub    8 年前

    使用 PARAMETERS('STOPLIST ctxsys.empty_stoplist') 当索引将包含索引中的所有字母标记时。重音字符也被编入索引。基本词汇表通常将非字母字符视为空白。

    此外,上下文语法使用了许多运算符,包括符号和保留字,如within、near、about。这些都必须在输入中以某种方式转义。如果需要搜索子字符串,正确的转义方法是转义 全部的 字符 \ . 这是对一个相关问题的回答: Oracle text escaping with curly braces and wildcards . 如果您的要求是搜索整个术语(名称等),可以使用更简单的 {input} 逃逸。

        3
  •  -2
  •   Bhargav Rao rlgjr    6 年前

    忘了消毒。为什么?参照 http://en.wikipedia.org/wiki/SQL_injection .

    这取决于您使用的数据库接口api的类型。Perl DBI、ODBC、JDBC支持参数化查询或准备好的语句。如果你使用的是本地dbi,但它不支持它,那么上帝保佑你。