Oracle 23c DBMS_SEARCH - ユビキタス検索 (2023/06/26)

Oracle 23c DBMS_SEARCH - ユビキタス検索 (2023/06/26)

https://oralytics.com/2023/06/26/oracle-23c-dbms_search-ubiquitous-search/


Oracle 23cを含む新しいPL/SQLパッケージの1つは、DBMS_SEARCHです。これは、単一の索引内の複数のスキーマ・オブジェクトの索引付け(および検索)に使用できます。


DBMS_SEARCHのドキュメントを確認してください。


このタイプの索引は、従来の索引とは少し異なります。DBMS_SEARCHを使用すると、単一の索引のみを使用して、複数のスキーマ・オブジェクトに索引を作成できます。これにより、複数のオブジェクト間でデータを検索する必要があるシナリオの索引付け機能が強化されます。1つの表の複数の列に対してユビキタス検索索引を作成することも、特定のスキーマ内の異なる表の複数の列に対してユビキタス検索索引を作成することもできます。すべては、倍数を使用するのではなく、1つの索引を使用して行われます。この検索機能の幅が広いため、この(DBMS_SEARCH)はユビキタス検索索引と呼ばれます。ユビキタス検索索引は、JSON検索索引であり、全文および範囲ベースの検索に使用できます。


索引を作成するには、まず索引の名前を定義してから、その索引に様々なスキーマ・オブジェクト(表、ビュー)を追加します。索引を作成する主なコマンドは次のとおりです。


  • DBMS_SEARCH.CREATE_INDEX
  • DBMS_SEARCH.ADD_SOURCE


ノート: ADD_SOURCEで使用される各表には、主キーが必要です。


次に、HRスキーマ/データ・セットを使用してこのタイプの索引を使用する例を示します。


exec dbms_search.create_index('HR_INDEX');


これにより、索引ヘッダーが作成されます。



重要: このメソッドを使用して作成された索引ごとに、スキーマに索引名の表が作成されます。また、スキーマに14のDR$表が作成されます。SQL Developerのフィルタリングは、これらを非表示にし、混乱を最小限に抑えるのに役立ちます。


select table_name from user_tables;
...
HR_INDEX
DR$HR_INDEX$I      
DR$HR_INDEX$K      
DR$HR_INDEX$N      
DR$HR_INDEX$U      
DR$HR_INDEX$Q      
DR$HR_INDEX$C      
DR$HR_INDEX$B      
DR$HR_INDEX$SN     
DR$HR_INDEX$SV     
DR$HR_INDEX$ST     
DR$HR_INDEX$G     
DR$HR_INDEX$DG    
DR$HR_INDEX$KG  


索引にコンテンツおよび検索領域を追加するには、ADD_SOURCEを使用する必要があります。次に、索引に2つの表を追加します。


exec DBMS_SEARCH.ADD_SOURCE('HR_INDEX', 'EMPLOYEES');


ノート: この記事の執筆時点では、一部のクライアント・ツールおよびライブラリはJSONデータ型を完全にサポートしていません。その場合は、索引メタデータを問い合せるだけで済みますが、すべてのツールおよびライブラリがデータ型を完全にサポートするまでは、JSON_SERIALIZE関数を使用してメタデータを変換する必要があります。メタデータを問い合せてデータが返されない場合は、このファンクションを使用してデータを取得します。


索引から単純選択を実行すると、JSONタイプがクライアント・ソフトウェアに完全に実装されていないためにエラーが発生する可能性があります。(時間とともに変化します)


select * from HR_INDEX;


しかし、インデックスからカウントを行うと、そこに含まれるオブジェクトの数を取得できます。


select count(*) from HR_INDEX;
   COUNT(*) 
___________ 
        107 


仮想ドキュメントを表示することで、索引付けされたデータを表示できます。


select json_serialize(DBMS_SEARCH.GET_DOCUMENT('HR_INDEX',METADATA))
from HR_INDEX;

JSON_SERIALIZE(DBMS_SEARCH.GET_DOCUMENT('HR_INDEX',METADATA))                                                                                                                                                                                                               
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 
{"HR":{"EMPLOYEES":{"PHONE_NUMBER":"515.123.4567","JOB_ID":"AD_PRES","SALARY":24000,"COMMISSION_PCT":null,"FIRST_NAME":"Steven","EMPLOYEE_ID":100,"EMAIL":"SKING","LAST_NAME":"King","MANAGER_ID":null,"DEPARTMENT_ID":90,"HIRE_DATE":"2003-06-17T00:00:00"}}}              
{"HR":{"EMPLOYEES":{"PHONE_NUMBER":"515.123.4568","JOB_ID":"AD_VP","SALARY":17000,"COMMISSION_PCT":null,"FIRST_NAME":"Neena","EMPLOYEE_ID":101,"EMAIL":"NKOCHHAR","LAST_NAME":"Kochhar","MANAGER_ID":100,"DEPARTMENT_ID":90,"HIRE_DATE":"2005-09-21T00:00:00"}}}            
{"HR":{"EMPLOYEES":{"PHONE_NUMBER":"515.123.4569","JOB_ID":"AD_VP","SALARY":17000,"COMMISSION_PCT":null,"FIRST_NAME":"Lex","EMPLOYEE_ID":102,"EMAIL":"LDEHAAN","LAST_NAME":"De Haan","MANAGER_ID":100,"DEPARTMENT_ID":90,"HIRE_DATE":"2001-01-13T00:00:00"}}}               
{"HR":{"EMPLOYEES":{"PHONE_NUMBER":"590.423.4567","JOB_ID":"IT_PROG","SALARY":9000,"COMMISSION_PCT":null,"FIRST_NAME":"Alexander","EMPLOYEE_ID":103,"EMAIL":"AHUNOLD","LAST_NAME":"Hunold","MANAGER_ID":102,"DEPARTMENT_ID":60,"HIRE_DATE":"2006-01-03T00:00:00"}}}         
{"HR":{"EMPLOYEES":{"PHONE_NUMBER":"590.423.4568","JOB_ID":"IT_PROG","SALARY":6000,"COMMISSION_PCT":null,"FIRST_NAME":"Bruce","EMPLOYEE_ID":104,"EMAIL":"BERNST","LAST_NAME":"Ernst","MANAGER_ID":103,"DEPARTMENT_ID":60,"HIRE_DATE":"2007-05-21T00:00:00"}}}  


CONTAINSまたはJSON_TEXTCONTAINS関数を使用して、特定のデータのメタデータを検索できます。


select json_serialize(metadata) 
from DEMO_IDX 
where contains(data, 'winston')>0;

select json_serialize(metadata) 
from DEMO_IDX
where json_textcontains(data, '$.HR.EMPLOYEES.FIRST_NAME', 'Winston');


索引が不要になった場合は、次を実行して削除できます。DROP INDEXコマンドは、一部のオブジェクトを削除して他のオブジェクトを残すため実行しないでください。別の名前を指定しないかぎり、索引は再作成できません。


exec dbms_search.drop_index('SH_INDEX');


コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)