3

Oracle では、 Contains 演算子の全文検索構文は次のとおりです。

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

つまり、text_query の長さは 4000 文字を超えることはできません。そうしないと、エラーが発生します。多くの場合、4000 文字を超える text_query を繰り返し使用しています。オラクルの専門家として、可能であればそのような制限をどのように回避することをお勧めしますか?

簡単に 4000 に到達する状況をさらに明確にするために、多数の Contains クエリ演算子を組み合わせて 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 を使用してこれを組み立てる必要があります。null 検索語を CONTAINS() に渡すと hurl になることに注意してください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 に答える