我正在使用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 Reader中打开它们,然后使用搜索功能和自己的眼球对其进行搜索,而且对文档非常熟悉的人坚持认为该词不存在,因此不应在那里。
我尝试将圆点视为转义字符:SDS\\.IF\\.00005
和{SDS.IF.00005}
。但是,我仍然得到相同的结果。
我也尝试设置CONTAINS (BLOB_FIELD, 'SDS.IF.00005') = 100
,但是我仍然在里面带文档,SDS.EL.00005
而不是SDS.IF.00005
。
搜索字词中的点SDS.%.00005
对Oracle来说意味着什么?还是我应该研究如何在Adobe文档中找到肉眼或Adobe文本搜索功能不可见的深层隐藏文本?
谢谢你的帮助。
据我所知,CONTAINS
是一个执行全文本搜索的Oracle Text函数,因此Oracle可能会根据其BASIC_LEXER来对字符串进行标记。该词法分析器.
用作单词分隔符。因此,Oracle将您的查询理解为“返回至少与单词'SDS','IF'或'00005'匹配的单词。由于您的PDF可能已使用相同的词法索引器编制了索引,因此从Oracle Text的角度来看,您的PDF包含单词'SDS','EL'和'00005',因此它匹配3个单词中的2个,因此Oracle返回该行。
实际上,“ IF”已包含在Oracle Text默认 停用词列表中(被忽略的词是因为它们太普遍以至于它们大多引入了“噪声”);因此您的查询实际上是“返回至少与'SDS'或'00005'之一匹配的任何内容”。因此,包含文字文本“ SDS.EL.00005”的PDF将为您提供CONTAINS(BLOB_FIELD, 'SDS.IF.00005') = 100
(完美的匹配)效果,您对此并不感到惊讶。
如果要搜索逐字字符串,我认为您不应该使用Oracle Text,而应该使用plain old实现解决方案DBMS_LOB.INSTR
。如果那不可行,那么您将必须找到一种方法使Oracle Text在不标记它们的情况下索引这些字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句