16 DBMS_SEARCHパッケージ
DBMS_SEARCH PL/SQL
パッケージでは、テキストおよび範囲ベースのユビキタス・データベース検索のための検索索引の作成、管理および問合せのプロシージャおよびファンクションが提供されます。
名前 | 説明 |
---|---|
ユビキタス検索索引を作成します。表およびビューのセットをデータ・ソースとしてこの索引に追加できます。 |
|
表またはビューをデータ・ソースとして索引に追加します。 |
|
表またはビューとそのすべての関連データを索引から削除します。 |
|
検索索引および関連するすべてのデータをデータベースから削除します。 |
|
指定されたソース・メタデータの、索引付けされた仮想JSONドキュメントを返します。 |
|
ヒットリストを取得し、指定されたフィルタ条件に基づいてJSONドキュメントの集計をファセット化します。 |
16.1 CREATE_INDEX
DBMS_SEARCH.CREATE_INDEX
プロシージャにより、複数のスキーマ・オブジェクトにわたる全文および範囲ベースの検索のためのユビキタス検索索引を作成します。
ノート
-
DBMS_SEARCH.CREATE_INDEX
プロシージャを実行すると、事前定義されている一連のプリファレンスおよび設定を使用してJSON検索索引が作成され、複数の列、表およびビューに対して全文検索を実行できるようになります。INDEX_NAME
という名前の索引表が、DATA
列とMETADATA
列を使用して作成されます。この表は、OWNER
およびSOURCE
によってパーティション化されます。ここでのOWNER
は表の所有者名を示し、SOURCE
はデータの索引付け元の表またはビューの名前を示しています。 -
データ・ソースとして表またはビューを索引に追加することで、どの表またはビューを索引付けするか定義できます。これらの表またはビューのすべての列が索引付けされます。データ・ソースを管理するには、
DBMS_SEARCH.ADD_SOURCE
およびDBMS_SEARCH.REMOVE_SOURCE
プロシージャを使用します。 -
DBMS_SEARCH
索引は、デフォルトの次の索引付けプリファレンスを使用して作成されます:プリファレンス 説明 BASIC_WORDLIST
高速ワイルドカード検索のためにワイルドカード索引付けを有効にします。
SEARCH_ON
特定のデータ型に対する全文検索問合せと範囲検索問合せの両方を許可します。サポートされているデータ型は、
NUMBER
(数値の索引付けの場合)およびTIMESTAMP
(日時値の索引付けの場合)です。SYNC
およびOPTIMIZE
事前定義された間隔で、バックグラウンドで自動的に
DBMS_SEARCH
索引を同期し最適化します。この索引に対してSYNC_INDEX
操作とOPTIMIZE_INDEX
操作を実行する必要はありません。 -
この索引を問い合せるには、
INDEX_NAME
表に対してCONTAINS()
、JSON_TEXTCONTAINS()
およびJSON_EXISTS
演算子を使用します。
構文
DBMS_SEARCH.CREATE_INDEX( index_name VARCHAR2, tablespace VARCHAR2 DEFAULT NULL );
例
CREATE TABLESPACE tbs_02 DATAFILE 'dt.dbf' size 100MB segment space management auto; exec DBMS_SEARCH.CREATE_INDEX('MYINDEX','tbs_02');
16.2 ADD_SOURCE
DBMS_SEARCH.ADD_SOURCE
プロシージャにより、様々なスキーマからの1つ以上のデータ・ソース(表またはビュー)をDBMS_SEARCH
索引に追加します。
ノート
-
データ・ソースを追加するには、索引所有者に、そのソースへの
SELECT
およびDML
アクセス権が必要です。 -
複数の表またはビューをデータ・ソースとして
DBMS_SEARCH
索引に追加できます(ビューをマテリアライズする必要はない)。すべてのデータ・ソース(表、ビュー、またはビュー定義内の各表)に、少なくとも1つのPrimary Key
列が含まれている必要があります。この索引には、コンポーネント表との
primary key
およびforeign key
関係があるビューのみを追加できます。ビュー・ソース内のすべてのコンポーネント表にも、primary key
およびforeign key
関係が定義されている必要があります。 -
DBMS_SEARCH
索引では、サポートされているすべてのSQLデータ型(Object Type
列を含む)がJSONオブジェクトに格納されます(XMLTYPE
およびLONG
データ型を除く)。つまり、表またはビューは、XMLTYPE
またはLONG
データ型の列がある場合は、データ・ソースとして索引に追加できません。JSONデータ型の許容される最大長は32 MBです。 -
DBMS_SEARCH.ADD_SOURCE
プロシージャを実行すると、事前定義された間隔でバックグラウンド・ジョブが作成されて、DBMS_SEARCH
索引が、すべてのデータ・ソースに対するDML変更と同期され、最適化されます。この索引に対してSYNC_INDEX
およびOPTIMIZE_INDEX
操作を明示的に実行する必要はありません。
構文
DBMS_SEARCH.ADD_SOURCE(
index_name IN VARCHAR2,
source_name IN VARCHAR2);
例
exec DBMS_SEARCH.ADD_SOURCE('MYINDEX','MYTABLE');
exec DBMS_SEARCH.ADD_SOURCE('MYINDEX','MYVIEW');
16.3 REMOVE_SOURCE
DBMS_SEARCH.REMOVE_SOURCE
プロシージャにより、DBMS_SEARCH
索引から1つ以上のデータ・ソース(表またはビュー)を削除します。
このプロシージャを実行すると、索引付けされたすべてのデータが削除され、関連するデータ・ソース(表またはビュー)に対する索引付け操作またはメンテナンス操作が停止されます。
構文
DBMS_SEARCH.REMOVE_SOURCE(
index_name VARCHAR2,
source_name VARCHAR2);
例
exec DBMS_SEARCH.REMOVE_SOURCE('MYINDEX','MYTABLE');
16.4 DROP_INDEX
DBMS_SEARCH.DROP_INDEX
プロシージャにより、DBMS_SEARCH
索引、およびそれに関連するすべてのデータをデータベースから削除します。
例
exec DBMS_SEARCH.DROP_INDEX('MYINDEX');
16.5 GET_DOCUMENT
DBMS_SEARCH.GET_DOCUMENT
プロシージャでは、索引付けされたデータ・ソース(表またはビュー)の特定の行について、JSON検索索引で索引付けされているのと同じように、索引付けされた仮想JSONドキュメントが返されます。
構文
DBMS_SEARCH.GET_DOCUMENT(
index_name VARCHAR2,
metadata JSON
);
例
SELECT DBMS_SEARCH.GET_DOCUMENT('MYINDEX',METADATA) from MYINDEX;
16.6 FIND
DBMS_SEARCH.FIND
プロシージャにより、ヒットリストを取得し、指定された、例による問合せ(QBE)フィルタ条件に基づいて、JSONドキュメントの集計をファセット化します。
JSONデータの様々なフィールドに対して集計を計算できます。この問合せでは、ファセット・ナビゲーションおよび集計をサポートするJSON結果セット・インタフェースに、検索結果がリストされます。
構文
DBMS_SEARCH.FIND(
index_name VARCHAR2,
search_QBE JSON);
- index_name
-
問合せを実行する索引の名前を指定します。
- search_QBE
-
JSONでの
result_set_descriptor
パラメータ値を指定します。結果セットに含む内容を示します。JSON形式の入力結果セット記述子は、$query
、$search
および$facet
部分からなります:{ "$query":text query and filter conditions, "$search":search result specifications, "$facet":faceted result specifications }
これらの各JSONオブジェクトの詳細は、「JSON形式の入力結果セット記述子」を参照してください。
JSON形式の出力結果セット記述子は次の部分からなります:
"$count":number "$hit":[ hit_object_1, ..., hit_object_i , ... ] "$facet":[ facet_object_1, ..., facet_object_i, ...]
これらの各JSONオブジェクトの詳細は、「JSON形式の結果セットの出力」を参照してください。
例
SET FEEDBACK 1
SET NUMWIDTH 10
SET LINESIZE 80
SET TRIMSPOOL ON
SET TAB OFF
SET PAGESIZE 100
connect sys/knl_example as sysdba;
Connected.
grant connect,resource, unlimited tablespace, ctxapp
to u1 identified by u1;
Grant succeeded.
connect u1/u1;
Connected.
create table tbl(id number primary key, jsn_col clob check(jsn_col is json));
Table created.
INSERT INTO tbl
VALUES (1,'{ "zebra" : { "price" : [2000,1000],
"name" : "Marty",
"stripes" : ["Dark","Light"],
"handler" : "Bob", "sold" : true }}');
1 row created.
INSERT INTO tbl
VALUES (2,'{ "zebra" : { "rating": 5, "price" : 1000,
"name" : "Zigby",
"stripes" : ["Light","Grey"],
"handler" : "Handy Marty", "sold" : "true" }}');
1 row created.
INSERT INTO tbl
VALUES (3,'{ "zebra" : { "rating": 4.5, "price" : 3000,
"name" : "Zigs",
"stripes" : ["Grey","Dark"],
"handler" : "Handy Marty", "sold" : false }}');
1 row created.
INSERT INTO tbl
VALUES (4,'{ "zebra" : { "rating": "4.5", "price" : "3000",
"name" : "Zigs",
"stripes" : ["Grey","Dark"],
"handler" : "Handy Marty", "sold" : null }}');
1 row created.
commit;
Commit complete.
DBMS_SEARCH.CREATE_INDEX
プロシージャを使用してDBMS_SEARCH
索引を作成し、索引にソース表を追加します: SQL> exec DBMS_SEARCH.CREATE_INDEX('JIDX');
PL/SQL procedure successfully completed.
SQL> exec DBMS_SEARCH.ADD_SOURCE('JIDX','TBL');
PL/SQL procedure successfully completed.
SQL>
DBMS_SEARCH.FIND
プロシージャを実行します:Query: All zebras having name starting with Zig or having name Marty and
having a price greater than equal to 2000
Facets: For all zebras that satisfy the query, do the following
-- 1. Get the count of zebras per zebra handler
-- 2. Get the minimum zebra rating
-- 3. Get the count of zebras for each unique stripe color
select DBMS_SEARCH.FIND('JIDX',JSON('
{
"$query": { "$and" : [
{ "U1.TBL.JSN_COL.zebra.name" : { "$contains" : "Zig% or Marty" } },
{ "U1.TBL.JSN_COL.zebra.price" : { "$gte" : 2000 } }
]
},
"$facet" : [
{ "$uniqueCount" : "U1.TBL.JSN_COL.zebra.handler" },
{ "$min" : "U1.TBL.JSN_COL.zebra.rating" },
{ "$uniqueCount" : "U1.TBL.JSN_COL.zebra.stripes" }
]
}'));
FIND_RESULT
--------------------------------------------------------------------------------
{
"$count" : 3,
"$facet" :
[
{
"U1.TBL.JSN_COL.zebra.handler" :
[
{
"value" : "Handy Marty",
"$uniqueCount" : 2
},
{
"value" : "Bob",
"$uniqueCount" : 1
}
]
},
{
"U1.TBL.JSN_COL.zebra.rating" :
{
"$min" : 4.5
}
},
{
"U1.TBL.JSN_COL.zebra.stripes" :
[
{
"value" : "Dark",
"$uniqueCount" : 3
},
{
"value" : "Grey",
"$uniqueCount" : 2
},
{
"value" : "Light",
"$uniqueCount" : 1
}
]
}
]
}
1 row selected.
connect sys/knl_example as sysdba;
Connected.
drop user u1 cascade;
User dropped.