Вот два предложения.
Простой, неэффективный способ - использовать что-то помимо СОДЕРЖИТ.Индексы контекста, как известно, сложно сделать правильно.Поэтому вместо последней строки вы могли бы сделать:
AND regexp_instr(clob_field, '\.docx', 1,1,0,'i') > 0
Я думаю, что это должно работать, но это может быть очень медленно.Который, когда вы будете использовать индекс.Но индексы Oracle Text сложнее, чем обычные индексы. Этот старый документ объясняет , что символы пунктуации (как определено в параметрах индекса) не индексируются, потому что целью Oracle Text является индексирование слов .Если вы хотите, чтобы специальные символы были проиндексированы как часть слова, вам нужно добавить его в набор printjoin символов. Этот документ объясняет, как , но я вставлю его сюда.Вам нужно удалить существующий индекс CONTEXT и заново создать его с этим предпочтением:
begin
ctx_ddl.create_preference('mylex', 'BASIC_LEXER');
ctx_ddl.set_attribute('mylex', 'printjoins', '._-'); -- periods, underscores, dashes can be parts of words
end;
/
CREATE INDEX myindex on clob_table(clob_field) INDEXTYPE IS CTXSYS.CONTEXT
parameters ('LEXER mylex');
Имейте в виду, что индексы CONTEXT по умолчанию не чувствительны к регистру;Я думаю, это то, что вы хотите, но, к вашему сведению, вы можете изменить его, установив для атрибута mixed_case значение «Y» на лексере, прямо под тем местом, где вы установили атрибут printjoins выше.
Также, похоже, что вы 'мы пытаемся найти слов, которые заканчиваются на .docx , но CONTAINS не является INSTR - по умолчанию он соответствует целым словам, а не строкам символов.Возможно, вы захотите изменить свой запрос так, чтобы он делал AND contains(clob_field, '%.docx')>0