七、clickhouse字符串搜索函數


-- pasition(haystack, needle), 顯示needle在haystack的第一個出現的位置。

SELECT
POSITION('2121stringstrstrstrstr','str') AS positionSearch, -- 5
POSITION('你好,hello,12323-你好,你,好sdfd*dg', '你,好'),-- 31
positionUTF8('n12你好','你好') AS positionUTF8,-- 4
positionCaseInsensitive('ABCDCDEFABCD','bc') AS positionCaseInsensitive, --2
locate('hellohellohellohello','ello'); -- 2

 

-- multiSearchAllPositions(haystack, [needle1, needle2, ..., needlen])
-- 注意:在所有multiSearch*函數中,由於實現規范,needles的數量應小於2^8。
-- 函數返回一個數組,其中包含所有匹配needlei的位置

SELECT
multiSearchAllPositions('goodnamegoodnamegoodhellohihihi', ['dn', 'good']) as multiSearch,-- [4,1]
multiSearchAllPositionsCaseInsensitive('nameSsdfagpSSDFDFetgfderef', ['SS','fa']) as multiCaseInsensitive,
multiSearchAllPositionsUTF8('nameSsdfazz軸功率gpSSDFDFetgfderef', ['Ss','fa', 'zz軸']) AS multiSearchUTF8,
multiSearchAllPositionsCaseInsensitiveUTF8('nameSsdfazz軸功率gpSSDFDFetgfderef', ['Ss','fa', 'zz軸']) AS multiCaseInsensitiveUTF8;
-- 檢查字符串是否與pattern正則表達式匹配。pattern可以是一個任意的re2正則表達式。 re2正則表達式的語法比Perl正則表達式的語法存在更多限制。

 


-- match(haystack, pattern) 匹配到了則返回1,否則返回0

SELECT
match('1232434sadgaDDFSrefds', '[0-9a-zA-Z]'), -- 存在匹配的字符,返回1
match('1232321', '[a-z]'); -- 不存在匹配的字符,返回0
-- 與match相同,但如果所有正則表達式都不匹配,則返回0;如果任何模式匹配,則返回1。它使用hyperscan庫。對於在字符串中搜索子字符串的模式,最好使用“multisearchany”,因為它更高效。

 


-- multiMatchAny(haystack, [pattern1, pattern2, ..., patternn])
-- 注意:任何haystack字符串的長度必須小於232字節,否則拋出異常。這種限制是因為hyperscan API而產生的。
-- 多個正則表達式對原始字符進行匹配,如若只有一個正則表達式匹配上了則返回1,否則返回0

SELECT
multiMatchAny('abcABC',['[0-9]','[a-zA-Z]']) AS multiMatchAnyOne, -- 1
multiMatchAny('123abcABC',['[0-9]','[a-zA-Z]']) AS multiMatchAnyTwo, --1
-- 與multiMatchAny相同,但返回與haystack匹配的任何內容的索引位置。
multiMatchAnyIndex('123abcABC', ['[0-9]','[a-zA-Z]']) as multiMatchAnyIndex; --2
-- 模糊匹配:like()函數,注意大寫敏感。
-- % 表示任何字節數(包括零字符)
-- _ 表示任何一個字節
SELECT
'hello' LIKE '%h%' as LIKE_UP, -- 1
'hello' like 'he' AS like_low, -- 0
'hello' not like 'he' AS not_like, -- 1
'hello' like '%he%' AS like_litter, -- 1
like('adgadgadfa1232', '_12_') AS like_func,
like('sdfasdfasd', '[a-z]') AS like_func2, -- 0
notLike('1232423', '[a-zA-Z]') AS not_like_func; -- 1

-- 使用字符串截取字符串:extract(haystack, pattern)

-- 使用正則表達式截取字符串。如果‘haystack’與‘pattern’不匹配,則返回空字符串。如果正則表達式中不包含子模式,它將獲取與整個正則表達式匹配的子串。否則,它將獲取與第一個子模式匹配的子串。
SELECT
extractAll('hellogoodaimantIdeaIDEAfasd123232', '[0-9]'), -- ['1','2','3','2','3','2']
extractAll('12323dSDFRE', '[A-Z]'),-- ['S','D','F','R','E']
extract('helloclickhouse', '[a-z]');-- h


-- ngramSearch(haystack, needle)

-- 基於4-gram計算haystack和needle之間的距離:計算兩個4-gram集合之間的對稱差異,並用它們的基數和對其進行歸一化。
-- 返回0到1之間的任何浮點數 -- 越接近0則表示越多的字符串彼此相似。
-- 如果常量的needle或haystack超過32KB,函數將拋出異常。如果非常量的haystack或needle字符串超過32Kb,則距離始終為1。
SELECT
ngramDistance('hello123456789','123') AS ngramDistance,
ngramDistanceCaseInsensitive('hello123456789','123') AS ngramDistanceCaseInsensitive,
ngramDistanceUTF8('hello123456789','123') AS ngramDistanceUTF8,
ngramDistanceCaseInsensitiveUTF8('hello123456789','123') AS ngramDistanceCaseInsensitiveUTF8;
-- 注意:對於UTF-8,我們使用3-gram。所有這些都不是完全公平的n-gram距離。
-- 我們使用2字節哈希來散列n-gram,然后計算這些哈希表之間的(非)對稱差異 - 可能會發生沖突。
-- 對於UTF-8不區分大小寫的格式,我們不使用公平的tolower函數
-- 我們將每個Unicode字符字節的第5位(從零開始)和字節的第一位歸零
-- 這適用於拉丁語,主要用於所有西里爾字母。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM