поиск в CLOB слов в списке / таблице - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть большая таблица со столбцом clob (+100 000 строк), из которого мне нужно искать конкретные слова в течение определенного периода времени.

{select id, clob_field,  dbms_lob.instr(clob_field, '.doc',1,1) as doc,  --ideally want .doc
      dbms_lob.instr(clob_field, '.docx',1,1) as docx, --ideally want .docx
      dbms_lob.instr(clob_field, '.DOC',1,1) as DOC,  --ideally want .DOC
      dbms_lob.instr(clob_field, '.DOCX',1,1) as DOCX  --ideally want .DOCX
 from clob_table, search_words s
 where (to_char(date_entered, 'DD-MON-YYYY') 
      between to_date('01-SEP-2018') and to_date('30-SEP-2018'))
 AND (contains(clob_field, s.words )>0)  ;}

Набор слов: «.doc», «.DOC», «.docx» и «.docx».Когда я использую CONTAINS (), он, кажется, игнорирует точку и поэтому предоставляет мне много строк, но не содержит расширений документа в нем.Он находит электронные письма с адресом .doc как частью адреса, поэтому документ будет иметь точку по обе стороны от него.

т.е. mail.doc.george@here.com

Я не хочу, чтобы эти случаи.Я попробовал это с пробелом в конце слова, и он игнорирует пробелы.Я поместил их в созданную мной таблицу поиска, как показано выше, и она по-прежнему игнорирует пробелы.Какие-либо предложения?

Спасибо !!

1 Ответ

0 голосов
/ 28 сентября 2018

Вот два предложения.

Простой, неэффективный способ - использовать что-то помимо СОДЕРЖИТ.Индексы контекста, как известно, сложно сделать правильно.Поэтому вместо последней строки вы могли бы сделать:

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

...