Oracle text escaping с фигурными скобками и подстановочными знаками

Я хочу иметь возможность избежать критериев поиска в текстовом запросе Oracle, используя contains и объедините экранированные критерии с подстановочными знаками, чтобы иметь" дважды усеченные " критерии. (Я знаю, что мои индексы не могут быть настроены на идеальную производительность, но это излишне). Я хочу иметь возможность использовать синтаксис фигурных скобок для лучшей читаемости, но это не работает. Согласно верхнему ответу на этот связанный (но не дублирующий) вопрос, фигурные скобки определяют полные токены. Есть ли способ отключить или обойти это поведение?

Oracle Text: как санировать пользовательский ввод

Я бы предпочел избежать необходимости избегать каждого символа в моих критериях поиска (согласно последнему выбору в моем коде) или попытаться найти строку для специальных символов, поскольку зарезервированные слова также считаются "особенными". (Обратите внимание, что у меня нет стоп-слов) следующая демонстрирует мою проблему. (К сожалению, SQLFiddle не поддерживает Oracle текст):

create table MY_TABLE(MY_COL varchar2(20));
insert into MY_TABLE(MY_COL) values ('abc');
insert into MY_TABLE(MY_COL) values ('abcd');
insert into MY_TABLE(MY_COL) values ('abcde');
insert into MY_TABLE(MY_COL) values ('bcd');
insert into MY_TABLE(MY_COL) values ('bcde');

create index FTIX on MY_TABLE (MY_COL)
indextype is CTXSYS.CONTEXT
PARAMETERS ('STOPLIST CTXSYS.EMPTY_STOPLIST SYNC (ON COMMIT)');

select * from MY_TABLE where CONTAINS(MY_COL, '%bcd%') > 0; --expected results
select * from MY_TABLE where CONTAINS(MY_COL, '%{bcd}%') > 0; --no results
select * from MY_TABLE where CONTAINS(MY_COL, '{bcd}') > 0; --returns bcd
select * from MY_TABLE where CONTAINS(MY_COL, '{%bcd%}') > 0; --returns bcd
select * from MY_TABLE where CONTAINS(MY_COL, '%bcd%') > 0; --expected results

1 ответов


Как насчет:

select * from MY_TABLE where CONTAINS(MY_COL, regexp_replace('*abc*', '([^*])', '\')) > 0