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

カスタムアナライザー

概要

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

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. トークナイザの作成

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

利用可能なtokenizer:

  • standard: Unicode文字分割に従った文法ベースのトークン化
  • ngram: 指定された長さのN-gramを生成
  • edge_ngram: 単語の先頭に固定されたN-gramを生成
  • keyword: 入力全体を単一の項として出力する無処理tokenizer
  • char_group: 指定された文字でトークン化
  • basic: シンプルな英語、数字、中国語、Unicodeのtokenizer
  • icu: 全言語をサポートする国際テキスト分割
  • pinyin: 中国語テキスト検索用の中国語pinyin変換tokenizer
    • keep_first_letter: 有効にすると、各中国語文字の最初の文字のみを保持します。例えば、刘德华ldhになります。デフォルト: true
    • keep_separate_first_letter: 有効にすると、各中国語文字の最初の文字を個別に保持します。例えば、刘德华l,d,hになります。デフォルト: false。注意: これは項頻度により クエリの曖昧性を増加させる可能性があります
    • limit_first_letter_length: 最初の文字結果の最大長を設定します。デフォルト: 16
    • keep_full_pinyin: 有効にすると、各中国語文字の完全なPinyinを保持します。例えば、刘德华は[liu,de,hua]になります。デフォルト: true
    • keep_joined_full_pinyin: 有効にすると、各中国語文字の完全な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: 結合された完全なPinyinに中国語以外の文字を保持します。例えば、刘德华2016liudehua2016になります。デフォルト: false
    • none_chinese_pinyin_tokenize: 中国語以外の文字がPinyinの場合、個別のPinyin項に分割します。デフォルト: 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に変換します。パラメーターの詳細については、上記のpinyinトークナイザーを参照してください。

4. アナライザーの作成

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 フィルターの使用

-- 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';