处理过滤错误

GBase 8s Excalibur Text Search DataBlade 模块将错误消息写入上一部分中描述的跟踪文件。消息包含导致错误的行的行标识。可以使用行标识从表中选择违规行,纠正文档问题,然后使用纠正后的文档在表中更新或重新插入该行。

重要: 使用行标识只可以在未分段表中查找行。由于分段表中的行标识的当前实施,您无法将 DataBlade 模块返回的行标识映射到表中的实际行。因此,这一讨论只与未分段表相关。

如果指定了 FILTER 索引参数的 STOP_ON_ERROR,那么您将无法在解决所有过滤问题之前完成该语句的执行。也就是说,如果执行 CREATE INDEX 语句来在当前包含行的表上创建索引,那么只有在所有现有文档都不存在过滤问题之后才可以创建该索引。同样,如果执行 INSERT 语句来向已拥有 etx 索引的表中插入新行,那么只有在所有新文档都不存在过滤问题之后才可以完成该 INSERT 语句。

如果指定 CONTINUE_ON_ERROR,那么过滤错误不会停止 CREATE INDEX、INSERT 或 UPDATE 语句的执行。但是,如果在过滤文档时遇到错误,那么未过滤的文档以及所有格式信息都会被添加到索引中。当执行完语句之后,会将其文档未被过滤的所有行的列表写入跟踪文件。您可以使用行标识列表先纠正文档问题,然后再更新行。在更新表中的这些行的同时,也会更新索引中的相应项目。在纠正了原始过滤问题之后,新的索引条目将包含过滤文档。

以下示例显示了一种方法以在创建索引之后纠正过滤问题。

假设您在名为 reports 的表的 abstract 列上创建了一个 etx 索引。您还指定了 FILTER=CONTINUE_ON_ERROR,以便对该列中的文档进行过滤。abstract 列的数据类型是 BLOB,该表包含 100 行。

尽管 CREATE INDEX 语句已成功执行,但是跟踪日志指示第 65 行存在过滤问题。也就是说,第 65 行的 abstract 列中的文档在添加到索引之前未进行过滤;其所有格式信息与它一同被添加到索引中。

在创建了索引之后,您决定尝试解决第 65 行的文档中的过滤问题。通过执行以下 SELECT 语句,您可以从该表中选择该行,同时将 abstract 列的内容写入客户机操作系统上的文件中:
SELECT LoToFile (abstract, '/tmp/outfile', 'client')
FROM my_table
WHERE rowid = 65;
然后,您可以检查文件 /tmp/outfile 的内容,以查明导致过滤错误的原因。纠正此错误后,即可以更新该表,如下一个示例所示。对于这个示例,正确的格式化文档包含在文件 /tmp/infile 中:
UPDATE my_table
SET abstract = FileToCLOB ('/tmp/infile' , 'client')
WHERE rowid = 65;

更新该表中的 abstract 列的同时,也在更新在该列上构建的 etx 索引。上一示例的 abstract 列上的索引反映了对第 65 行中数据的更改。