Oracle DB 23aiでVectorデータを扱ってみる

はじめに
---
Orace Database 23aiでは、一つのデータベース内で他の型のデータと同じようにベクトル型のデータを扱うことができます。以下のリンク先の記事で作成したBase DB 23aiを利用して、ベクトル型のデータを格納するテーブルを作成し、ベクトルデータの簡単な操作をしてみましょう。

https://qiita.com/cedar-mt/items/5434e581890909177399


Base Database Serviceへのログイン
---

１．SSH端末の起動
アクセス先のIPはOCIのコンソールから確認可能です。Resourcesのノードの項目を押下し、パブリックIPアドレスを確認してください。

![スクリーンショット 2024-06-03 183301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13992/6fca412a-d33e-5768-78e1-034973735db8.png)


SSH端末を起動し、上記のパブリックIPアドレスを入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13992/49ed953f-ec41-7de6-2f2b-ca3a7da50352.png)



作成時に利用したSSHキーでBase DBのサーバにログインします。
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13992/422c308e-a721-4610-0905-cdfee1d41a57.png)

２．Base Database Serviceへのログイン


![login2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13992/5cd58d19-115f-5cf3-9695-d3d97d7f80d7.png)

３．データベースへのログイン
まずCDBへログインします。

![login3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13992/2323b625-7a9e-6da7-a301-0e57f609d765.png)


PDBへセッションを変更しましょう

![login4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13992/418f6502-539f-d92e-a947-b24acb59ab60.png)


:::note info
※PDB名はResources欄のプラガブル・データベースの項目から確認します。

![gamen3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13992/fc8fca34-f2e3-4be4-03fe-25521f899876.png)
:::

ベクトルデータベースの操作
---
１．ベクトルテーブル用のユーザーズ表領域の作成

```
SQL> CREATE TABLESPACE users_vector
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;

Tablespace created.
```
 
２．テーブルの作成

```
SQL> CREATE TABLE IF NOT EXISTS vt1
         (id   NUMBER NOT NULL,
          v    VECTOR(2, FLOAT32),
               PRIMARY KEY (id)
         )tablespace users_vector;
         
Table created.
```
３．テーブル構造の確認

```
SQL> DESC vt1;

 Name                 Null?    Type
 ------------------ ----------- --------------------
 ID                   NOT NULL   NUMBER
 V                               VECTOR(2, FLOAT32)

```
４．データの挿入

```
SQL> INSERT INTO vt1 VALUES (1, '[3, 3]'),  (2, '[5, 3]'),  (3, '[7, 3]'),
                       (4, '[3, 5]'),  (5, '[5, 5]'),  (6, '[7, 5]'),
                       (7, '[3, 7]'),  (8, '[5, 7]'),  (9, '[7, 7]');

SQL> COMMIT;

Commit complete.

```

ベクトル型のデータを操作する
----
:::note info 
※データを表示させる前に、SQLplusのコマンドを使って画面を整形しておくと表示が見やすくなります。
```
SET LINESIZE 150
SET PAGESIZE 50
COLUMN  ID FORMAT 99999
COLUMN  V FORMAT A50
```
:::

５．データの検索①
前のステップでinsertしたデータを見てみましょう。
```
SQL> select * from vt1;

 ID V
--- ---------------------------------------------------------------------------------------------------
  1 [3.0E+000,3.0E+000]
  2 [5.0E+000,3.0E+000]
  3 [7.0E+000,3.0E+000]
  4 [3.0E+000,5.0E+000]
  5 [5.0E+000,5.0E+000]
  6 [7.0E+000,5.0E+000]
  7 [3.0E+000,7.0E+000]
  8 [5.0E+000,7.0E+000]
  9 [7.0E+000,7.0E+000]

9 rows selected.

```
V列にベクトル型のデータが格納されていることを確認できましたね。


６．データの検索② 類似性検索

次に、VECTOR_DISTANCE関数を利用して類似性検索を実施してみましょう。
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_distance.html
※VECTOR_DISTANCE関数はベクトル間の距離を計算する関数です。

以下のSQLは二次元ベクトル間の距離を計算し、二次元ベクトル[3,7]に近い順でid列を取得しています。

```
SQL> select id from vt1 order by vector_distance(vector('[3,7]'),v,EUCLIDEAN);

 ID
---
  7
  8
  4
  5
  9
  1
  6
  2
  3

9 rows selected.

SQL>

9 rows selected.
SQL>
```

まとめ
---
これで初歩的なOracle DB 23aiでのVectorデータの扱いは終わりです。
より詳細なチュートリアルは以下を参考にしてください。

Oracle AI Vector Search - Basics
https://apexapps.oracle.com/pls/apex/f?p=133:180:107575359445892::::wid:1070