CONTAINS ( column-name [,...], contains-query-string )
contains-query-string : simple-expression | or-expression
simple-expression : primary-expression | and-expression
or-expression : simple-expression { OR | | } contains-query-string
primary-expression : basic-expression | FUZZY " fuzzy-expression " | and-not-expression
and-expression : primary-expression [ AND | & ] simple-expression
and-not-expression : primary-expression [ AND | & ] { NOT | - } basic-expression
basic-expression : term | phrase | ( contains-query-string ) | near-expression | before-expression
fuzzy-expression : term | fuzzy-expression term
term : simple-term | prefix-term
prefix-term :
simple-term*
phrase : " phrase-string "
near-expression : term NEAR [ [ min-distance ], max-distance ] term | term { NEAR | ~ } term
before-expressions : term BEFORE [ [ min-distance ] max-distance ] term | term BEFORE term
phrase-string : term | phrase-string term
simple-term:以空格和特殊字符分隔的字符串,用于 表示要搜索的单个索引术语(单词)
distance:正整数
and-expression 指定 primary-expression 和 simple-expression 都必须出现在文本索引中。
缺省情况下,如果在术语或表达式之间未指定任何运算符,则假定为 and-expression。例如,'a b'
被解释为 'a AND b'
。
和号 (&) 可用来代替 AND,并且可以紧靠表达式或术语的任何一侧(例如,'a &b'
)。
and-not-expression 指定 primary-expression 必须存在于文本索引中,但 basic-expression 一定不能 出现在文本索引中。这也称为取非。
如果使用连字符表示取非,则在连字符左侧必须留有一个空格,且连字符右侧必须与术语邻接;否则不将连字符解释为取非。例如,'a -b'
等同于 'a AND NOT b'
;而对于 'a - b'
,连字符被忽略,该字符串等同于 'a AND b'
。'a-b'
等同于短语 '"a b"'
。
or-expression
指定 simple-expression 或 contains-query-string 至少有一个存在于文本索引中。例如,'a|b'
被解释为 'a OR b'
。
fuzzy-expression 查找与您指定的术语相类似的术语。只有 NGRAM 文本索引上支持模糊匹配。
near-expression
搜索彼此邻近的术语。这也称为邻近搜索。例如,['b NEAR[5] c'
] 搜索相互间隔五个或五个以下术语的 b 和 c 实例。术语的顺序并不重要;'b NEAR c'
等同于 'c NEAR b'
。
如果未指定最大距离,则缺省距离为 10。如果未指定最小距离,则缺省距离为 1。
查询 ['apple NEAR[2, 10] tree'
] 与以下文档相匹配:
'apple grows on the tree' 'apple and tree' 'tree and apple' |
但是,该查询与以下文档不匹配:
'apple tree' 'tree apple' |
可指定代字号 (~) 来代替 NEAR。使用代字号相当于指定 NEAR 时未指定距离,所以采用缺省值最多 10 个术语、最少 1 个术语。如果指定代字号,则无法指定最大或最小距离;距离始终为 10 个术语。
NEAR 表达式不可以链接在一起(例如,['a NEAR[1] b NEAR[1] c'
] 是无效的)。
before-expression
使用 before-expression 可搜索位于另一个术语之前的术语。这也称为邻近搜索。必须按照匹配文本中的参数在 CONTAINS 查询字符串中的指定顺序来查找这些参数。例如,['apple BEFORE[2, 10] tree'
] 与以下文档相匹配:
'apple grows on the tree' 'apple and tree' |
但是,该查询与以下文档不匹配:
'tree and apple' 'apple tree' 'tree apple' |
以下查询是等效的:
'apple BEFORE tree' 'apple BEFORE[10] tree' 'apple BEFORE[1, 10] tree' |
如果未指定最大距离,则缺省距离为 10。如果未指定最小距离,则缺省距离为 1。
prefix-term
搜索以指定前缀开始的术语。例如,'datab*'
用于搜索以 datab 开始的任何术语。这也称为前缀搜索。在前缀搜索中,执行匹配的是星号左侧的术语部分。
CONTAINS 搜索条件将一个列列表和 contains-query-string 作为参数。它可以用在任何能够指定搜索条件(也称作谓词)的位置,并返回 TRUE 或 FALSE。contains-query-string 必须是含有在查询时便已知的值的常量字符串或变量。contains-query-string 不能为 NULL、空字符串或超过 300 个有效术语。有效术语是在允许的术语长度内且不包含在 STOPLIST 中的术语。当 contains-query-string 超过 300 个有效术语时会返回错误。
如果文本配置设置导致删除 contains-query-string 中的所有术语,则 CONTAINS 搜索条件的结果为 FALSE。
有关如何解释 contains-query-string 的详细信息,请参见文本配置对象示例。
如果指定了多个列,则它们全都必须引用单个基表;一个文本索引不能跨多个基表。基表可以在 FROM 子句中直接引用,也可以用在视图或派生表中。
以下警告适用于在查询字符串中使用非字母数字字符的情况:
在术语中间使用星号会返回错误。
不要在 fuzzy-expression 中使用非字母数字(包括特殊字符),因为它们会被视为空格并用作术语中断符。
如果可能,不要在查询字符串中包含不是特殊字符的非字母数字字符。任何不是特殊字符的非字母数字字符都会使包含该字符的术语被视为一个短语,从而在字符所在的位置断开术语。例如,'things we've done'
被解释为 'things "we ve" done'
。
在短语内,星号是唯一被继续解释为特殊字符的特殊字符。短语中所有其它特殊字符都被视作空白并用作术语中断符。
对 contains-query-string 进行解释主要包括两步:
第 1 步:解释运算符和优先级 在执行此步骤期间,将关键字解释为运算符,并应用优先级规则。
第 2 步:应用文本配置对象设置 在执行此步骤期间,将文本配置对象设置应用于术语。例如,在 NGRAM 文本索引中,术语被分解为 n 元语法词表示。在执行此步骤期间,将删除超过术语长度设置或在非索引字表中的查询术语。
SQL Anywhere 目前不支持将 BEFORE 关键字作为运算符。例如,如果指定 CONTAINS(column-name, 'a before b')
,则返回错误。请改用 NEAR 关键字来建立查询。
您可以 搜索单词 before,只要它是短语查询的一部分。例如,CONTAINS(column-name, '"a before b"')
。此查询将搜索短语 "a before b"。
星号被用于前缀搜索。星号可以出现在查询字符串的结尾处,或在其后紧跟空格、和号、竖线、右括号或右引号。其它所有的星号用法都会返回错误。
下表显示了允许的星号用法:
查询字符串 | 等同于 | 解释为 |
---|---|---|
|
查找所有以 th 开头的术语。 | |
|
|
查找所有以 th 开头的术语,并查找术语 best。 |
|
|
查找所有以 th 开头的术语,或查找术语 best。 |
|
|
查找术语 very,并查找术语 best 或任何以 th 开头的术语。 |
|
查找术语 fast,随后紧跟以 auto 开头的术语。 | |
|
查找以 auto 开头的术语,随后紧跟术语 price。 |
对包含星号的查询字符串的解释视文本配置对象设置而异。
连字符可用于对术语或表达式取非,等同于 NOT。是否将连字符解释为取非要取决于连字符在查询字符串中的位置。例如,如果连字符紧靠在术语或表达式之前,则将连字符解释为取非。如果将连字符嵌入术语内,则将连字符解释为连字符。
用于取非的连字符的前面必须有一个空格,而后面紧跟表达式。
当用在模糊表达式的短语中时,连字符被视为空白并用作术语分隔符。
下表显示了对于连字符允许的语法:
查询字符串 | 等同于: | 解释为: |
---|---|---|
|
|
查找术语 the,但不查找术语 best。 |
|
'the AND NOT (very AND best)' |
查找术语 the,但不查找术语 very 和 best。 |
|
'the AND NOT "very best"' |
查找术语 the,但不查找短语 very best。 |
|
|
查找术语 alpha,随后紧跟术语 numerics。 |
|
|
查找术语 wild,并查找术语 west。 |
下表显示允许的所有特殊字符(星号和连字符除外)语法。
如果在短语中找到了这些字符,则不认为它们是特殊字符,并将它们删除。
指定字符串文字时的限制同样适用于查询字符串。例如,必须对撇号进行转义等。
字符或语法 | 用法示例和注释 |
---|---|
和号 (&) |
和号等同于 AND,可指定为以下形式:
|
竖线 (|) |
竖线等同于 OR,可指定为以下形式:
|
双引号 (") |
双引号用于包含那些顺序和相对距离都很重要的一连串术语。例如,在查询字符串 [ |
括号 () |
如果表达式的计算顺序与缺省顺序不同,则使用括号指定表达式的计算顺序。例如, |
代字号 (~) |
代字号等同于 NEAR[10]。查询字符串 无法同时指定距离和代字号。 |
方括号 [ ] | 方括号与关键字 NEAR 配合使用以包含 distance。方括号的其它用法会返回错误。 |
SQL/2008 CONTAINS 谓语是一个服务商扩充。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |