代码之家  ›  专栏  ›  技术社区  ›  Jennifer Crosby

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

  •  1
  • Jennifer Crosby  · 技术社区  · 7 年前

    我有一个带有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、 电子邮件.doc。george@here.com

    谢谢!!

    1 回复  |  直到 7 年前
        1
  •  1
  •   kfinity    7 年前

    这里有两个建议。

    简单而低效的方法是使用包含以外的内容。众所周知,要获得正确的上下文索引非常棘手。所以不用最后一行,你可以做:

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

    我想这应该行得通,但可能会很慢。也就是你使用索引的时候。但是Oracle文本索引比普通索引更复杂。 This old doc explains 打印连接 角色。 This doc explains how ,但我会把它贴在这里。您需要删除现有的上下文索引,并使用此首选项重新创建它:

    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\u case'属性设置为'Y'来改变它,就在你上面设置printjoins属性的地方。

    而且你好像在寻找 AND contains(clob_field, '%.docx')>0