我正在使用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文本搜索功能?
感谢您的帮助。
答案 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索引这些字符串而不用标记它们。