Oracle Text - 索引BLOB字段(包含PDF数据)

时间:2010-07-21 09:26:13

标签: database oracle oracle10g

您是否有使用Oracle Text搜索PDF文件内容的经验?

我有一个表,名为FILEDATA(blob)字段。

我想进行以下查询:

SELECT id FROM ttc.contract_attachment WHERE CONTAINS(filedata, 'EXAMPLE') > 0;

但是,我不太确定要添加的索引类型。

我找到了以下代码:

begin 
  ctx_ddl.create_preference('doc_lexer', 'BASIC_LEXER'); 
  ctx_ddl.set_attribute('doc_lexer', 'printjoins', '_-'); 
end; 
/ 

create index idxContentMgmtBinary on CMDEMO.CONTENT_INVENTORY(TEXT) indextype is ctxsys.context
  parameters ('lexer doc_lexer sync (on commit)');

参考:http://www.devx.com/dbzone/Article/21563/1954

我不知道BASIC_LEXER是什么。我有点失落。我将努力继续寻找答案。任何帮助都会很棒。

感谢。

1 个答案:

答案 0 :(得分:1)

我使用Oracle Text不仅索引PDF,还索引其他数据,如XML结构。 Oracle有词法分析器的概念,它采用内容和解析,标记化和索引标记。基本词法分析器处理英语单词,还有其他词法分析器用于中文,日语,韩语等.printjoin属性允许您索引通常被排除的字符,如拼写,引号等。

您在上面定义的索引将起作用。请记住,Oracle Text索引是一个异步过程,这意味着提交会发生,然后在将来的某个时间对文档编制索引。但是,您需要将索引同步为计划作业的一部分等。使用索引上的“sync(on commit)”选项,它将索引文档作为事务的一部分。只有在索引相当大的PDF文档时,这才是值得注意的。

我建议对您可能想要运行的任何搜索使用渐进式放宽,因为它可以通过限制性搜索扩展到更通用的搜索,从而为用户提供相关性降低的结果。例如:

    <query>
   <textquery lang="ENGLISH" grammar="CONTEXT"> cat dog
     <progression>
       <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite></seq>
     </progression>
   </textquery>
  <score datatype="INTEGER" algorithm="COUNT"/>
</query>

以上查询将搜索关键字标记为“猫狗”试图将它们作为短语找到,然后任何文件都包含猫和狗(不一定在彼此旁边),然后任何包含猫或狗的文件,包含这两个词的文件都是得分高于文件只有一个。此外,结构会在返回结果时自动扣除结果。

所有这些,您可以简单地将索引定义为:

create index idxContentMgmtBinary on CMDEMO.CONTENT_INVENTORY(TEXT) 
  indextype is ctxsys.context
  parameters ('sync (on commit)');

它可能会很好地满足您的需求。如果您需要这样做,您只需要更改词法分析器的行为。我希望这会有所帮助。