メインコンテンツまでスキップ

カスタムアナライザー

概要

カスタムアナライザーを使用すると、特定のニーズに応じて文字フィルター、トークナイザー、トークンフィルターを組み合わせることで、組み込みトークナイザーの制限を克服できます。これにより、テキストが検索可能な用語にセグメント化される方法が細かく調整され、検索の関連性とデータ分析の精度が直接決定されます。これは、検索体験とデータ価値を向上させるための基礎的な鍵となります。

Custom Analyzer Overview

カスタムアナライザーの使用

コンポーネントの作成

1. char_filterの作成

CREATE INVERTED INDEX CHAR_FILTER IF NOT EXISTS x_char_filter
PROPERTIES (
"type" = "char_replace"
-- configure pattern/replacement parameters as needed
);

char_replaceは、トークン化の前に指定された文字を置換します。

  • パラメータ
    • char_filter_pattern: 置換する文字
    • char_filter_replacement: 置換後の文字(デフォルト: スペース)

2. tokenizerの作成

CREATE INVERTED INDEX TOKENIZER IF NOT EXISTS x_tokenizer
PROPERTIES (
"type" = "standard"
);

利用可能なtokenizer:

  • standard: Unicode テキストセグメンテーションに従った文法ベースのトークン化
  • ngram: 指定された長さのN-gramを生成
  • edge_ngram: 単語の開始位置に固定されたN-gramを生成
  • keyword: 入力全体を単一のタームとして出力するno-opトークナイザー
  • char_group: 指定された文字でトークン化
  • basic: シンプルな英語、数字、中国語、Unicodeトークナイザー
  • icu: 全言語をサポートする国際テキストセグメンテーション
  • pinyin: 中国語テキスト検索用の中国語拼音変換トークナイザー
    • keep_first_letter: 有効にすると、各中国語文字の最初の文字のみを保持します。例えば、刘德华ldhになります。デフォルト: true
    • keep_separate_first_letter: 有効にすると、各中国語文字の最初の文字を個別に保持します。例えば、刘德华l,d,hになります。デフォルト: false。注意: タームの頻度により、クエリの曖昧さが増加する可能性があります
    • limit_first_letter_length: 最初の文字結果の最大長を設定します。デフォルト: 16
    • keep_full_pinyin: 有効にすると、各中国語文字の完全な拼音を保持します。例えば、刘德华は[liu,de,hua]になります。デフォルト: true
    • keep_joined_full_pinyin: 有効にすると、各中国語文字の完全な拼音を結合します。例えば、刘德华は[liudehua]になります。デフォルト: false
    • keep_none_chinese: 結果に中国語以外の文字や数字を保持します。デフォルト: true
    • keep_none_chinese_together: 中国語以外の文字をまとめて保持します。デフォルト: true。例えば、DJ音乐家DJ,yin,yue,jiaになります。falseに設定すると、DJ音乐家D,J,yin,yue,jiaになります。注意: 最初にkeep_none_chineseを有効にする必要があります
    • keep_none_chinese_in_first_letter: 最初の文字に中国語以外の文字を保持します。例えば、刘德华AT2016ldhat2016になります。デフォルト: true
    • keep_none_chinese_in_joined_full_pinyin: 結合された完全な拼音に中国語以外の文字を保持します。例えば、刘德华2016liudehua2016になります。デフォルト: false
    • none_chinese_pinyin_tokenize: 中国語以外の文字が拼音である場合、個別の拼音タームに分割します。デフォルト: true。例えば、liudehuaalibaba13zhuanghanliu,de,hua,a,li,ba,ba,13,zhuang,hanになります。注意: 最初にkeep_none_chinesekeep_none_chinese_togetherを有効にする必要があります
    • keep_original: 有効にすると、元の入力も保持します。デフォルト: false
    • lowercase: 中国語以外の文字を小文字にします。デフォルト: true
    • trim_whitespace: デフォルト: true
    • remove_duplicated_term: 有効にすると、インデックス容量を節約するため重複するタームを削除します。例えば、de的deになります。デフォルト: false。注意: 位置関連クエリが影響を受ける可能性があります
    • ignore_pinyin_offset: このパラメータには現在機能がありません。デフォルト: true

3. token_filterの作成

CREATE INVERTED INDEX TOKEN_FILTER IF NOT EXISTS x_token_filter
PROPERTIES (
"type" = "word_delimiter"
);

利用可能なトークンフィルター:

  • word_delimiter: 非英数字文字でトークンを分割します
  • ascii_folding: 非ASCII文字をASCII相当文字に変換します
  • lowercase: トークンを小文字に変換します
  • pinyin: トークン化後に中国語文字をpinyinに変換します。パラメーター詳細については、上記のpinyintokenizerを参照してください。

4. analyzerの作成

CREATE INVERTED INDEX ANALYZER IF NOT EXISTS x_analyzer
PROPERTIES (
"tokenizer" = "x_tokenizer", -- single tokenizer
"token_filter" = "x_filter1, x_filter2" -- one or more token_filters, in order
);

コンポーネントの表示

SHOW INVERTED INDEX TOKENIZER;
SHOW INVERTED INDEX TOKEN_FILTER;
SHOW INVERTED INDEX ANALYZER;

コンポーネントの削除

DROP INVERTED INDEX TOKENIZER IF EXISTS x_tokenizer;
DROP INVERTED INDEX TOKEN_FILTER IF EXISTS x_token_filter;
DROP INVERTED INDEX ANALYZER IF EXISTS x_analyzer;

テーブル作成でのカスタムアナライザーの使用

カスタムアナライザーは、インデックスプロパティのanalyzerパラメータを使用して指定されます:

CREATE TABLE tbl (
`a` bigint NOT NULL AUTO_INCREMENT(1),
`ch` text NULL,
INDEX idx_ch (`ch`) USING INVERTED PROPERTIES("analyzer" = "x_custom_analyzer", "support_phrase" = "true")
)
table_properties;

使用制限

  1. tokenizerとtoken_filterのtypeおよびパラメータはサポートされているリストからのものでなければならず、そうでなければテーブル作成が失敗します
  2. analyzerは、それを使用しているテーブルがない場合にのみ削除できます
  3. tokenizerとtoken_filterは、それらを使用しているanalyzerがない場合にのみ削除できます
  4. カスタムanalyzer構文を作成した後、データ読み込みが正常に動作する前にBEへの同期に10秒かかります

注意事項

  1. カスタムanalyzerで複数のコンポーネントをネストすると、トークン化のパフォーマンスが低下する可能性があります
  2. tokenize関数はカスタムanalyzerをサポートします
  3. 事前定義されたトークン化はbuilt_in_analyzerを使用し、カスタムトークン化はanalyzerを使用します - どちらか一方のみが存在できます

完全な例

例1: 電話番号のトークン化

電話番号のトークン化にedge_ngramを使用:

CREATE INVERTED INDEX TOKENIZER IF NOT EXISTS edge_ngram_phone_number_tokenizer
PROPERTIES
(
"type" = "edge_ngram",
"min_gram" = "3",
"max_gram" = "10",
"token_chars" = "digit"
);

CREATE INVERTED INDEX ANALYZER IF NOT EXISTS edge_ngram_phone_number
PROPERTIES
(
"tokenizer" = "edge_ngram_phone_number_tokenizer"
);

CREATE TABLE tbl (
`a` bigint NOT NULL AUTO_INCREMENT(1),
`ch` text NULL,
INDEX idx_ch (`ch`) USING INVERTED PROPERTIES("support_phrase" = "true", "analyzer" = "edge_ngram_phone_number")
) ENGINE=OLAP
DUPLICATE KEY(`a`)
DISTRIBUTED BY RANDOM BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

Example 2: 細粒度トークン化

詳細なトークン化のためのstandard + word_delimiterの使用:

CREATE INVERTED INDEX TOKEN_FILTER IF NOT EXISTS word_splitter
PROPERTIES
(
"type" = "word_delimiter",
"split_on_numerics" = "false",
"split_on_case_change" = "false"
);

CREATE INVERTED INDEX ANALYZER IF NOT EXISTS lowercase_delimited
PROPERTIES
(
"tokenizer" = "standard",
"token_filter" = "asciifolding, word_splitter, lowercase"
);

Example 3: 複数のToken Filterを持つKeyword

複数のtoken filterでオリジナルの用語を保持するためにkeywordを使用する場合:

CREATE INVERTED INDEX ANALYZER IF NOT EXISTS keyword_lowercase
PROPERTIES
(
"tokenizer" = "keyword",
"token_filter" = "asciifolding, lowercase"
);

例4: 中国語ピンイン検索

中国語の名前とテキスト検索にpinyinトークナイザーを使用 - 完全なピンイン、頭文字略語、中国語と英語の混合テキストをサポートします。

Pinyinトークナイザーの使用

-- Create pinyin tokenizer with multiple output formats
CREATE INVERTED INDEX TOKENIZER IF NOT EXISTS pinyin_tokenizer
PROPERTIES (
"type" = "pinyin",
"keep_first_letter" = "true",
"keep_full_pinyin" = "true",
"keep_joined_full_pinyin" = "true",
"keep_original" = "true",
"keep_none_chinese" = "true",
"lowercase" = "true",
"remove_duplicated_term" = "true"
);

CREATE INVERTED INDEX ANALYZER IF NOT EXISTS pinyin_analyzer
PROPERTIES (
"tokenizer" = "pinyin_tokenizer"
);

CREATE TABLE contacts (
id BIGINT NOT NULL AUTO_INCREMENT(1),
name TEXT NULL,
INDEX idx_name (name) USING INVERTED PROPERTIES("analyzer" = "pinyin_analyzer", "support_phrase" = "true")
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY RANDOM BUCKETS 1
PROPERTIES ("replication_allocation" = "tag.location.default: 1");

INSERT INTO contacts VALUES (1, "刘德华"), (2, "张学友"), (3, "郭富城");

SELECT * FROM contacts WHERE name MATCH '刘德华';
SELECT * FROM contacts WHERE name MATCH 'liudehua';
SELECT * FROM contacts WHERE name MATCH 'liu';
SELECT * FROM contacts WHERE name MATCH 'ldh';

Pinyin Filter の使用

-- Create pinyin filter to apply after keyword tokenizer
CREATE INVERTED INDEX TOKEN_FILTER IF NOT EXISTS pinyin_filter
PROPERTIES (
"type" = "pinyin",
"keep_first_letter" = "true",
"keep_full_pinyin" = "true",
"keep_original" = "true",
"lowercase" = "true"
);

CREATE INVERTED INDEX ANALYZER IF NOT EXISTS keyword_pinyin
PROPERTIES (
"tokenizer" = "keyword",
"token_filter" = "pinyin_filter"
);

CREATE TABLE stars (
id BIGINT NOT NULL AUTO_INCREMENT(1),
name TEXT NULL,
INDEX idx_name (name) USING INVERTED PROPERTIES("analyzer" = "keyword_pinyin")
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY RANDOM BUCKETS 1
PROPERTIES ("replication_allocation" = "tag.location.default: 1");

INSERT INTO stars VALUES (1, "刘德华"), (2, "张学友"), (3, "刘德华ABC");

-- Supports multiple search modes:
SELECT * FROM stars WHERE name MATCH '刘德华';
SELECT * FROM stars WHERE name MATCH 'liu';
SELECT * FROM stars WHERE name MATCH 'ldh';
SELECT * FROM stars WHERE name MATCH 'zxy';