Oracle包含函数返回错误的BLOB肯定

时间:2016-02-05 23:00:13

标签: oracle pdf blob contains

我正在使用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没有搜索词时,我的意思是我在Adobe阅读器中打开它们并使用搜索功能和我自己的眼球搜索它们,而且对这些文件非常熟悉的人坚持认为该术语不存在不应该在那里。

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

我还尝试设置CONTAINS (BLOB_FIELD, 'SDS.IF.00005') = 100,但我仍然在其中收到SDS.EL.00005而不是SDS.IF.00005的文档。

搜索词中的点是否与Oracle SDS.%.00005类似?或者我应该研究如何在Adobe文档中找到肉眼无法看到的深层隐藏文本或Adobe文本搜索功能?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

据我所知,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索引这些字符串而不用标记它们。