【问题标题】:searching in CLOB for words in a list/table在 CLOB 中搜索列表/表格中的单词
【发布时间】:2019-03-03 21:20:18
【问题描述】:

我有一个带有 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

我不希望出现这些情况。我试过在单词末尾加一个空格,它忽略了空格。如上所示,我已将它们放在我创建的搜索表中,但它仍然忽略了空格。有什么建议?

谢谢!!

【问题讨论】:

标签: oracle select contains clob


【解决方案1】:

这里有两个建议。

简单、低效的方法是使用除 CONTAINS 之外的东西。众所周知,上下文索引很难正确处理。因此,您可以这样做,而不是最后一行:

AND regexp_instr(clob_field, '\.docx', 1,1,0,'i') > 0

我认为这应该可行,但可能会很慢。那是您使用索引的时候。但是 Oracle Text 索引比普通索引更复杂。 This old doc explains 标点符号(在索引参数中定义)没有被索引,因为 Oracle Text 的重点是索引 words。如果要将特殊字符作为单词的一部分进行索引,则需要将其添加到 printjoin 字符集中。 This doc explains how,但我会把它贴在这里。您需要删除现有的 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

【讨论】:

  • so....如果我执行 regexp_instr,这应该可以工作,但我显然在这里做错了什么。 {
  • 好的。在那里过早地点击返回。 :) 谢谢您的帮助。我让正则表达式为 clob 字段工作。 { select id, clob_field from CLOB_TABLE where regexp_instr(clob_field, '(\.doc|\.docx)(\s|,|$)', 1,1,0,'i')>0 ;在更改它并尝试使用包含之前,我必须更多地检查 CONTEXT 索引的更改。谢谢你的帮助!!
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多