2010-06-25 55 views
2

在Oracle,的Contains operator全文搜索的语法是:如何在Oracle的CONTAINS运算符中绕过4000个字符的text_query限制?

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

这意味着text_query不能超过4000个字符长或将发生错误。在很多情况下,我反复使用text_query的长度超过4000个字符。作为Oracle专家,你会如何建议在可能的情况下避开这种限制?

为了进一步阐明4000很容易达到的情况,如果你组合了许多Contains Query Operators来构造你的text_query,它很可能超过4000个字符的限制。

+0

一个VARCHAR2表列的极限是4000个字符,但在PL/SQL一个VARCHAR2变量的上限为32767个字符。您确定CONTAINS语句中的文本查询限制为4000而不是32767? – 2010-06-25 09:18:27

+1

@MarkBaker - CONTAINS()是一个SQL函数,所以SQL限制适用。 – APC 2010-06-25 09:57:59

+0

@APC谢谢澄清,我从来没有真正使用Oracle的文本索引,所以我不确定 – 2010-06-25 10:01:14

回答

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

+0

+1我在想同样的事情,但没有文本搜索请求者的回答。 – 2010-06-25 11:22:13

+0

这种情况可能需要动态SQL,谁能给出更多的指针? – hko19 2010-06-25 22:40:32

+0

当上面的搜索文本是由各种查询操作符动态构建的,并且总长度超过4000时,呈现的逻辑强行将查询文本分解为4000个片段,并且“和”它们一起导致错误的结果或语法错误。 – hko19 2010-07-02 17:58:38

相关问题