Tivoli 服务台 6.0 开发工具包脚本语言参考
Tivoli 服务台(TSD) 使用名为 文本智能挖掘器 (IM4T) 的 IBM 文本检索产品来为数据库中的表创建索引。服务台分析员可以使用它创建的索引快速查找包含某些字或字的组合的数据库中的特定条目(已存在的数据文件或文档)。索引不影响存储数据的原始格式。
本部分说明下列内容:
IM4T 包含在 TSD 软件中,并且使用它不需要附加的许可费用。
IM4T 使用客户机/服务器结构体系来编制数据库表的索引。所有的索引都是在一台服务器上创建和维护的。运行 TPM 的每个工作站将其本身配置成服务器的客户机。
必须为索引创建和配置服务器后才能使用 TSD 的文本检索性能。该过程的第一步是在已经指定为 IM4T 服务器的机器上安装 TSD。必须安装标题为 “IM4T 服务器安装”的软件包。要配置 IM4T 服务器,请执行下列操作:
结果:打开“Tivoli 服务台 IMT 维护窗口”。请填写下列字段:
节段/字段 | 必需信息 |
名称 | 服务器名称 |
连接信息节段 | |
主机 | 计算机的 IP 名 |
端口 | 端口号码。应当在 etc/services 文件中为服务器创建条目。注:该号码应当用于一个端口,并要求 LAN 上没有其他程序正在使用该端口。 |
任务信息节段 | |
最大 | 搜索服务能同时处理的任务的最大数目(介于 1 和 100 之间)。 |
超时 | 搜索服务接收客户机信息所需的时间。 |
可用的 | 启动服务器时启动的任务的数目。 |
只能在已配置成 IM4T 服务器的机器上管理索引。
注:在 UNIX 操作系统下,还必须注册到安装 TSD 时创建的 imoadm 管理帐户。
可以通过运行 TSD 文本检索管理公用程序(tsd_text.kbc)来创建索引。这是用于配置服务器的同一公用程序。
公用程序将首先要求注册到要为其创建索引的 TSD 数据源。如果注册到的数据源还没有配置 IM4T 服务器,公用程序将提示首先进行该配置。
一旦注册并配置了服务器,将看到标题为“Tivoli 服务台 IM4T 维护”的公用程序主屏幕。
tsd_text 公用程序创建“说明”或“解决方案”列的索引,这些列出现在特定种类的 Tivoli 问题管理(TPM)诊断辅助记录中。当您的数据库中有大量记录时,使用 IM4T 来查找特定的诊断辅助记录比使用“查询”对话框中的“说明”或“解决方案”框速度更快。
可在这些对话框中使用文本搜索:
注:
该 tsd_text 公用程序也用于创建问题、更改和说明的索引,在 Tivoli 更改管理中进行的效应分析过程中将使用它们。其他详细信息,请参见执行效应分析。可以使用 IM4T 来创建新索引和更新现存索引。在有些情况下,需要删除索引。创建、更新和删除索引需要大量时间,这取决于数据库大小。如果您的服务台在夜间不工作,可以考虑在白天下班时间开始 IM4T 索引维护活动。
必须先创建索引,然后您的服务台分析员才能使用这些“查询”对话框中的可用的“文本查询”功能:“公共问题查询”、“错误消息查询”、“热点新闻查询”和“解决方案查询”。
为了确保服务台分析员能搜索到最新的解决方案和问题说明,需要定期更新索引。由于更新过程需要大量时间,请考虑在白天下班后开始此过程开始此过程后,可以不用人来照管它。
有些情况下,可能想要删除 IM4T 索引。如果从索引的显示上看出索引已被毁坏,请删除它后再创建一个索引。删除索引时不会删除数据库数据。
查询数据库文本索引的目的是要在数据库中快速找到字段。要帮助达到此目的,SQLSelect 命令在特殊换码序列存在时寻找并执行 $TextSearch。此序列允许查询“文本检索”索引以及数据库。($TextSearch 序列中的有效条目是用于“文本检索”数据源的有效 WHERE 子句。) 检查下列实例。选择全部与硬件维护有关的解决方案。
Select * from solutions where $TextSearch (contains 'hardware' & 'maintenance')
选择全部与硬件维护有关的活动的解决方案。
Select * from solutions where $TextSearch (contains 'hardware' & 'maintenance') AND Active = 1
如果多个“文本检索”索引与数据库中的一个表相关联,则必须在 $TextSearch 子句中指定索引名称索引名称应当放在查询之前并后跟一个分号 (;)。
Select * from solutions where $TextSearch (solNDX; description contains 'hardware') AND Active = 1 OR solution_id > 3000
要配置 IM4T 服务器,请执行下列操作:
节段/字段 | 必需信息 |
搜索服务 | 服务实例名称(与服务器信息一样) |
主机 | IM4T 服务器的 IP 名。 |
端口 | 端口号码。注:该号码应当用于一个端口,并要求 LAN 上没有其他程序正在使用该端口。该号码应与服务器端口号码一致。 |
高级按钮 | 允许设置高级选项。 |
此节是与 IM4T 一起使用的一般文档检索函数的参考。
FUNCTION FTRSQLTextIndexCreate(IndexName : STRING, Fields : LIST OF IndexFieldRec) : INTEGER;
IndexName 必须小于等于 8 个字符。以下说明IndexFieldRec 类型:
IndexFieldRec IS RECORD TableName : STRING; --Name of the table to be indexed FieldName : STRING; -Name of the field to be indexed Flags : INTEGER; --KEY, VALUE,LITERAL, 和 LONGCHAR 的组合 END;
此记录定义于 FTR.KB
在下表中列出 IndexFieldRec 中标志的定义。
标志 |
说明 |
SAI_DBTRNDX_KEY | 数据库表中的关键字字段。传递到 SQLDBTextIndexCreate 的 IndexFieldRec,其中至少有一个必须具有此标志集。SAI_DBTRNDX_VALUE 表示该列包含数字值。 |
SAI_DBTRNDX_LITERAL | 表示该列包含字母值(通常为一个字符串) |
AI_DBTRNDX_LONGCHAR | 表示该列包含字符串(通常为一长文本字段)。传递到 SQLDBTextIndexCreate 的 IndexFieldRec,其中至少有一个必须具有此标志集。 |
注: 数据库文本索引必须包含被索引的表中的每个主键字段,并且必须至少有一个类型为 LONGCHAR 的字段。
以接收到的数据为基础,FTRSQLTextIndexCreate 创建具有下列特性的索引:全部字段都可以索引,并可以引用作为索引表中的文本列部分。所有关键字段都被存储在索引表中各自的列中。例如:
VARIABLES NewIndex : LIST OF IndexFieldRec; Entry : IndexFieldRec; ACTIONS Entry.TableName = `EQ_Defects'; Entry.FieldName = `Defect_Title'; Entry.Flags = SAI_DBTRNDX_LITERAL; ListInsert(NewIndex,Entry); Entry.TableName = `EQ_Defects'; Entry.FieldName = `Defect_Desc_Text'; Entry.Flags = SAI_DBTRNDX_LONGCHAR; ListInsert(NewIndex, Entry); Entry.TableName = `EQ_Defects'; Entry.FieldName = `Defect_Steps_Text'; Entry.Flags = SAI_DBTRNDX_LONGCHAR; ListInsert(NewIndex, Entry); Entry.TableName = `EQ_Defects'; Entry.FieldName =`Defect_Title'; Entry.Flags = BitOr(SAI_DBTRNDX_KEY, SAI_DBTRNDX_VALUE); ListInsert(NewIndex, Entry); FTRSQLTextIndexCreate(`DefNDX', NewIndex); END;
返回码 |
说明 |
1 | 成功 |
2001 | DBTR ERR 表名无效 |
2002 | DBTR ERR 索引名无效 |
2003 | DBTR ERR 索引字段无效 |
(其他) | 出错码(请参见IM4T 成功/错误消息) |
FUNCTION FTRSQLTextIndexDelete(IndexName : STRING) : INTEGER;
函数 | 说明 |
IndexName | 指定被删除的数据库文本索引的名称 |
FTRSQLTextIndexDelete 查找指定的索引并删除索引。例如:
FTRSQLTextIndexDelete(`DEFNDX');
返回码 |
说明 |
1 | 成功 |
2002 | DBTR_ERR_INVALID_INDEX_NAME |
(其他) | 出错码(请参见IM4T 成功/错误消息) |
FUNCTION FTRSQLTextIndexUpdate(IndexName : STRING, Method : INTEGER) : INTEGER;
函数 | 说明 |
IndexName | 指定更新索引的名称 |
Method | 指定是否更新索引,或从擦除中重建索引。此变量可以为下列二值之一:
|
FTRSQLTextIndexUpdate 查找指定的索引,并执行在“方法”中指定的操作例如:
FTRSQLTextIndexUpdate (`DEFNDX', SAI_NDX_REBUILD);
返回码 |
说明 |
1 | 成功 |
2002 | DBTR ERR 索引名无效 |
(其他) | 出错码(参见IM4T 成功/错误消息) |
FUNCTION FTRSQLTextIndexUpdateAll(Method : INTEGER):INTEGER;
方法将指定是否更新索引,或从擦除中重建索引。此变量可以为下列二值之一:
SAI_NDX_UPDATE 是缺省值。如果索引已经存在,它将被更新以反映数据中的变化。如果索引不存在(即,仅仅定义了),此时将创建索引。
SAI_NDX_REBUILD 建立索引,不管索引是否存在。
FTRSQLTextIndexUpdateAll 使用 Method 中定义的方法,更新当前数据源上存在的每个数据库文本索引。实例:
FTRSQLTextIndexUpdateAll(SAI_NDX_REBUILD);
返回码 |
说明 |
1 | 成功 |
(其他) | 出错码(参见 IM4T 成功/错误消息部分) |
FTRSQLSetFilterWhere (IndexName : STRING , WhereStmt : STRING) : INTEGER;
如果索引存在,该函数将设置索引的“Where 过滤器”。
ret:=FTRSQLSetFilterWhere('MYINDEX', 'USER_ID>10000');
返回码 |
说明 |
1 | 成功 |
2002 | DBTR ERR 索引名无效 |
2005 | DBTR ERR WHERE 语句无效 |
(其他) | 出错码(参见 IM4T 成功/错误消息部分) |
FTRSQLGetFilterWhere (IndexName : STRING, WhereStmt : STRING) : INTEGER;
如果 Where 过滤器存在,该函数将获取索引的“Where 过滤器”。
WhereStmt : STRING;
返回码 |
说明 |
1 | 成功 |
2002 | DBTR ERR 索引名无效 |
(其他) | 出错码(参见 IM4T 成功/错误消息部分) |
语法
FTRSQLDeleteFileterWhere (WhereStmt : STRING) : INTEGER;
如果索引存在,该函数将删除索引的“Where 过滤器”。
ret:=FTRSQLDeleteFilterWhere('MYINDEX');
返回码 |
说明 |
1 | 成功 |
2002 | DBTR ERR 索引名无效 |
(其他) | 出错码(参见 IM4T 成功/错误消息部分) |
语法
FTRListIndexes (Servername : STRING , ResultList : LIST OF STRINGS ) : INTEGER;
该函数列出服务器的所有可用的索引。
IdxList:LIST OF STRING; ret:=FTRListIndexes('MYSRVR',IdxList);
返回码 |
说明 |
1 | 成功 |
2002 | DBTR ERR 索引名无效 |
(其他) | 出错码(参见 IM4T 成功/错误消息部分) |
FTRSQLTextIndexCreate
下例是 Tivoli 问题管理 (TPM) 解决方案表的索引,并显示
调用结果的成功/错误消息。
KNOWLEDGEBASE MakeNDX;
USES TEXTRET;
ROUTINES
PROCEDURE TestMain;
PRIVATE
ROUTINES
PROCEDURE TestMain IS
VARIABLES
Col : IndexFieldRec;
ColList : LIST OF IndexFieldRec;
Lines : List of String;
nRC : Integer;
whdl : Window;
ACTIONS
SQLCommand(`connect TOOLKIT');
Col.TableName := 'solutions';
Col.FieldName := 'solution_id';
Col.Flags := BitOr (SAI_DBTRNDX_VALUE,
SAI_DBTRNDX_KEY);
ListPush(ColList, Col);
Col.TableName := 'dbo.solutions';
Col.FieldName := 'description';
Col.Flags := SAI_DBTRNDX_LONGCHAR;
ListPush(ColList, Col);
nRC := FTRSQLTextIndexCreate('solndx', ColList);
ListInsert(Lines, nRC, $BEFORE);
WinCreateScrollWindow($Desktop, whdl,
$NullHandler,
5,5,50,15,
'Create Index',
$SystemMonospaced,
10,
$WinDefaultStyle);
WinWriteLN(whdl, Lines);
WinWait(whdl);
END;
下列为索引查询的代码实例。
KNOWLEDGEBASE querysol; ROUTINES PROCEDURE TestMain; PRIVATE ROUTINES PROCEDURE TestMain IS VARIABLES Lines : List of String; nRC : Integer; whdl : Window; cursor : SQLCURSOR; System : String; ACTIONS nRC := SQLCommand('CONNECT ADVISOR'); IF (nRC <> 1) THEN EXIT; END; ListInsert(Lines, nRC, $BEFORE); nRC := SQLSelect(cursor, 'SELECT SYSTEM FROM SOLUTIONS WHERE $TextSearch(SOLNDX;DESCRIPTION CONTAINS ''PROBLEM'')'); ListInsert(Lines, nRC, $BEFORE); nRC := SQLFetch(cursor, System); WHILE (nRC = 1) DO ListInsert(Lines, System, $BEFORE); nRC := SQLFetch(cursor, System); END; ListInsert(Lines, nRC, $BEFORE); SQLCloseCursor(cursor); WinCreateScrollWindow($Desktop, whdl, $NullHandler, 5,5,50,15, 'Query Index', $SystemMonospaced, 10, BitOr($WinDefaultStyle, $WinVScroll)); WinWriteLN(whdl, Lines); WinWait(whdl); END;
错误代码 | 错误消息 |
-17407 | SQLERR_NO_KEY |
-17408 | SQLERR_NO_LONGCHAR |
-17409 | SQLERR_COL_TYPE_CONFLICT |
-17410 | SQLERR_INDEX_NAME_NOT_FOUND |
-17411 | SQLERR_BAD_KEY_TYPE |
-17415 | SQLERR_TR_NOT_INITIALIZED |
-17417 | SQLERR_INVALID_TEXTSEARCH |
-17420 | SQLERR_INVALID_INDEX_NAME |
-17424 | SQLERR_TEXTMINER_DATA_BUILD |
-17425 | SQLERR_CANT_DETERMINE_SERVER_LOCATION |
-17426 | SQLERR_SECTION_FILE_SYNTAX_ERROR |
-17427 | SQLERR_DEFINITION_FILE_SYNTAX_ERROR |
-17428 | SQLERR_CANT_OPEN_FILE |
-17429 | SQLERR_CANT_WRITE_FILE |
-17430 | SQLERR_CANT_READ_FILE |
-17431 | SQLERR_TABLE_NAME_NOT_SET |
-17432 | SQLERR_ENVIRONMENT_VARIABLE_NOT_SET |
-17433 | SQLERR_INVALID_REMOTE_PROCEDURE |
-17434 | SQLERR_MISSING_LANGUAGE |
-17435 | SQLERR_CANT_GET_CODEPAGE |
-17700 | SQLERR_NOT_ENOUGH_MEMORY |
-17701 | SQLERR_DICTIONARY_NOT_FOUND |
-17702 | SQLERR_STOPWORD_IGNORED |
-17703 | SQLERR_CCS_NOT_SUPPORTED |
-17704 | SQLERR_LANGUAGE_NOT_SUPPORTED |
-17705 | SQLERR_CONFLICT_WITH_INDEX_TYPE |
-17706 | SQLERR_INVALID_MASKING_SYMBOL |
-17707 | SQLERR_INDEX_GROUP_SEARCH_ERROR |
-17708 | SQLERR_INDEX_SPECIFIC_ERROR |
-17709 | SQLERR_UNEXPECTED_ERROR |
-17710 | SQLERR_DATASTREAM_SYNTAX_ERROR |
-17711 | SQLERR_UNKNOWN_SESSION_POINTER |
-17712 | SQLERR_PROCESSING_LIMIT_EXCEEDED |
-17713 | SQLERR_REQUEST_IN_PROGRESS |
-17714 | SQLERR_MAX_NUMBER_OF_RESULTS |
-17715 | SQLERR_SERVER_NOT_AVAILABLE |
-17716 | SQLERR_SERVER_BUSY |
-17717 | SQLERR_SERVER_CONNECTION_LOST |
-17718 | SQLERR_INDEX_DELETED |
-17719 | SQLERR_INDEX_SUSPENDED |
-17720 | SQLERR_INDEX_NOT_ACCESSIBLE |
-17721 | SQLERR_EMPTY_QUERY |
-17722 | SQLERR_EMPTY_INDEX |
-17723 | SQLERR_FUNCTION_DISABLED |
-17724 | SQLERR_FUNCTION_IN_ERROR |
-17725 | SQLERR_INSTALLATION_PROBLEM |
-17726 | SQLERR_COMMUNICATION_PROBLEM |
-17727 | SQLERR_IO_PROBLEM |
-17728 | SQLERR_WRITE_TO_DISK_ERROR |
-17729 | SQLERR_MAX_NUMBER_OF_BUSY_INDEXES |
-17730 | SQLERR_UNKOWN_SECTION_NAME |
-17731 | SQLERR_DOCMOD_READ_PROBLEM |
-17732 | SQLERR_INCORRECT_AUTHENTICATION |
-17733 | SQLERR_CONFLICTING_TASK_RUNNING |
-17734 | SQLERR_NO_ACTION_TAKEN |
-17735 | SQLERR_LS_NOT_EXECUTABLE |
-17736 | SQLERR_LS_FUNCTION_FAILED |
-17737 | SQLERR_MAX_NUMBER_OF_TASKS |
-17738 | SQLERR_MISSING_DEFAULT_MODEL |
-17739 | SQLERR_UNKNOWN_DOCUMENT_MODEL-NAME |
-17740 | SQLERR_MEMBER_OF_INDEX_GROUP |
-17741 | SQLERR_UNKNOWN_INDEX_NAME |
-17742 | SQLERR_INDEX_ALREADY_OPENED |
-17743 | SQLERR_MAX_NUMBER_OF_OPEN_INDEXES |
-17744 | SQLERR_CONTINUATION_MODE_ENTERED |
-17745 | SQLERR_EMPTY_LIST |
-17746 | SQLERR_SERVER_IN_ERROR |
-17747 | SQLERR_FUNCTION_NOT_SUPPORTED |
-17748 | SQLERR_UNKNOWN_INDEX_TYPE |
-17749 | SQLERR_INCORRECT_INDEX_NAME |
-17750 | SQLERR_INCORRECT_LS_EXECUTABLES |
-17751 | SQLERR_INCORRECT_LIBRARY_ID |
-17752 | SQLERR_INCORRECT_LOCATION |
-17753 | SQLERR_INDEX_ALREADY_EXISTS |
-17754 | SQLERR_MAX_NUMBER_OF_INDEXES |
-17755 | SQLERR_LOCATION_IN_USE |
-17756 | SQLERR_UNKNOWN_SERVER_NAME |
-17757 | SQLERR_UNKNOWN_COMMUNICATION_TYPE |
-17758 | SQLERR_UNKNOWN_SERVER_INFORMATION |
-17759 | SQLERR_INCORRECT_HANDLE |
-17760 | SQLERR_QUERY_TOO_COMPLEX |
警告代码 | 警告消息 |
-17510 | SQLWARN_CFG_NULL_ITEM |
-17511 | SQLWARN_TEXTMINER_CLEANUP_ERROR |
-17512 | SQLWARN_PARTIAL_FAILURE |
其他信息,参见下列地址的 Intelligent Miner for Text (IM4T) 文档:
http://www.software.ibm.com/data/iminer/fortext
Tivoli 服务台 6.0 开发工具包脚本语言参考