DBMS_SEARCH APIを使用したハイブリッド・ベクトル索引の作成

DBMS_SEARCHパッケージは、複数のソースが検索に使用される場合にハイブリッド・ベクトル索引の作成、管理および問合せを行うためのプロシージャおよびファンクションを提供します。ソースには、DBMS_SEARCHドキュメントで説明されている表およびビューが含まれます。

CREATE_INDEXプロシージャは、ハイブリッド・ベクトル索引の作成に使用できます。

構文:
DBMS_SEARCH.CREATE_INDEX(
    index_name       VARCHAR2,
    tablespace       VARCHAR2 DEFAULT NULL,
    datatype         VARCHAR2 DEFAULT NULL,
    lexer            VARCHAR2 DEFAULT NULL,
    stoplist         VARCHAR2 DEFAULT NULL,
    wordlist         VARCHAR2 DEFAULT NULL,
    vectorizer       VARCHAR2 DEFAULT NULL
);

構文には、テキスト検索とベクトル検索の両方のプリファレンスを定義できるパラメータが含まれています。パラメータlexerstoplistおよびwordlistを使用して、ハイブリッド・ベクトル索引のテキスト・プリファレンスを指定できます。また、パラメータvectorizerを使用して、ハイブリッド検索のベクトル・プリファレンスを指定できます。vectorizerパラメータを使用する場合は、最初にDBMS_VECTOR_CHAIN.CREATE_PREFERENCE PL/SQLファンクションを使用してベクトル化・プリファレンスを作成する必要があります。詳細は、CREATE_PREFERENCEを参照してください。ベクトル化プリファレンスを作成した後、vectorizerパラメータを使用してプリファレンス名を渡すことができます。lexerstoplistおよびwordlistは、CREATE_PREFERENCEおよびCREATE_STOPLISTファンクションを使用して定義できます。

例:

次の例では、lexer、stoplist、wordlistおよびvectorizerを定義するサンプル・コードも示します。

 exec CTX_DDL.CREATE_PREFERENCE('my_lexer','BASIC_LEXER');
 exec CTX_DDL.CREATE_STOPLIST('my_stoplist','BASIC_STOPLIST');
 exec CTX_DDL.CREATE_PREFERENCE('my_wordlist','BASIC_WORDLIST');

begin
    DBMS_VECTOR_CHAIN.CREATE_PREFERENCE(
       PREF_NAME => 'my_vectorizer_spec',
       PREF_TYPE =>  DBMS_VECTOR_CHAIN.VECTORIZER,
       PARAMS    => json(
                         '{"vector_idxtype" : "ivf",
                           "model"          : "ALL_MINILM_L12",
                           "by"             : "words",
                           "max"            : "100",
                           "overlap"        : "10",
                           "split"          : "recursively",
                           "language"       : "english"
                          }'));
 end;
 /

 begin
    DBMS_SEARCH.CREATE_INDEX(
       index_name => 'my_hybrid_idx',
       datatype   => 'JSON',
       lexer      => 'my_lexer',
       stoplist   => 'my_stoplist',
       wordlist   => 'my_wordlist',
       vectorizer => 'my_vectorizer_spec');
 end;
/

DBMS_SEARCHパッケージには、異なるスキーマからDBMS_SEARCH索引に1つ以上のデータ・ソース(表、ビューまたは二面性ビュー)を追加できるプロシージャADD_SOURCEも含まれています。

構文:
DBMS_SEARCH.ADD_SOURCE (
index_name      VARCHAR2,
source_name     VARCHAR2,
memory          VARCHAR2 DEFAULT NULL,
parallel_degree NUMBER DEFAULT NULL);
例:
exec DBMS_SEARCH.ADD_SOURCE('my_hybrid_idx','MYVIEW');
複数のソースを指定することもできます。ソースを同時に追加するのではなく、順次追加することをお薦めします。上で作成した同じ索引(my_hybrid_idx)に2つのソースを追加できる例を次に示します:
exec DBMS_SEARCH.ADD_SOURCE('my_hybrid_idx','MYVIEW1');
exec DBMS_SEARCH.ADD_SOURCE('my_hybrid_idx','MYVIEW2');
ctx_user_index_partitionsビューを問い合せて、ソースが索引に追加され、問合せの準備ができているかどうかを確認できます。この問合せでは、
select ixp_index_partition_name, ixp_status from ctx_user_index_partitions 
where IXP_INDEX_NAME = 'my_hybrid_idx' and IXP_PARTITION_NAME LIKE ‘DSR$’;
ソースのステータスが「INDEXED」と表示され、索引付けされ、問合せの準備ができていることが示されます。出力例を次に示します:
IXP_INDEX_PARTITION_NAME                               IXP_STATUS
------------------------------------------------------------------- 
DSR$1                                                  INDEXED
DSR$2                                                  INDEXED
IVF索引を使用してハイブリッド・ベクトル索引を作成する場合、ソースの追加後に索引のrebuildを実行することをお薦めします。この例ではIVF索引を使用しているため、すべてのソースが索引付けされたら次のコマンドを実行します:
alter index DR$ARTICLES_IDX$VI rebuild online;

DBMS_SEARCHパッケージに含まれるプロシージャを使用すると、データ・ソースとそのすべての関連データを索引から削除することや、索引とそのすべての関連データをデータベースから削除すること、指定されたソース・メタデータの仮想索引付きJSONドキュメントを返すこと、ヒットリストを取得すること、指定されたフィルタ条件に基づいてJSONドキュメントを集約することも可能になります。プロシージャ、構文、使用方法、制限などの詳細は、DBMS_SEARCHパッケージを参照してください。