2008-10-20 64 views
3

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

转义'似乎在某些情况下工作,但不是在词的末尾 - s在停用词列表中,因此似乎被删除。

目前,我们改变简单的查询文本(即任何东西,这只是字母)%text%,例如:

contains(field, :text) > 0 

一种奥尼尔作品搜索,但乔的没有。

有没有人使用Oracle Text处理过这个问题?

回答

-2

忘记消毒。为什么?请参阅http://en.wikipedia.org/wiki/SQL_injection

你正在使用什么样的数据库接口API? Perl DBI,ODBC,JDBC支持参数化查询或预准备语句。如果您使用的是本地DBI并且不支持它,那么上帝保佑您。

+3

实际上并没有涉及到这个问题。 Oracle Text搜索参数是使用特定语法定义的,并由搜索引擎进行分析。 (基本上是一堆存储过程)准备好的语句根本无济于事。如果api不应该呈现给用户,则必须转义特殊字符和保留字。 – KarlP 2012-01-26 22:24:22

2

用反斜杠转义所有特殊字符。大括号在子字符串搜索中不起作用,因为它们定义了完整的令牌。例如%{ello}%不会与令牌'Hello'匹配

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

如果您将短字符串(如姓名等)编入索引并且希望Oracle Text的行为与like运算符完全相同,则必须编写自己的词法分析器,该词法分析器不会为单个词创建令牌。 (不幸的是,CATSEARCH不支持子字符串搜索...)

这可能是一个好主意,更改搜索使用oracle文本的语义和令牌匹配,但对于某些应用程序,多个(短)令牌的通配符扩展而数字标记会为用户合理期望的搜索字符串创建太多的匹配。

例如,如果索引数据中有很多数字标记,搜索“%I \ AM \ NUMBER \ 9%”很可能会失败,因为所有以'I'结尾并以'9开头的标记'必须在返回结果之前进行搜索和合并。

'I'和'AM'可能也在默认停止列表中,并且将被完全忽略,因此对于此假设应用程序,如果这些标记非常重要,则可以使用空终止列表。

0

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

另外,CONTEXT语法使用很多包含符号和保留字(如WITHIN,NEAR,ABOUT)的运算符。这些都必须在输入中以某种方式逃脱。如果您需要搜索子字符串,正确的转义方法是使用\转义全部个字符。这是相关问题的答案:Oracle text escaping with curly braces and wildcards。如果您的要求是搜索整个条款(名称等),则可以使用更简单的{input}转义。