您是否有使用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是什么。我有点失落。我将努力继续寻找答案。任何帮助都会很棒。
感谢。
答案 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)');
它可能会很好地满足您的需求。如果您需要这样做,您只需要更改词法分析器的行为。我希望这会有所帮助。