使用全文搜索¶
您可以使用搜索功能在一个或多个表的指定列中查找字符数据(文本)和 IP 地址,包括 VARIANT、OBJECT 和 ARRAY 列中的字段。此功能根据给定的搜索词列表在指定的列或字符串中搜索文本。如果文本与基于搜索语义的指定搜索词匹配,则函数返回 TRUE。
在大多数情况下,调用 SEARCH 函数的方法是在 SELECT 语句的 SELECT 列表或 WHERE 子句中指定该函数。如果该函数作为 WHERE 子句过滤器使用,当函数返回 TRUE 时,查询将返回行。
SEARCH 功能无需设置,也不需要额外权限。如果您使用的角色具有访问列中数据的权限,您可以通过使用 SEARCH 函数来搜索该数据。
接下来的部分包含有关 SEARCH 函数的更多信息,以及在使用它时优化查询性能的相关内容:
使用 SEARCH 函数¶
SEARCH 函数 在一个或多个表中查找指定列中的字符数据(文本),包括 VARIANT、OBJECT 和 ARRAY 列中的字段。
When you use the SEARCH function, a text analyzer breaks the text into tokens, which are discrete units of text, such as words or numbers. A default analyzer is applied if you don't specify one. The analyzer extracts tokens from both the search terms and the data.
If tokens extracted from the search terms match tokens extracted from a specified column or field according to the search semantics, the function returns TRUE. The SEARCH_MODE function argument specifies one of the following search modes:
'OR'- The function uses disjunctive semantics. There is a match if any of the tokens extracted from the columns or fields being searched match any of the tokens extracted from the search string. For example, if thesearch_stringvalue is'blue red green', the function returns TRUE for a row that containsblueORredORgreenin any of the columns or fields being searched.'AND'- The function uses conjunctive semantics. There is a match if the tokens extracted from at least one of the columns or fields being searched matches all of the tokens extracted from the search string. The matching tokens must all be in one column or field; they can't be spread across multiple columns or fields. For example, if thesearch_stringvalue is'blue red green', the function returns TRUE for a row that containsblueANDredANDgreenin at least one of the columns or fields being searched.'PHRASE'– 该函数使用的是短语匹配语义。如果从 至少一个 被搜索列或字段中提取的词元与从搜索字符串中提取的 所有 词元相匹配(包括词元的顺序和相邻关系),则认为匹配成功。匹配语义与合取语义相同,但以下差异除外:
词元的顺序必须完全匹配。例如,如果
search_string值为'blue,red,green',则对于red,green,blue,函数返回 FALSE。搜索数据中不得插入其他词元。例如,如果
search_string值为'blue,red,green',则对于blue,yellow,red,green,函数返回 FALSE。
'EXACT'– 该函数使用的是完全匹配语义。如果从 至少一个 被搜索列或字段中提取的词元与从搜索字符串(包括分隔符)中提取的 所有 词元相匹配,则认为匹配成功。匹配语义与短语搜索语义相同,但以下差异除外:
词元之间的分隔符字符串必须完全匹配。例如,如果
search_string值为'blue,red,green',则对于在至少一个被搜索的列或字段中包含blue,red,green的行,函数返回 TRUE。对于变体(例如blue|red|green或blue, red, green),函数返回 FALSE。当分隔符是
search_string值中的第一个或最后一个字符时,分隔符会被视为匹配字符。因此,第一个和最后一个分隔符左侧和右侧的分隔符也可能导致匹配。例如,如果search_string值为'[blue]',对于foo [blue] bar、[[blue]]`和 :code:`=[blue].,函数返回 TRUE,但不适用于(blue)或foo blue bar。
以下示例使用默认 SEARCH_MODE ('OR') 和默认分析器在文本 leopard 中搜索字符串 snow leopard:
SELECT SEARCH('leopard', 'snow leopard');
+-----------------------------------+
| SEARCH('LEOPARD', 'SNOW LEOPARD') |
|-----------------------------------|
| True |
+-----------------------------------+
以下示例在文本 lion 中搜索字符串 snow leopard:
SELECT SEARCH('lion', 'snow leopard');
+--------------------------------+
| SEARCH('LION', 'SNOW LEOPARD') |
|--------------------------------|
| False |
+--------------------------------+
以下示例在文本 leopard 中搜索字符串 snow leopard,并指定 SEARCH_MODE 参数为 'AND':
SELECT SEARCH('leopard', 'snow leopard', search_mode => 'AND');
+---------------------------------------------------------+
| SEARCH('LEOPARD', 'SNOW LEOPARD', SEARCH_MODE => 'AND') |
|---------------------------------------------------------|
| False |
+---------------------------------------------------------+
有关此功能和其他示例的更多信息,请参阅 SEARCH。
使用 SEARCH_IP 函数¶
SEARCH_IP 函数 在一个或多个表中查找指定字符-字符串列中的有效 IPv4 和 IPv6 地址,包括 VARIANT、OBJECT 和 ARRAY 列中的字段。搜索基于您指定的单个 IP 地址。如果此 IP 地址完全匹配指定列或字段中的 IP 地址,函数将返回 TRUE。
以下示例在文本 192.0.2.146 中搜索 IP 地址 10.10.10.1:
SELECT SEARCH_IP('192.0.2.146','10.10.10.1');
+---------------------------------------+
| SEARCH_IP('192.0.2.146','10.10.10.1') |
|---------------------------------------|
| False |
+---------------------------------------+
有关此功能和其他示例的更多信息,请参阅 SEARCH_IP。
优化使用 SEARCH 函数的查询¶
为了提高该使用该函数的查询性能,您可以在表中的特定列或列集上选择性地 启用 FULL_TEXT 搜索优化。当您启用搜索优化时,将建立并维护一个新的 搜索访问路径。