【问题标题】:Oracle Contains Function Returning False BLOB PositivesOracle 包含返回错误 BLOB 阳性的函数
【发布时间】:2016-05-16 01:40:42
【问题描述】:

我正在使用 Contains 函数在包含 PDF 或 Word 文档的 BLOB 字段中搜索字符串。最近我做了以下搜索:

SELECT doc_id 
FROM   table_of_documents
WHERE  CONTAINS (BLOB_FIELD, 'SDS.IF.00005') > 0

大多数返回的记录都是正确的,但其中一些包含没有“SDS.IF.00005”但确实有“SDS.EL.00005”的 PDF。

当我说PDF没有搜索词时,我的意思是我在Adobe阅读器中打开它们并使用搜索功能和我自己的眼球搜索它们,并且非常熟悉文档的人坚持认为没有该词并且不应该在那里。

我尝试将这些点视为转义字符:SDS\\.IF\\.00005{SDS.IF.00005}。但是,我仍然得到相同的结果。

我也尝试设置 CONTAINS (BLOB_FIELD, 'SDS.IF.00005') = 100,但我仍然得到包含 SDS.EL.00005 而不是 SDS.IF.00005 的文档。

搜索词中的点对 Oracle 来说是否意味着 SDS.%.00005?或者我应该研究如何在 Adob​​e 文档中找到肉眼或 Adob​​e 文本搜索功能看不到的深层隐藏文本?

感谢您的帮助。

【问题讨论】:

    标签: oracle pdf blob contains


    【解决方案1】:

    据我所知,CONTAINS 是执行full text search 的Oracle Text 函数,因此Oracle 正在标记您的字符串,可能是根据其BASIC_LEXER。此词法分析器使用. 作为单词分隔符。因此,Oracle 将您的查询理解为“返回与 'SDS'、'IF' 或 '00005' 中的至少一个匹配的任何内容”。由于您的 PDF 可能已使用相同的词法分析器进行索引,因此从 Oracle Text 的角度来看,您的 PDF 包含单词“SDS”、“EL”和“00005”,因此它匹配 3 个单词中的 2 个,因此 Oracle 返回该行。

    实际上,'IF' 包含在 Oracle Text default stopword list 中(因为它们太常见以至于它们主要引入“噪音”而被忽略);所以你的查询实际上是“返回任何与'SDS'或'00005'中的至少一个匹配的东西”。因此,包含文字“SDS.EL.00005”的 PDF 会在您所写时为您提供 CONTAINS(BLOB_FIELD, 'SDS.IF.00005') = 100(“完美”匹配),我并不感到惊讶。

    如果您想搜索逐字字符串,我认为您不应该使用 Oracle Text,而只需使用普通的旧 DBMS_LOB.INSTR 实现解决方案。如果这不可行,那么您将不得不找到一种方法让 Oracle Text 索引这些字符串而不对它们进行标记。

    【讨论】:

    • 非常感谢!我将查看 BASIC_LEXER 链接以及 DBMS_LOB.INSTR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-07-07
    • 2021-01-24
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多