Oracle 包含返回误报 BLOB 的函数

Oracle Contains Function Returning False BLOB Positives

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

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

大部分返回的记录都是正确的,但有一些 PDF 中没有“SDS.IF.00005”但有“SDS.EL.00005”。

当我说 PDF 没有搜索词时,我的意思是我在 Adob​​e reader 中打开它们并使用搜索功能和我自己的眼球搜索它们,而且非常熟悉文档的人坚持认为该术语不存在也不应该存在。

我尝试将点视为转义字符: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 文本搜索功能看不到的深层隐藏文本?

感谢您的帮助。

据我所知,CONTAINS is a Oracle Text function that performs full text search, so Oracle is tokenizing your string, probably according to its BASIC_LEXER。这个词法分析器使用 . 作为单词分隔符。所以 Oracle 将您的查询理解为 "return anything that matches at least one of the words 'SDS', 'IF' or '00005'"。由于您的 PDF 可能已使用相同的词法分析器编制索引,因此从 Oracle Text 的角度来看,您的 PDF 包含单词 'SDS'、'EL' 和 '00005',因此它匹配 3 个单词中的 2 个,因此 Oracle returns 那一行。

实际上,'IF' 包含在 Oracle Text default stopword list 中(被忽略的词,因为它们太常见以至于它们主要介绍 "noise");所以你的查询实际上是 "return anything that matches at least one of 'SDS' or '00005'"。因此,包含文字文本 "SDS.EL.00005" 的 PDF 会像您所写的那样为您提供 CONTAINS(BLOB_FIELD, 'SDS.IF.00005') = 100("perfect" 匹配项),我并不感到惊讶。

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