3

在 Oracle 中,包含运算符的全文搜索语法为:

 CONTAINS(
          [schema.]column,
          text_query    VARCHAR2
          [,label       NUMBER]) RETURN NUMBER;

这意味着 text_query 不能超过 4000 个字符,否则会发生错误。在许多情况下,我反复让 text_query 超过 4000 个字符。作为 Oracle 专家,如果可能的话,您会如何建议绕过这种限制?

进一步澄清一下容易达到 4000 的情况是,如果你结合许多 包含查询运算符来构造你的 text_query,很有可能超过这样的 4000 个字符的限制。

4

2 回答 2

4

4000 个字符的限制不是任意的界限:它是 Oracle SQL 可以处理的 VARCHAR2 字符的最大数量。

4000 个字符是很多文本。在英语中,它大约是 600 字,或者是 A4 页面和一些合理的点字体。我能想到的应用程序并不多,需要搜索如此大量的废话。即使是大学检查学生的论文是否抄袭也不会超过段落级别。

但是,如果您确实遇到这样的情况,即在很少的 4000 个字符上进行匹配会产生误报,您所能做的就是将查询字符串分成块并在它们上进行搜索。这意味着您必须使用 PL/SQL:

create or replace function big_search (p_search_text in varchar2) 
    return sys_refcursor
is
    return_value sys_refcursor;
    p_srch1 varchar2(4000);
    p_srch2 varchar2(4000);
begin

    dbms_output.put_line('search_length='||to_char(length(p_search_text)));

    p_srch1 := substr(p_search_text, 1, 4000);
    p_srch2 := substr(p_search_text, 4001, 4000);


    open return_value for 
        select docname
                , (score(1) + score(2))/2 as score
        from t23
        where contains ( text_column, p_srch1 , 1) != 0
        and  contains ( text_column, p_srch2 , 2) != 0;

    return return_value;
end;
/

如果您事先不知道搜索文本的大小,则需要使用动态 SQL 来组装它。请注意,将空搜索字词传递给 CONTAINS() 将抛出DRG-50901: text query parser syntax error.

于 2010-06-25T09:55:15.063 回答
3

当前版本现在支持 CLOB 参数

CONTAINS(
     [schema.]column,
     text_query    [VARCHAR2|CLOB]
     [,label       NUMBER])
RETURN NUMBER;

http://docs.oracle.com/cd/B28359_01/text.111/b28304/csql.htm#i997503

于 2012-12-28T14:20:58.463 回答