ClickHouse/docs/zh/sql_reference/functions/string_search_functions.md
2020-04-08 17:22:25 +03:00

8.4 KiB
Raw Blame History

字符串搜索函数

下列所有函数在默认的情况下区分大小写。对于不区分大小写的搜索,存在单独的变体。

位置(大海捞针),定位(大海捞针)

在字符串haystack中搜索子串needle。 返回子串的位置以字节为单位从1开始如果未找到子串则返回0。

对于不区分大小写的搜索,请使用函数positionCaseInsensitive

positionUTF8(大海捞针)

position相同但位置以Unicode字符返回。此函数工作在UTF-8编码的文本字符集中。如非此编码的字符集则返回一些非预期结果他不会抛出异常

对于不区分大小写的搜索,请使用函数positionCaseInsensitiveUTF8

多搜索分配(干草堆,[针1,针2, …, needlen])

position相同但函数返回一个数组其中包含所有匹配needle的位置。

对于不区分大小写的搜索或/和UTF-8格式使用函数multiSearchAllPositionsCaseInsensitivemultiSearchAllPositionsUTF8multiSearchAllPositionsCaseInsensitiveUTF8

multiSearchFirstPosition(大海捞针,[针1,针2, …, needlen])

position相同,但返回在haystack中与needles字符串匹配的最左偏移。

对于不区分大小写的搜索或/和UTF-8格式使用函数multiSearchFirstPositionCaseInsensitivemultiSearchFirstPositionUTF8multiSearchFirstPositionCaseInsensitiveUTF8

multiSearchFirstIndex(大海捞针,[针1,针2, …, needlen])

返回在字符串haystack中最先查找到的needle的索引i从1开始没有找到任何匹配项则返回0。

对于不区分大小写的搜索或/和UTF-8格式使用函数multiSearchFirstIndexCaseInsensitivemultiSearchFirstIndexUTF8multiSearchFirstIndexCaseInsensitiveUTF8

多搜索(大海捞针,[针1,针2, …, needlen])

如果haystack中至少存在一个needle匹配则返回1否则返回0。

对于不区分大小写的搜索或/和UTF-8格式使用函数multiSearchAnyCaseInsensitivemultiSearchAnyUTF8multiSearchAnyCaseInsensitiveUTF8

!!! note "注意" 在所有multiSearch*函数中由于实现规范needles的数量应小于28

匹配(大海捞针,模式)

检查字符串是否与pattern正则表达式匹配。pattern可以是一个任意的re2正则表达式。 re2正则表达式的语法比Perl正则表达式的语法存在更多限制。

如果不匹配返回0否则返回1。

请注意,反斜杠符号(\)用于在正则表达式中转义。由于字符串中采用相同的符号来进行转义。因此,为了在正则表达式中转义符号,必须在字符串文字中写入两个反斜杠(\)。

正则表达式与字符串一起使用,就像它是一组字节一样。正则表达式中不能包含空字节。 对于在字符串中搜索子字符串的模式最好使用LIKE或«position»因为它们更加高效。

multiMatchAny大海捞针[模式1,模式2, …, patternn])

match相同但如果所有正则表达式都不匹配则返回0如果任何模式匹配则返回1。它使用超扫描库。对于在字符串中搜索子字符串的模式最好使用«multisearchany»因为它更高效。

!!! note "注意" 任何haystack字符串的长度必须小于232</ sup>字节否则抛出异常。这种限制是因为hyperscan API而产生的。

multiMatchAnyIndex大海捞针[模式1,模式2, …, patternn])

multiMatchAny相同但返回与haystack匹配的任何内容的索引位置。

multiFuzzyMatchAny(干草堆,距离,[模式1,模式2, …, patternn])

multiMatchAny相同但如果在haystack能够查找到任何模式匹配能够在指定的编辑距离内进行匹配则返回1。此功能也处于实验模式可能非常慢。有关更多信息请参阅hyperscan文档

multiFuzzyMatchAnyIndex(大海捞针,距离,[模式1,模式2, …, patternn])

multiFuzzyMatchAny相同,但返回匹配项的匹配能容的索引位置。

!!! note "注意" multiFuzzyMatch*函数不支持UTF-8正则表达式由于hyperscan限制这些表达式被按字节解析。

!!! note "注意" 如要关闭所有hyperscan函数的使用请设置SET allow_hyperscan = 0;

提取(大海捞针,图案)

使用正则表达式截取字符串。如果'haystack'与'pattern'不匹配,则返回空字符串。如果正则表达式中不包含子模式,它将获取与整个正则表达式匹配的子串。否则,它将获取与第一个子模式匹配的子串。

extractAll大海捞针图案)

使用正则表达式提取字符串的所有片段。如果'haystack'与'pattern'正则表达式不匹配,则返回一个空字符串。否则返回所有与正则表达式匹配的字符串数组。通常,行为与'extract'函数相同(它采用第一个子模式,如果没有子模式,则采用整个表达式)。

像(干草堆,模式),干草堆像模式运算符

检查字符串是否与简单正则表达式匹配。 正则表达式可以包含的元符号有_

% 表示任何字节数(包括零字符)。

_ 表示任何一个字节。

可以使用反斜杠(\来对元符号进行转义。请参阅«match»函数说明中有关转义的说明。

对于像needle这样的正则表达式,改函数与position函数一样快。 对于其他正则表达式,函数与'match'函数相同。

不喜欢(干草堆,模式),干草堆不喜欢模式运算符

与'like'函数返回相反的结果。

大海捞针)

基于4-gram计算haystackneedle之间的距离计算两个4-gram集合之间的对称差异并用它们的基数和对其进行归一化。返回0到1之间的任何浮点数 越接近0则表示越多的字符串彼此相似。如果常量的needlehaystack超过32KB函数将抛出异常。如果非常量的haystackneedle字符串超过32Kb则距离始终为1。

对于不区分大小写的搜索或/和UTF-8格式使用函数ngramDistanceCaseInsensitivengramDistanceUTF8ngramDistanceCaseInsensitiveUTF8

ツ暗ェツ氾环催ツ団ツ法ツ人)

ngramDistance相同,但计算needlehaystack之间的非对称差异——needle的n-gram减去needle归一化n-gram。可用于模糊字符串搜索。

对于不区分大小写的搜索或/和UTF-8格式使用函数ngramSearchCaseInsensitivengramSearchUTF8ngramSearchCaseInsensitiveUTF8

!!! note "注意" 对于UTF-8我们使用3-gram。所有这些都不是完全公平的n-gram距离。我们使用2字节哈希来散列n-gram然后计算这些哈希表之间的对称差异 - 可能会发生冲突。对于UTF-8不区分大小写的格式我们不使用公平的tolower函数 - 我们将每个Unicode字符字节的第5位从零开始和字节的第一位归零 - 这适用于拉丁语,主要用于所有西里尔字母。

来源文章