如何在Oracle'中获得4000个字符左右的文本查询限制;s包含运算符?

如何在Oracle'中获得4000个字符左右的文本查询限制;s包含运算符?,oracle,full-text-search,oracle-text,Oracle,Full Text Search,Oracle Text,在Oracle中,的全文搜索语法为: 这意味着文本查询的长度不能超过4000个字符,否则将发生错误。在许多情况下,我反复使用长度超过4000个字符的文本查询。作为甲骨文专家,如果可能的话,您会如何建议绕过这样的限制 为了进一步澄清容易达到4000个字符的情况,如果将多个字符组合在一起构造文本查询,则很可能超过4000个字符的限制 4000个字符的限制不是任意的边界:它是Oracle SQL可以处理的VARCHAR2字符的最大数量 4000个字符是大量的文本。在英语中大约有600个单词,或者说是一

在Oracle中,的全文搜索语法为:

这意味着文本查询的长度不能超过4000个字符,否则将发生错误。在许多情况下,我反复使用长度超过4000个字符的文本查询。作为甲骨文专家,如果可能的话,您会如何建议绕过这样的限制


为了进一步澄清容易达到4000个字符的情况,如果将多个字符组合在一起构造文本查询,则很可能超过4000个字符的限制

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语法错误

当前版本现在支持CLOB参数

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

VARCHAR2表列的限制为4000个字符,而PL/SQL中VARCHAR2变量的限制为32767个字符。您确定CONTAINS语句中的文本查询限制为4000而不是32767吗?@MarkBaker-CONTAINS()是一个SQL函数,因此SQL限制适用。@APC感谢您的澄清,我从来没有实际使用过Oracle的文本索引,所以我不确定+1我也这么认为,但不具备文本搜索需要回答的知识。这种情况可能需要动态SQL,有人能给出更多的指针吗?当上面的搜索文本是由各种查询运算符动态构造的,总长度超过4000时,提出的将查询文本强制拆分为4000个片段并将它们“and”组合在一起的逻辑会导致错误的结果或语法错误。上述操作不起作用,因为代码会将语句分割为任意块-一个或多个块可能不是有效的SQL子句,从而导致异常。
CONTAINS(
     [schema.]column,
     text_query    [VARCHAR2|CLOB]
     [,label       NUMBER])
RETURN NUMBER;