Oracle - трябва да използвате CONTAINS, за да намерите низ, който съдържа точка

Имам поле в таблица, което е индексирано в домейн, така че мога да използвам 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

person Jennifer Crosby    schedule 26.11.2018    source източник
comment
здрасти Разгледайте този отговор: stackoverflow.com/a/37886431/10300113 . Целият отговор е полезен за вас и също така съдържа връзка към глава „пунктуация“ в „Елементи за индексиране на текст на Oracle“: docs.oracle.com/cd/E11882_01/text.112/e24436/   -  person Peter    schedule 26.11.2018
comment
Възможен дубликат на заявка със заместващ знак и точка несъвпадащи данни с индекс на Oracle Text   -  person Peter    schedule 26.11.2018
comment
Страхотна тема @Peter! Чудя се защо не го намерих? Вероятно не използвате правилни думи при търсене. Благодаря! Ще проверя това и ще ви кажа дали работи.   -  person Jennifer Crosby    schedule 28.11.2018


Отговори (1)


Някаква причина да не можете да използвате ХАРЕСВАНЕ?

CREATE TABLE suppliers
( supplier_id number(10) NOT NULL,
  supplier_name varchar2(50) NOT NULL
 );

INSERT INTO suppliers (supplier_id, supplier_name) VALUES (5000, 'Apple');
INSERT INTO suppliers (supplier_id, supplier_name) VALUES (5000, 'J.A.V.A');

SELECT * FROM suppliers WHERE supplier_name LIKE '%.%';
SELECT * FROM suppliers WHERE supplier_name LIKE 'J.A.V.A';
person Dan S    schedule 26.11.2018
comment
Няма причина, просто трябва да го накарам да работи по най-ефективния начин и това е единственото нещо, което все още не съм работил, за да го сравня. Досега в моята примерна таблица LIKE е най-ефективната, но бих искал да видя дали CONTAINS е по-добра поради индексирането. Това е нещо, което ще се изпълнява всяка вечер заедно с други заявки, така че колкото по-бързо, толкова по-добре. - person Jennifer Crosby; 28.11.2018