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 没有搜索词时,我的意思是我在 Adobe reader 中打开它们并使用搜索功能和我自己的眼球搜索它们,而且非常熟悉文档的人坚持认为该术语不存在也不应该存在。
我尝试将点视为转义字符:SDS\.IF\.00005
和 {SDS.IF.00005}
。但是,我仍然得到相同的结果。
我也尝试设置 CONTAINS (BLOB_FIELD, 'SDS.IF.00005') = 100
,但我仍然收到包含 SDS.EL.00005
而不是 SDS.IF.00005
的文档。
搜索词中的点对 Oracle 的意思是否类似于 SDS.%.00005
?或者我应该研究如何在 Adobe 文档中找到肉眼或 Adobe 文本搜索功能看不到的深层隐藏文本?
感谢您的帮助。
据我所知,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 索引这些字符串而不对它们进行标记。
我正在使用 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
的文档。
搜索词中的点对 Oracle 的意思是否类似于 SDS.%.00005
?或者我应该研究如何在 Adobe 文档中找到肉眼或 Adobe 文本搜索功能看不到的深层隐藏文本?
感谢您的帮助。
据我所知,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 索引这些字符串而不对它们进行标记。