Oracleテキスト索引を持つ表があります。余分な高速検索が必要なため、インデックスを作成しました。この表にはJSONデータが含まれています。 Oracle json_textcontainsは非常にうまく動作しませんので、CONTAINS(json_textcontainsはクエリプランを調べている場合は実際にCONTAINSに書き換えられます)で再生しようとしました。oracleテキスト索引を使用してjsonからデータを抽出する方法
class_typeとidの値を指定してすべてのjsonsを検索したいが、Oracleはclass_typeを調べずにJSON全体を調べ、idは1つのJSONセクションになければならない。つまりJSONは構造化データと似ていないが、
まあフォーマットされたJSONは次のようになります。
{
"class":[
{
"class_type":"ownership",
"values":[{"nm":"id","value":"1"}]
},
{
"class_type":"country",
"values":[{"nm":"id","value":"640"}]
},
,
{
"class_type":"features",
"values":[{"nm":"id","value":"15"},{"nm":"id","value":"20"}]
}
]
}
次のようになりますを発見してはならない第二1:
{
"class":[
{
"class_type":"ownership",
"values":[{"nm":"id","value":"18"}]
},
{
"class_type":"country",
"values":[{"nm":"id","value":"11"}]
},
,
{
"class_type":"features",
"values":[{"nm":"id","value":"7"},{"nm":"id","value":"640"}]
}
]
}
私が達成しようとしているものを再現する方法を参照してくださいに:
create table perso.json_data(id number, data_val blob);
insert into perso.json_data
values(
1,
utl_raw.cast_to_raw('{"class":[{"class_type":"ownership","values":[{"nm":"id","value":"1"}]},{"class_type":"country","values":[{"nm":"id","value":"640"}]},{"class_type":"features","values":[{"nm":"id","value":"15"},{"nm":"id","value":"20"}]}]}')
);
insert into perso.json_data values(
2,
utl_raw.cast_to_raw('{"class":[{"class_type":"ownership","values":[{"nm":"id","value":"18"}]},{"class_type":"country","values":[{"nm":"id","value":"11"}]},{"class_type":"features","values":[{"nm":"id","value":"7"},{"nm":"id","value":"640"}]}]}')
)
;
commit;
ALTER TABLE perso.json_data
ADD CONSTRAINT check_is_json
CHECK (data_val IS JSON (STRICT));
CREATE INDEX perso.json_data_idx ON json_data (data_val)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('section group CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)');
select *
from perso.json_data
where ctxsys.contains(data_val, '(640 INPATH(/class/values/value)) and (country inpath (/class/class_type))')>0
クエリは2行を返しますが、id = 1のレコードのみを取得すると考えられます。
JSON_TABLEを使用せずに強調表示されたエラーなしでフルテキストインデックスを検索するにはどうすればよいですか?
データをリレーショナル形式で入れるオプションはありません。
ありがとうございます。
私は感心しました、ありがとう –