Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / поиск в json с использованием fts индекса / 8 сообщений из 8, страница 1 из 1
29.05.2017, 13:00
    #39461465
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в json с использованием fts индекса
Народ, есть таблица с json. По полю json построен полнотекстовый индекс, чтобы можно быстро искать. Не очень понимаю, ни как с помощью contains, ни json_textcontains сделать нужный мне поиск. На ум приходит только json_table, но, во-первых, в каждой версии оракла она работает со своими глюками, во-вторых индексы используются как-то странно, а по плану видно, что используется 3 оператора contains, причём в access 2, а в фильтре 1. поэтому хотелось бы написать одно условие в contains и забыть.

Я пытаюсь реализовать поиск так, чтобы можно было задавать через AND набор CLASS_TYPE и значений в них. В указанном ниже простейшем примере надо найти все записи, где class_type = country и его значение 640. В целом в будущем надо будет чтобы в рамках одного поиска можно было задать несколько class_type и для каждого свои условия.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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




Я бы хотел, чтобы в результате моего поиска в запросе была бы только строчка с id = 1, т.е. 640 и country были бы только в 1-м объекте json, а не во всех, как ищет oracle. Подскажите, куда копать.
...
Рейтинг: 0 / 0
29.05.2017, 13:02
    #39461471
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в json с использованием fts индекса
Вот json исходные красивее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
{
         "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"}]
                  }
                 ]
        }


и тот, который не должен находиться
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
{
         "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"}]
                  }
                 ]
        }

ибо у него 640 в features
...
Рейтинг: 0 / 0
29.05.2017, 13:25
    #39461501
поиск в json с использованием fts индекса
Shtock, как насчет того, чтобы критерии поиска хранить в отдельных столбцах?
...
Рейтинг: 0 / 0
29.05.2017, 13:33
    #39461516
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в json с использованием fts индекса
Воля партии поиск по json указанного формата
...
Рейтинг: 0 / 0
29.05.2017, 21:02
    #39461831
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в json с использованием fts индекса
ShtockВоля партии поиск по json указанного форматаЭта воля должна получать всё взад, к чему она бездумно вела. Или же если к этому её настрополили поддувалы, то отвечать им, а не плакаться по форумам.
...
Рейтинг: 0 / 0
30.05.2017, 04:17
    #39461933
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в json с использованием fts индекса
ShtockНарод, есть таблица с json. ... чтобы можно быстро искать.
Подскажите, куда копать.Покопайте в сторону Database In-Memory Option в Oracle 12.2.
http://docs.oracle.com/database/122/INMEM/optimizing-in-memory-expressions.htm#INMEM-GUID-1B849DAF-277E-4B09-8275-367592115B06 Static Expressions: Binary JSON Columns

The IM expressions infrastructure supports both dynamic expressions (IM expressions and virtual columns) and static expressions. Starting in Oracle Database 12c Release 2 (12.2), the IM column store supports a binary JSON format that performs better than row-oriented JSON text storage. The database uses the IM expression infrastructure to load an efficient binary representation of JSON text columns as virtual columns. Queries access the actual JSON data, but use optimized virtual columns to speed access.

Oracle Database supports multiple JSON functions: JSON_TABLE, JSON_VALUE, and JSON_EXISTS. The INMEMORY_EXPRESSIONS_USAGE initialization parameter controls the behavior of both dynamic expressions and static expressions.

See Also:
Oracle Database JSON Developer's Guide to learn more about using JSON with Database In-Memory

Oracle Database Reference to learn about INMEMORY_EXPRESSIONS_USAGE and ALL_JSON_COLUMNS
...
Рейтинг: 0 / 0
30.05.2017, 11:21
    #39462111
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в json с использованием fts индекса
>>SQL*Plus

Про ин-мемори улыбнуло :)

Опция стоит море, да и ещё на 12.2, который раньше чем года через 2 в продакшн пускать не стоит.
...
Рейтинг: 0 / 0
01.06.2017, 00:36
    #39463432
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в json с использованием fts индекса
Shtock>>SQL*Plus

Про ин-мемори улыбнуло :)

Опция стоит море, да и ещё на 12.2, который раньше чем года через 2 в продакшн пускать не стоит.Чем меньше денег, тем больше мороки.
У нищих свои измерения и причуды, у богатых - свои.
Такова диалектика.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / поиск в json с использованием fts индекса / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]