Имам поле в таблица, което е индексирано в домейн, така че мога да използвам CONTAINS в заявка. Опитвам се да създам заявка, която може да намери точно акроним (т.е. J.A.V.A.). Проблемът е, че точката '.' е стоп дума, която се игнорира. Трябва да разбера как да направя това, като избягам от „.“ някак си. Не мога да намеря справка онлайн за това как да направя това или може би не разбирам напълно какво чета.
опитах
SELECT * FROM table WHERE CONTAINS(CLOB_column, '{J.A.V.A}')>0;
SELECT * FROM table WHERE CONTAINS(CLOB_column, '{J_A_V_A_}')>0;
SELECT * FROM table WHERE CONTAINS(CLOB_column, '{J\.A\.V\.A\.}')>0;
Създадох индекса на домейна чрез: CREATE INDEX table_txt_idx ON table(CLOB_column) INDEXTYPE IS CTXSYS.CONTEXT;
Видях нещо (https://oracle-base.com/articles/9i/full-text-indexing-using-oracle-text-9i) (https://docs.oracle.com/database/121/CCREF/csql.htm#CCREF0100) относно добавянето към индекса, но не мисля, че е приложимо към ctxsys индекс, но не съм напълно сигурен. Просто знам, че това, което използвах, не работи.
BEGIN
CTX_DLL.OPTIMIZE_INDEX('IDX_COLUMN_TXT','FAST');
END;
Тук не се споменава ctxsys (https://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm#BEIIEAFD)
Създадох подобни заявки с помощта на LIKE и REGEXP_INSTR и трябва да създам същите с помощта на CONTAINS, за да мога да се уверя, че изпълнявам тази, която работи най-бързо.
SELECT * from table WHERE CLOB_column LIKE '%J.A.V.A.%'; --4.441 seconds
SELECT * from table WHERE REGEXP_INSTR(CLOB_column, '(J\.A\.V\.A\.)')>0; --23.528 seconds