23.1 Oracle SQL条件JSON_TEXTCONTAINS
SELECT
文のCASE
式またはWHERE
句でOracle SQL条件json_textcontains
を使用して、JSONデータの全文検索を実行できます。
条件json_textcontains
は、Oracle Textテクノロジに基づいています。この条件は、後者がパラメータINPATH
を使用する場合、SQLファンクションcontains
のように動作します。json_textcontains
の検索パターン引数の構文は、SQLファンクションcontains
の構文と同じです。たとえば、これは、他のテキスト付近にあるテキストを問い合せたり、問合せであいまいパターン一致を使用できるということです。検索パターン引数に、Oracle Textの検索で予約されている文字または単語が含まれる場合は、その文字または単語をエスケープする必要があります。
条件json_textcontains
を使用するには、最初に次のいずれかを行う必要があります。そうしないと、json_textcontains
を使用したときにエラーが発生します。(両方を実行することはできません。これを試みると、エラーが発生します。)
-
JSON列のJSON検索索引を作成します。
-
問合せ対象のJSONデータの列をインメモリー列ストア(IM列ストア)に格納し、キーワード
TEXT
を指定します。列のデータ型はJSON
である必要があり、そうしないとエラーが発生します。(JSON
型は、データベース初期化パラメータcompatible
が少なくとも20
である場合にのみ使用できます。)
ノート:
JSON検索索引では、デフォルトで、大文字と小文字を区別しない検索がサポートされています。大文字と小文字を区別した索引付けを使用可能または使用禁止にするには、索引の作成時にBASIC_LEXER
プリファレンスのmixed_case
属性を使用します。『Oracle Textリファレンス』のBASIC_LEXERを参照してください。
ノート:
Oracle SQLファンクションjson_textcontains
を使用すると、JSONデータの強力な全文検索を実行できます。単純な文字列のパターン一致のみが必要な場合は、かわりにパス式フィルタ条件をhas substring
、starts with
、like
、like_regex
またはeq_regex
のいずれかのパターン一致比較とともに使用できます。
例23-1は、明細項目の部品の説明にキーワードMagic
が含まれる発注書を検索する全文問合せを示しています。
検索ヒット関連性に従ってjson_textcontains
によって返される結果を順序付けるには、オプションのスコアリングラベル引数を渡し、同じラベル番号のORDER BY SCORE
を使用します。例23-2に、これを示します。
関連項目:
-
Oracle SQL条件
json_textcontains
の詳細は、『Oracle Database SQL言語リファレンス』 -
Oracle Textの
contains
演算子の詳細は、Oracle TextリファレンスのOracle Text CONTAINS問合せ演算子を参照してください。 -
特殊文字を使用してドキュメントを索引付けするためのJSON検索索引の構成の詳細は、Oracle Textアプリケーション開発者ガイドの特殊文字を参照してください。
-
SQLファンクション
contains
の検索パターン(したがって、json_textcontains
の検索パターン)での特殊文字の使用の詳細は、Oracle TextリファレンスのOracle Text問合せの特殊文字を参照してください。 -
Oracle Text検索に関して予約されている単語および文字の詳細は、Oracle Textリファレンスの予約語を参照してください。また、それらのエスケープ方法は、Oracle Textリファレンスのエスケープ文字を参照してください。
-
SQLファンクション
CONTAINS
でSCORE
を使用する例は、『Oracle Textアプリケーション開発者ガイド』の「CONTAINS SQL例」を参照してください。 -
『Oracle Textリファレンス』の「SCORE」を参照してください。
例23-1 JSON_TEXTCONTAINSを使用したJSONデータの全文問合せ
SELECT data FROM j_purchaseorder
WHERE json_textcontains(data,
'$.LineItems.Part.Description',
'Magic');
例23-2 JSON_TEXTCONTAINS: SCOREを使用した関連性による問合せ結果のソート
この問合せでは、説明にテキストrun
が含まれる発注書の発注番号を選択します。オプションのスコアリングラベル引数を使用して、関連性によって結果を順序付けします。問合せにより、各発注書の関連性スコアも返されます。
json_textcontains
に渡されるスコアリング・ラベルは、SCORE
で使用されるラベルと同じである必要があります。この場合、ラベルは1
です。
リストされた最初の17件の発注書のスコアは18で、残りの85件の発注書のスコアは9です。前者のグループ一致パターンrun
は後者より優れています(発注書当たり1回ではなく2回一致しています)。
SELECT po.data.PONumber, SCORE(1)
FROM j_purchaseorder po
WHERE json_textcontains (po.data,
'$.LineItems.Part.Description',
'run',
1)
ORDER BY SCORE(1) DESC;
結果(一部省略):
PONUMBER SCORE(1)
-------- --------
1 18
9958 18
...
1388 18
36 9
22 9
...
8637 9
102 rows selected.