Oracle 在CLOB中搜索列表/表格中的单词

Oracle 在CLOB中搜索列表/表格中的单词,oracle,select,contains,clob,Oracle,Select,Contains,Clob,我有一个带有clob列(+100000行)的大表,我需要从中搜索特定时间范围内的特定单词 {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, '.D

我有一个带有clob列(+100000行)的大表,我需要从中搜索特定时间范围内的特定单词

{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的电子邮件作为地址的一部分,因此doc的两边都有一个句点

i、 e.mail.doc。george@here.com

我不想发生那些事。我试过在单词末尾加空格,但它忽略了空格。我已经将它们放在我创建的搜索表中,如上所示,但它仍然忽略了空格。有什么建议吗


谢谢

这里有两条建议

简单而低效的方法是使用包含之外的内容。众所周知,要获得正确的上下文索引非常困难。因此,您可以执行以下操作,而不是最后一行:

AND regexp_instr(clob_field, '\.docx', 1,1,0,'i') > 0
我想这应该行得通,但可能会很慢。这就是你使用索引的时候。但是Oracle文本索引比普通索引更复杂。标点符号(如索引参数中定义的)不编入索引,因为Oracle文本的目的是为单词编入索引。如果希望将特殊字符作为单词的一部分编入索引,则需要将其添加到printjoin字符集中,但我会把它贴在这里。您需要删除现有的上下文索引,并使用此首选项重新创建它:

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');
请记住,默认情况下上下文索引不区分大小写;我认为这是您想要的,但仅供参考,您可以通过在lexer上将“mixed_case”属性设置为“Y”来更改它,就在上面设置printjoins属性的正下方


另外,您似乎正在尝试搜索以.docx结尾的单词,但包含的不是INSTR-默认情况下,它匹配整个单词,而不是字符串。您可能希望修改查询以执行
并包含(clob_字段,%.docx')>0

类似的操作……如果我执行regexp_指令,这应该会起作用,但显然我在这里做错了什么。{好的。点击return太快了。:)谢谢你的帮助。我让regexp为clob字段工作。{从clob_表中选择id,clob_字段,其中regexp_instr(clob_字段,'(\.doc \.docx)(\s |,|$)',1,1,0,'I')>0;}在更改上下文索引并尝试使用contains之前,我必须检查更多上下文索引的更改。谢谢您的帮助!!