etx_contains() 运算符

etx_contains() 运算符执行您通过使用线索、调整参数和可选的语句局部变量 (SLV) 定义的搜索。

COMPARISON 条件的语法

COMPARISON 条件

元素 用途 语法
col_exp 要搜索的列的名称。 语法必须遵照GBase 8s SQL 指南:语法中的列表达式语法。
slv 搜索引擎用于存储分数和突出显示特定行信息的语句局部变量(SLV)。 语法必须遵照标识段;请参阅GBase 8s SQL 指南:语法

加引号的字符串的语法

加引号的字符串

元素 用途 限制 语法
character 构成加引号字符串的字符 当加引号的字符串是 Row() 表达式的一部分时(请参阅行表达式用法的语法),将应用以下约定:
  • 当执行关键字、近似或布尔搜索时,空格作为关键字的定界符。
  • 字符 & 对应于布尔运算符 AND。 字符 | 对应于布尔运算符 OR。 字符 !^ 都与布尔运算符 NOT 对应。要对这些字符本身进行搜索,可以在字符前加一个反斜杠以避免其作为布尔运算符。
字符是从键盘输入的字面值。

行表达式用法的语法

行表达式
行表达式选项

元素 用途 限制 语法
hits 文本搜索针对单个索引分段返回的最大命中数。 数据类型必须是正整数。 语法必须遵照GBase 8s SQL 指南:语法中的 Literal Number 语法。
limit 可以出现在两个或多个搜索词之间的非搜索词的数目。 数据类型必须是大于搜索词数目的非零整数。 语法必须遵照GBase 8s SQL 指南:语法中的 Literal Number 语法。
score 将词视为模式匹配的最低分数。 数据类型必须是实数。 语法必须遵照GBase 8s SQL 指南:语法中的 Literal Number 语法。
syn_name 同义词列表名。 同义词列表必须存在。 语法必须遵照GBase 8s SQL 指南:语法中的 Literal Number 语法。
IfxDocDesc 线索可以按 IfxDocDesc 数据类型存储。 当执行搜索时,仅参考 location 字段中的数据。 请参阅 IfxDocDesc 数据类型,以获取有关 IfxDocDesc 行数据类型的更多信息。

调整参数

下表列出了当搜索引擎执行搜索时,用于设定搜索引擎的调整参数。
调整参数 描述 限制 缺省值
CONSIDER_STOPWORDS 向搜索引擎指示将在搜索中包含非索引字。 必须已经使用 INCLUDE_STOPWORDS 和 STOPWORD_LIST 索引参数创建了 etx 索引。 已禁用
MATCH_SYNONYM 启用同义词匹配。 如果未指定任何值,将参考缺省同义词列表 etx_thesaurus 。如果指定了一个值,将参考指定的同义词列表而不是缺省列表。请遵照同义词列表中提供的指示信息来创建缺省或备用列表。 如果指定了定制同义词列表,必须已经通过 etx_CreateSynWlst() 例程创建了该列表。当与模式匹配(如 PATTERN_ALL)一起使用时,只会找到根词的模式匹配,而不涉及同义词。 已禁用
MAX_MATCHES 允许您指定搜索引擎返回的 per index fragment 的最大命中数。如果要使用此调整参数来限制搜索返回的行数,请将其设置为 1000 或表中总行数的 10% 这两个数字中的较大者。以 etx 索引为例,Per index fragment 意味着如果将该索引分割为两个部分,并且此调整参数设置为 1000,那么可能返回的最大命中数为 2000。 完全命中
NO_HILITE 允许您加快以下类型的查询:希望返回查询结果的分数,但不需要突出显示信息。 该查询必须包含 etx_ReturnType 数据类型,这是一种复合行类型,它同时包含文档分数和突出显示信息的子行类型。 返回所有信息可能会产生相当大的开销,但通过指定 NO_HILITE 查询参数,DataBlade Module 会忽略突出显示数据的所有准备工作,而仅返回分数。 已禁用
PATTERN_ALL 启用所有模式搜索选项:PATTERN_BASIC、PATTERN_TRANS 和 PATTERN_SUBS。 必须已经使用 WORD_SUPPORT = PATTERN 索引参数创建了 etx 索引。 已禁用
PATTERN_BASIC 启用基础搜索选项。该搜索根据 WORD_SCORE 的值返回最佳模式匹配。这可能包含线索中词的子串或父串模式匹配以及调换和替换,但并不保证如此。 必须已经使用 WORD_SUPPORT = PATTERN 索引参数创建了 etx 索引。 已禁用
PATTERN_SUBS 设定搜索引擎返回仅一个字符与线索不匹配的词。 必须已经使用 WORD_SUPPORT = PATTERN 索引参数创建了 etx 索引。 已禁用
PATTERN_TRANS 设定搜索引擎返回仅一个调换与线索不匹配的词。 必须已经使用 WORD_SUPPORT = PATTERN 索引参数创建了 etx 索引。 已禁用
SEARCH_TYPE 允许您指定要执行的搜索类型。
  • 要执行关键字搜索,请指定 WORD
  • 要执行布尔搜索,请指定 BOOLEAN_SEARCH
  • 要执行近似搜索,请指定 PROX_SEARCH
  • 要执行精确词组搜索,请指定 PHRASE_EXACT
  • 要执行近似词组搜索,请指定 PHRASE_APPROX
以下某个值:
  • WORD
  • BOOLEAN_SEARCH
  • PROX_SEARCH(限制)
  • PHRASE_EXACT
  • PHRASE_APPROX

如果设置为 PROX_SEARCHPHRASE_EXACTPHRASE_APPROX,那么必须已经在将 PHRASE_SUPPORT 索引参数设置为 MEDIUMMAXIMUM 的情况下创建了 etx 索引。

如果设置为 BOOLEAN_SEARCH 并用于布尔词组搜索,那么必须已经在将 PHRASE_SUPPORT 索引参数设置为 MEDIUMMAXIMUM 的情况下创建了 etx 索引。

WORD
WILDCARD_CLUE 为 PATTERN_* 查询参数提供替换词。 包含 WILDCARD_CLUE 查询参数时,* 字符可以出现在线索中任意或所有词前面和/或后面,并且将展开 * 以与任意字符串匹配。WILDCARD_CLUE 适用于线索中的各个词。这就意味着,在所有线索词扩展之后,会根据其他查询参数将该线索视作关键字、布尔表达式或词组。使用 WILDCARD_CLUE 时,线索中字面值的精确匹配将使文档分数达到 99,无论匹配词在开头或结尾是否还有其他字母。举例而言,线索 *worth* 与 worth、worthy 和 unworthiness 这些词的匹配分数都是 99。 不能在线索中间指定 *。不能在指定线索的查询参数集中同时使用 WILDCARD_CLUE 查询参数和任何 PATTERN_* 参数。如果希望针对包含字符 *(作为字面值)的线索执行通配符查询,请使用反斜杠对 * 字符进行转义。

* 必须在字符集内,这样才能由 DataBlade 模块搜索到。

如果在通配符查询中包含查询参数 MATCH_SYNONYM,那么会在同义词列表中查找线索中的字面值(排除居前和居后的字符 *)。

如果找到匹配项,所有同义词以及线索中的原始字面值都将执行通配符展开。

如果使用非索引字列表创建了索引,那么 DataBlade Module 会针对通配符展开后产生的所有线索词执行标准非索引字处理。

已禁用
WORD_SCORE 允许您指定模式匹配的最低相似度。搜索引擎只会把满足 WORD_SCORE 所设最低标准的词纳入命中计数。 必须是 1 到 100 之间的值(包含 1 和 100)。指定 0 表明您希望将值重新设置为缺省值 70 70

返回类型

etx_contains() 运算符返回 BOOLEAN

用法

使用 etx_contains(),对存储于表中某一列的文档执行搜索。只能在 SQL 语句的 WHERE 子句中使用 etx_contains() 运算符。 例如:
SELECT title FROM reports
    WHERE etx_contains (abstract, Row('multimedia')) 
    AND doc_no > 1005 ;
etx_contains() 运算符有两个必需参数:一个是要搜索的文本数据所在列的名称,另一个是加引号的线索或包含线索及可选调整参数的 Row() 表达式。线索可以是加引号的字符串,也可以是以 IfxDocDesc 数据类型存储的文档。
重要: 如果希望在 WHERE 子句中使用 etx_contains() ,那么必须已经对要搜索的列定义了 etx 索引。

etx_contains() 的第三个参数(可选)是返回分数和内部突出显示信息的 SLV。 SLV 内容仅在查询期内有效。SLV 的数据类型是 etx_ReturnType,这是从 GBase 8s 派生的行数据类型。有关 etx_ReturnType 数据类型的更多信息,请参阅 etx_ReturnType 数据类型

尽管 etx 访问方法支持分段索引,但不能通过 etx_contains() 来对索引进行分段。

如果未指定任何调整参数,那么 etx_contains() 运算符中的 Row() 构造函数是可选的。 这就意味着上述示例也可以这样指定:
SELECT title FROM reports
    WHERE etx_contains (abstract, 'multimedia') 
    AND doc_no > 1005 ;

通常,线索是包含一个或多个词的加引号字符串,如上述示例中的 multimedia 一词。但是,有时您可能希望将整个文档用作线索。为此,请指定 IfxDocDesc 文档而不是加引号的字符串作为 etx_contains() 运算符的参数之一。

由于 LLD_Locator 数据类型(具有 IfxDocDesc 数据类型的 location 字段的数据类型)具有灵活性,因此您可以将数据库中存储或作为操作系统文件存储的文档指定为线索。在将文档作为线索指定给 etx_contains() 运算符时,仅参考 IfxDocDesc 数据类型的 location 字段。忽略其他字段的内容,如 format version 字段。

下一部分提供了将 IfxDocDesc 文档作为线索的搜索示例。

有关 IfxDocDesc 和 LLD_Locator 数据类型的更多信息,请参阅数据类型

示例

下列语句搜索 abstract 列中的具体词 multimedia,并在 WHERE 子句中包含其他条件:
SELECT title FROM reports
    WHERE etx_contains(abstract, Row('multimedia'))
    AND author = 'Joe Smith';
下列语句对 abstract 列中的具体词 multimedia video 进行搜索,支持搜索字母调换和替换,并要求将名为 my_synonymlist 的列表中的同义词包含在搜索中:
SELECT title FROM reports
    WHERE etx_contains(abstract, 
    Row('multimedia video', 
        'PATTERN_TRANS & PATTERN_SUBS & MATCH_SYNONYM = my_synonymlist'));
下列语句请求将文本搜索排名具体化为语句局部变量 rc1,并依据该排名对返回的行进行排序:
SELECT rc1.score, title FROM reports
    WHERE etx_contains (abstract, 
       Row('video'), rc1 # etx_ReturnType)
    AND doc_no > 1005
    ORDER BY 1;
下列语句对 abstract 列执行搜索,但没有指定加引号的字符串作为索引,而是将以操作系统文件形式存储的 IfxDocDesc 文档作为线索:
SELECT title FROM reports
    WHERE etx_contains (abstract,
    Row ( Row ('ASCII', '0',
          Row ('IFX_FILE', NULL::LLD_Lob,
          '/local0/excal/clue.txt')::LLD_Locator,
          NULL::LVARCHAR)::IfxDocDesc) );

操作系统文件 /local0/excal/clue.txt 的全部内容自动转换为线索。尽管没有指定任何调整参数,IfxDocDesc 线索仍必须封装在 Row() 构造函数中。

下列示例说明如何在 etx_contains() 运算符的 Row() 规范中使用 NO_HILITE 查询参数:
select title from reports 
   where etx_contains(abstract,
   Row('dynamic server','search_type=PROX_SEARCH(3) & NO_HILITE'), 
      rc#Etx_ReturnType) order by rc.score;

select title from reports 
   where etx_contains(abstract,
   Row('build*','WILDCARD_CLUE & NO_HILITE'), rc#Etx_ReturnType);
下列示例显示如何使用 WILDCARD_CLUE 查询参数。 考虑该查询采用下列线索的情形:
select title from reports
   where etx_contains(abstract,
   Row("*forgiv* drink*", "WILDCARD_CLUE & search_type=PHRASE_EXACT"));

该查询可以找出 unforgivable drinkingforgiven drinkers 。但不会找出 unforgiving nondrinkers,因为线索词 drink* 的开头没有 *。

下列示例显示如何综合使用 WILDCARD_CLUE 查询参数和用非索引字列表创建的索引。假设存在下列条件:
  • 非索引字列表中的非索引字有 theandaor
  • 表中的三行在搜索列中具有下列文本:
    • 1 “these are the best of times”
    • 2 “wherever you are, there you are”
    • 3 “over the rainbow”
  • 指定下列线索:
    select title from reports 
       where etx_contains(abstract, 
       Row("the*", "WILDCARD_CLUE & search_type=WORD"));

该查询返回第 1 行和第 2 行。这是因为 the* 可以扩展为 thesetherethe。然后执行非索引字处理,将 the 从搜索中除去。这将使得第 3 行从结果中排除。

有关 etx_contains() 运算符的其他示例,请参阅 概念教程

1 只允许出现一次。
2 请参阅加引号的字符串的语法
3 请参阅行表达式用法的语法
4 请参阅加引号的字符串的语法
5 在一次命令调用中,每个选项只允许出现一次。 但是,可以在同一次命令调用中使用多个不同的选项。