在Oracle中,Contains operator的全文搜索语法是:
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 :(得分: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
。
答案 1 :(得分: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