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.