我有一個表,它有一個Oracle文本索引。我創建了索引,因爲我需要額外的快速搜索。該表包含JSON數據。 Oracle json_textcontains工作得很差,所以我嘗試使用CONTAINS(如果我們查看查詢計劃,json_textcontains會被重寫爲CONTAINS)。如何使用oracle文本索引從json提取數據
我想通過給定的class_type和value的值來查找所有的jsons,但是Oracle看起來遍佈JSON而沒有看到class_type和id應該在一個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"}]
}
]
}
不應發現這個樣子的第二個:
{
"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的情況下使用全文索引並且無需突出顯示的錯誤進行搜索?
沒有選擇將數據置於關係格式。
在此先感謝。
我印象深刻,謝謝 –