Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

文字列分割関数

alphaTokens

導入バージョン: v1.1.0

a-z および A-Z の範囲に含まれる連続したバイト列からなる部分文字列を抽出し、それらの部分文字列の配列を返します。

構文

alphaTokens(s[, max_substrings])

別名: splitByAlpha

引数

  • s — 分割する文字列。String
  • max_substrings — 任意。max_substrings > 0 の場合、返される部分文字列の数は max_substrings 以下になります。それ以外の場合、この関数は可能な限り多くの部分文字列を返します。Int64

戻り値

s から抽出された部分文字列の配列を返します。Array(String)

使用例

SELECT alphaTokens('abca1abc');
┌─alphaTokens('abca1abc')─┐
│ ['abca','abc']          │
└─────────────────────────┘

arrayStringConcat

導入バージョン: v1.1.0

配列内の値の文字列表現を、指定した区切り文字で連結します。区切り文字は省略可能なパラメータで、デフォルト値は空文字列です。

構文

arrayStringConcat(arr[, separator])

別名: array_to_string

引数

  • arr — 連結する配列。Array(T)
  • separator — 省略可能。区切り文字列。デフォルトは空文字列です。const String

戻り値

連結後の文字列を返します。String

使用例

SELECT arrayStringConcat(['12/05/2021', '12:50:00'], ' ') AS DateString;
┌─DateString──────────┐
│ 12/05/2021 12:50:00 │
└─────────────────────┘

extractAllGroupsVertical

導入バージョン: v20.5.0

正規表現を使用して文字列内のすべてのグループに一致する部分を抽出し、配列の配列を返します。各配列には、入力文字列での出現順にまとめられた、各グループの一致部分が含まれます。

構文

extractAllGroupsVertical(s, regexp)

別名: extractAllGroups

引数

戻り値

配列の配列を返します。各内側の配列には、1 回のマッチでキャプチャされたグループが含まれます。各マッチごとに、正規表現内のキャプチャグループ (グループ 1、グループ 2 など) に対応する要素を持つ配列が生成されます。マッチが見つからない場合は、空の配列を返します。Array(Array(String))

使用例

WITH '< Server: nginx
< Date: Tue, 22 Jan 2019 00:26:14 GMT
< Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
' AS s
SELECT extractAllGroupsVertical(s, '< ([\\w\\-]+): ([^\\r\\n]+)');
[['Server','nginx'],['Date','Tue, 22 Jan 2019 00:26:14 GMT'],['Content-Type','text/html; charset=UTF-8'],['Connection','keep-alive']]

naiveBayesNgrams

導入バージョン: v26.7.0

Naive Bayes Dictionary (NAIVE_BAYES レイアウト) と同じトークン化方式でテキストを N-gram に分割します。bytecodepointtoken モードに対応し、必要に応じて境界パディングも指定できます。これを使うと、その Dictionary が取り込む事前集計済みの (ngram, class_id, count) 学習データを作成できるため、学習用 N-gram を naiveBayesClassifier がクエリ時に生成するものと完全に一致させられます。

構文

naiveBayesNgrams(text, n, mode[, start_token, end_token])

引数

  • text — N-gram に分割するテキスト。String
  • n — N-gram のサイズ。1 ~ 1024。const UInt
  • mode — トークン化モード: 'byte'、'codepoint'、または 'token'。const String
  • start_token — 任意。入力の先頭に境界トークンを (n-1) 回追加します。'byte'/'codepoint' では数値、'token' ではリテラルです。空文字列の場合、パディングは行われません。const String
  • end_token — 任意。入力の末尾に境界トークンを (n-1) 回追加します。const String

戻り値

入力テキストの N-gram。Array(String)

トークンのバイグラム

SELECT naiveBayesNgrams('the cat sat', 2, 'token');
['the cat','cat sat']

境界パディング付きトークンバイグラム

SELECT naiveBayesNgrams('cat', 2, 'token', '<s>', '</s>');
['<s> cat','cat </s>']

境界パディング付きバイトバイグラム (結果は16進数で表示)

SELECT arrayMap(x -> hex(x), naiveBayesNgrams('xy', 2, 'byte', '0x01', '0xFF'));
['0178','7879','79FF']

境界パディング付きのコードポイントバイグラム (結果は16進数で表示)

SELECT arrayMap(x -> hex(x), naiveBayesNgrams('ab', 2, 'codepoint', '0x10FFFE', '0x10FFFF'));
['F48FBFBE61','6162','62F48FBFBF']

ngrams

導入バージョン: v21.11.0

UTF-8文字列を長さ N の N-gram に分割します。

構文

ngrams(s, N)

引数

戻り値

N-gram の配列を返します。Array(String)

使用例

SELECT ngrams('ClickHouse', 3);
['Cli','lic','ick','ckH','kHo','Hou','ous','use']

reverseBySeparator

導入バージョン: v26.2.0

指定した区切り文字で区切られた文字列内の部分文字列の順序を反転します。 この関数は、区切り文字で文字列を分割し、得られた各部分の順序を逆にしたうえで、 同じ区切り文字を使って再結合します。ドメイン名、 ファイルパス、その他の階層データで部分の順序を逆にしたい場合のパースに便利です。

例:

  • reverseBySeparator('www.google.com') は 'com.google.www' を返します
  • reverseBySeparator('a/b/c', '/') は 'c/b/a' を返します
  • reverseBySeparator('x::y::z', '::') は 'z::y::x' を返します

構文

reverseBySeparator(string[, separator])

引数

  • string — 各部分の順序を逆にする入力文字列。String
  • separator — 各部分の識別に使用する区切り文字列。指定しない場合は '.' (ドット) を使用します。デフォルト: '.' String

戻り値

元の文字列の部分文字列を右から左へ並べ替え、同じ区切り文字で連結した文字列を返します。String

基本的なドメインの反転

SELECT reverseBySeparator('www.google.com')
com.google.www

パスの逆順

SELECT reverseBySeparator('a/b/c', '/')
c/b/a

任意の区切り文字

SELECT reverseBySeparator('x::y::z', '::')
z::y::x

ドットを含む場合の注意点

SELECT reverseBySeparator('.a.b.', '.')
.b.a.

単一の要素

SELECT reverseBySeparator('single')
single

空の区切り文字

SELECT reverseBySeparator('abcde', '')
edcba

splitByChar

導入バージョン: v1.1.0

指定したちょうど 1 文字の定数文字列 separator で文字列を分割し、部分文字列の配列を返します。 区切り文字が文字列の先頭または末尾にある場合や、区切り文字が連続して複数出現する場合は、空の部分文字列が生成されることがあります。

次の場合、空の部分文字列が生成されることがあります。

  • 区切り文字が文字列の先頭または末尾にある
  • 区切り文字が連続して複数出現する
  • 元の文字列 s が空である

構文

splitByChar(separator, s[, max_substrings])

引数

  • separator — 区切り文字は 1 バイト文字である必要があります。String
  • s — 分割対象の文字列です。String
  • max_substrings — 任意です。max_substrings > 0 の場合、返される配列に含まれる部分文字列は最大 max_substrings 個です。それ以外の場合、関数は可能な限り多くの部分文字列を返します。デフォルト値は 0 です。Int64

戻り値

抽出された部分文字列の配列を返します。Array(String)

使用例

SELECT splitByChar(',', '1,2,3,abcde');
┌─splitByChar(',', '1,2,3,abcde')─┐
│ ['1','2','3','abcde']           │
└─────────────────────────────────┘

splitByNonAlpha

導入バージョン: v21.9.0

空白文字および句読点で区切って、文字列を部分文字列の配列に分割します。

構文

splitByNonAlpha(s[, max_substrings])

引数

  • s — 分割対象の文字列。String
  • max_substrings — 省略可。max_substrings > 0 の場合、返される部分文字列の数は max_substrings 個以下になります。それ以外の場合、この関数は可能な限り多くの部分文字列を返します。デフォルト値: 0Int64

戻り値

s から抽出された部分文字列の配列を返します。Array(String)

使用例

SELECT splitByNonAlpha('user@domain.com');
['user','domain','com']

splitByRegexp

導入バージョン: v21.6.0

指定された正規表現で区切られた文字列を、部分文字列の配列に分割します。 指定された正規表現が空の場合、文字列は1文字ずつの配列に分割されます。 正規表現に一致する箇所が見つからない場合、文字列は分割されません。

次の場合、空の部分文字列が選択されることがあります。

  • 空でない正規表現の一致が文字列の先頭または末尾にある場合
  • 空でない正規表現の一致が連続して複数回発生する場合
  • 正規表現が空でなく、元の文字列 string が空の場合。

構文

splitByRegexp(regexp, s[, max_substrings])

引数

  • regexp — 正規表現。定数。String または FixedString
  • s — 分割対象の文字列。String
  • max_substrings — 任意。max_substrings > 0 の場合、返される部分文字列の数は最大で max_substrings になります。それ以外の場合、この関数は可能な限り多くの部分文字列を返します。デフォルト値: 0Int64

戻り値

s から抽出された部分文字列の配列を返します。Array(String)

使用例

SELECT splitByRegexp('\\d+', 'a12bc23de345f');
┌─splitByRegexp('\\d+', 'a12bc23de345f')─┐
│ ['a','bc','de','f']                    │
└────────────────────────────────────────┘

空の正規表現

SELECT splitByRegexp('', 'abcde');
┌─splitByRegexp('', 'abcde')─┐
│ ['a','b','c','d','e']      │
└────────────────────────────┘

splitByString

導入バージョン: v1.1.0

複数文字で構成される定数 separator を使って文字列を分割し、部分文字列の配列を返します。 文字列 separator が空の場合、文字列 s は1文字ずつの配列に分割されます。

次の場合、空の部分文字列が含まれることがあります。

  • 空でない区切り文字が文字列の先頭または末尾にある場合
  • 空でない区切り文字が連続して複数ある場合
  • 区切り文字が空でなく、元の文字列 s が空の場合

構文

splitByString(separator, s[, max_substrings])

引数

  • separator — 区切り文字。 String
  • s — 分割対象の文字列。 String
  • max_substrings — 任意。max_substrings > 0 の場合、返される部分文字列の数は max_substrings 以下になります。それ以外の場合、この関数は可能な限り多くの部分文字列を返します。デフォルト値: 0Int64

戻り値

s から抽出された部分文字列の配列を返します。 Array(String)

使用例

SELECT splitByString(', ', '1, 2 3, 4,5, abcde');
┌─splitByString(', ', '1, 2 3, 4,5, abcde')─┐
│ ['1','2 3','4,5','abcde']                 │
└───────────────────────────────────────────┘

区切り文字が空の場合

SELECT splitByString('', 'abcde');
┌─splitByString('', 'abcde')─┐
│ ['a','b','c','d','e']      │
└────────────────────────────┘

splitByWhitespace

導入バージョン: v21.9.0

空白文字で区切られた文字列を、部分文字列の配列に分割します。

構文

splitByWhitespace(s[, max_substrings])

引数

  • s — 分割対象の文字列。String
  • max_substrings — 任意。max_substrings > 0 の場合、返される部分文字列の数は max_substrings を超えません。それ以外の場合、関数は可能な限り多くの部分文字列を返します。デフォルト値: 0Int64

戻り値

s から抽出された部分文字列の配列を返します。Array(String)

使用例

SELECT splitByWhitespace('  1!  a,  b.  ');
['1!','a,','b.']

tokens

導入バージョン: v21.11.0

指定されたトークナイザーを使用して、文字列をトークンに分割します。

利用可能なトークナイザーは次のとおりです。

  • splitByNonAlpha は、ASCII の英数字以外の文字で文字列を分割します (関数 splitByNonAlpha も参照) 。
  • splitByString(S) は、ユーザー定義の区切り文字列 S で文字列を分割します (関数 splitByString も参照) 。区切り文字は省略可能なパラメータで指定できます。たとえば tokens(value, 'splitByString', [', ', '; ', '\n', '\\']) のように指定します。なお、各区切り文字列は複数文字で構成できます (例では ', ') 。明示的に指定しない場合、デフォルトの区切り文字リストは単一の空白文字 [' '] です。
  • splitByRegexp(re) は、ユーザー定義の正規表現区切り文字 re で文字列を分割します (関数 splitByRegexp も参照) 。正規表現は必須です。たとえば tokens(value, 'splitByRegexp', '[^\p{L}\p{N}#+]+') のように指定します。splitByString とは異なり、正規表現区切り文字では、C++C# などの特殊文字を含むトークンを保持できます。
  • asciiCJK は、Unicode の単語境界規則 (UAX #29 に類似) を使用して文字列をトークンに分割します。ASCII の英数字およびアンダースコアは、コネクタ (文字には :、同種の文字には .') とともにトークンを形成します。非 ASCII の Unicode 文字は 1 文字単位のトークンになります。
  • chinese は、辞書と隠れマルコフモデルを使用して中国語テキストを単語に分割します (アルゴリズムは jieba に従い、埋め込み辞書とモデルデータは cppjieba から派生しています) 。非 ASCII 文字をすべて 1 文字単位のトークンとして扱う asciiCJK とは異なり、chinese は連続する中国語文字を単語にまとめるため、中国語テキストではより意味のあるトークンと高い検索品質が得られます。省略可能な granularity 引数には、coarse_grained (デフォルト) または fine_grained を指定します。後者は重複する部分単語も列挙するため、索引が大きくなる代わりに再現率が向上します。
  • icu(locale) は、ICU ライブラリの Unicode 単語分割 (UAX #29) を使用して文字列を単語トークンに分割します。単語間に空白のない文字体系 (中国語、日本語、タイ語など) では、ICU は辞書ベースの分割を適用するため、そのようなテキストは意味のある単語に分割されます。locale はセグメンターに渡される ICU ロケールです (分割は主に文字体系と辞書に基づいて行われ、ロケールは ICU のロケール固有の調整を選択します) 。これは必須であり、たとえば tokens(value, 'icu', 'ja') のように個別の引数として渡します。
  • japanese は、MeCab 形態素解析器を使用して日本語テキストを単語に分割します。サーバー設定で構成された辞書が必要です (テキスト索引 のドキュメントを参照) 。
  • ngrams(N) は、文字列を同じ長さの N-gram に分割します (関数 ngrams も参照) 。N-gram の長さは、1 から 8 までの省略可能な整数パラメータで指定できます。たとえば tokens(value, 'ngrams', 3) のように指定します。明示的に指定しない場合、デフォルトの ngram サイズは 3 です。
  • sparseGrams(min_length, max_length, min_cutoff_length) は、文字数が min_length 以上 max_length 以下 (両端含む) の可変長 n-gram に文字列を分割します (関数 sparseGrams も参照) 。明示的に指定しない場合、min_lengthmax_length のデフォルト値はそれぞれ 3 と 100 です。パラメータ min_cutoff_length を指定すると、長さが min_cutoff_length 以上の n-gram のみが返されます。ngrams(N) と比べると、sparseGrams トークナイザーは可変長の N-gram を生成するため、元のテキストをより柔軟に表現できます。たとえば tokens(value, 'sparseGrams', 3, 5, 4) は、入力文字列から内部的に 3-, 4-, 5-gram を生成しますが、返されるのは 4-gram と 5-gram のみです。
  • array はトークン化を行いません。つまり、各行の値全体が 1 つのトークンになります (関数 array も参照) 。他のシステムとの互換性のため、keywordarray の別名として利用できます。

splitByString トークナイザーで、トークンがプレフィックスコードを構成しない場合は、長い区切り文字を優先して一致させる必要があるでしょう。 そのためには、区切り文字を長さの降順で渡します。 たとえば、separators = ['%21', '%'] の場合、文字列 %21abc['abc'] としてトークン化されます。一方、separators = ['%', '%21'] の場合は ['21ac'] としてトークン化されます (これはおそらく意図した結果ではありません) 。

構文

tokens(value) -- 'splitByNonAlpha' tokenizer
tokens(value, 'splitByNonAlpha')
tokens(value, 'splitByString'[, separators])
tokens(value, 'splitByRegexp', regexp)
tokens(value, 'asciiCJK')
tokens(value, 'chinese'[, granularity])
tokens(value, 'icu', locale)
tokens(value, 'japanese')
tokens(value, 'ngrams'[, n])
tokens(value, 'sparseGrams'[, min_length, max_length[, min_cutoff_length]])
tokens(value, 'array')

引数

  • value — 入力文字列です。String または FixedString
  • tokenizer — 使用するトークナイザーです。有効な引数は splitByNonAlphasplitByStringsplitByRegexpasciiCJKchineseicujapanesengramssparseGramsarray です。省略可能で、明示的に設定しない場合のデフォルトは splitByNonAlpha です。const String
  • locale — 引数 tokenizericu の場合にのみ使用します。たとえば 'ja' のような必須のロケールです。const String
  • n — 引数 tokenizerngrams の場合にのみ使用します。N-gram の長さを指定する省略可能なパラメータです。明示的に設定しない場合のデフォルトは 3 です。const UInt8
  • separators — 引数 tokenizersplit の場合にのみ使用します。区切り文字列を指定する省略可能なパラメータです。明示的に設定しない場合のデフォルトは [' '] です。const Array(String)
  • regexp — 引数 tokenizersplitByRegexp の場合にのみ使用します。正規表現の区切り文字を指定する必須パラメータです。const String
  • min_length — 引数 tokenizersparseGrams の場合にのみ使用します。最小グラム長を指定する省略可能なパラメータで、デフォルトは 3 です。const UInt8
  • max_length — 引数 tokenizersparseGrams の場合にのみ使用します。最大グラム長を指定する省略可能なパラメータで、デフォルトは 100 です。const UInt8
  • min_cutoff_length — 引数 tokenizersparseGrams の場合にのみ使用します。最小カットオフ長を指定する省略可能なパラメータです。const UInt8
  • granularity — 引数 tokenizerchinese の場合にのみ使用します。セグメンテーションの粒度を制御する省略可能なパラメータで、coarse_grained (デフォルト) または fine_grained のいずれかです。const String

戻り値

入力文字列から得られたトークンの Array を返します。Array

デフォルトのトークナイザー

SELECT tokens('test1,;\\\\ test2,;\\\\ test3,;\\\\   test4') AS tokens;
['test1','test2','test3','test4']

Ngram トークナイザー

SELECT tokens('abc def', 'ngrams', 3) AS tokens;
['abc','bc ','c d',' de','def']

tokensForLikePattern

導入バージョン: v26.3.0

指定したトークナイザーを使用して、LIKE のパターン文字列をトークンに分割します。

tokens 関数とは異なり、この関数は LIKE パターンの特性 (先頭および末尾のワイルドカード文字など) を考慮し、パターンマッチングに有用な トークンを抽出するための、トークナイザー固有のルールを適用します。

この関数は tokens 関数と同じ引数セットをサポートしますが、一部例外があります。 chinese および icu トークナイザーはここではサポートされません。 LIKE パターンのトークン化が意味を持つのは、LIKE のセマンティクスを明示的にサポートする (supportsStringLike()) トークナイザーに限られます。サポートされていないトークナイザーで tokensForLikePattern を呼び出すと BAD_ARGUMENTS がスローされます。 代わりに通常の tokens を使用してください。

tokenizer の後に続く追加の引数は、選択した トークナイザーに応じて解釈されます (たとえば、ngramsnsplitByStringseparatorssparseGramsmin_length / max_length [/ min_cutoff_length]) 。

この関数は主にデバッグおよびテスト用途を想定しており、 LIKE パターンに対するトークン化の挙動を解析するために内部で使用されます。

構文

tokensForLikePattern(value[, tokenizer[, tokenizer_specific_arguments...]])

引数

  • value — 入力文字列です。String または FixedString
  • tokenizer — 使用するトークナイザーです。有効な値は splitByNonAlphasplitByStringasciiCJKngramssparseGramsarray です。省略可能で、明示的に設定しない場合のデフォルトは splitByNonAlpha です。const String
  • locale — 引数 tokenizericu の場合にのみ使用されます。たとえば 'ja' のような、必須のロケールです。const String
  • n — 引数 tokenizerngrams の場合にのみ使用されます。N-gram の長さを指定する省略可能なパラメータです。明示的に設定しない場合のデフォルトは 3 です。const UInt8
  • separators — 引数 tokenizersplit の場合にのみ使用されます。区切り文字列を指定する省略可能なパラメータです。明示的に設定しない場合のデフォルトは [' '] です。const Array(String)
  • regexp — 引数 tokenizersplitByRegexp の場合にのみ使用されます。正規表現の区切り文字を指定する必須パラメータです。const String
  • min_length — 引数 tokenizersparseGrams の場合にのみ使用されます。最小グラム長を指定する省略可能なパラメータで、デフォルトは 3 です。const UInt8
  • max_length — 引数 tokenizersparseGrams の場合にのみ使用されます。最大グラム長を指定する省略可能なパラメータで、デフォルトは 100 です。const UInt8
  • min_cutoff_length — 引数 tokenizersparseGrams の場合にのみ使用されます。最小カットオフ長を指定する省略可能なパラメータです。const UInt8
  • granularity — 引数 tokenizerchinese の場合にのみ使用されます。セグメンテーションの粒度を制御する、省略可能なパラメータです。coarse_grained (デフォルト) または fine_grained を指定できます。const String

戻り値

入力文字列から生成されたトークンの Array を返します。Array

デフォルトのトークナイザー

SELECT tokensForLikePattern('%test1,test2,test3%') AS tokens;
['test2']
Navigation