如何使用oracle文本索引从json中提取数据
我有一个表,它有一个Oracle文本索引。我创建索引是因为我需要一个额外的快速搜索。该表包含JSON数据。Oracle json_textcontains的工作非常糟糕,所以我尝试使用CONTAINS(如果我们查看查询计划,json_textcontains实际上会被重写为CONTAINS) 我想通过给定的class_类型和id值查找所有JSON,但Oracle查看了所有JSON,但没有查看class_类型和id应该在一个JSON部分,即它处理JSON不像结构化数据,而是像一个巨大的字符串 格式良好的JSON如下所示:如何使用oracle文本索引从json中提取数据,json,oracle,Json,Oracle,我有一个表,它有一个Oracle文本索引。我创建索引是因为我需要一个额外的快速搜索。该表包含JSON数据。Oracle json_textcontains的工作非常糟糕,所以我尝试使用CONTAINS(如果我们查看查询计划,json_textcontains实际上会被重写为CONTAINS) 我想通过给定的class_类型和id值查找所有JSON,但Oracle查看了所有JSON,但没有查看class_类型和id应该在一个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"}]
}
]
}
第二个不应该被找到的是这样的:
{
"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_表的情况下使用全文索引进行搜索而不出现我突出显示的错误
没有以关系格式放置数据的选项
提前感谢。请不要直接使用文本索引来解决此类问题。这不是它的设计目的 在12.2.0.1.0中,这应该适用于您(是的,它确实在封面下使用了专门版本的文本索引,但它也应用了选择性的后期过滤,以确保结果是正确的)