2010-06-25 60 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

相關問題