powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / поиск в json с использованием fts индекса
8 сообщений из 8, страница 1 из 1
поиск в json с использованием fts индекса
    #39461465
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, есть таблица с 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
поиск в json с использованием fts индекса
    #39461471
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот 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
поиск в json с использованием fts индекса
    #39461501
Shtock, как насчет того, чтобы критерии поиска хранить в отдельных столбцах?
...
Рейтинг: 0 / 0
поиск в json с использованием fts индекса
    #39461516
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воля партии поиск по json указанного формата
...
Рейтинг: 0 / 0
поиск в json с использованием fts индекса
    #39461831
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShtockВоля партии поиск по json указанного форматаЭта воля должна получать всё взад, к чему она бездумно вела. Или же если к этому её настрополили поддувалы, то отвечать им, а не плакаться по форумам.
...
Рейтинг: 0 / 0
поиск в json с использованием fts индекса
    #39461933
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
поиск в json с использованием fts индекса
    #39462111
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>SQL*Plus

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

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

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

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


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