条件が厳しいわりに微妙。
成果物
前提
SQLite3を用意する。
ICU
を有効にする。動的ロードだけだとエラーになる。
SQLite3.29.0はデフォルトでFTS4
が有効なのでそこは気にしなくてOK。
SQLite3を実行する
ターミナルで以下コマンドを実行する。
sqlite3
テスト用テーブル作成
begin transaction; create virtual table posts using fts4(id, title, body, tokenize=icu ja_JP); insert into posts values(1, '最初のタイトルです', '最初の本文です。'); insert into posts values(2, '二番目のタイトルです', '二番目の本文です。'); commit;
もしコンパイルオプションにENABLE_ICU
がなければ以下エラーになる。コンパイルオプションはpragma compile_options;
で確認できる。ICU拡張を動的ロードするだけではダメ。
Error: unknown tokenizer: icu
全文検索する
select * from posts where posts match '最初';
1|最初のタイトルです|最初の本文です。
select * from posts where posts match 'タイトル';
1|最初のタイトルです|最初の本文です。 2|二番目のタイトルです|二番目の本文です。
select * from posts where posts match 'title:タイトル';
1|最初のタイトルです|最初の本文です。 2|二番目のタイトルです|二番目の本文です。
select * from posts where posts match 'title:タイト*';
1|最初のタイトルです|最初の本文です。 2|二番目のタイトルです|二番目の本文です。
select * from posts where posts match 'body:タイトル';
select * from posts where posts match '最初 タイトル';
1|最初のタイトルです|最初の本文です。
以下は何もヒットしなかった。FTS4は省略形が使えないらしい。
select * from posts('タイトル');
select * from posts('title:タイトル');
以下もヒットしない。なぜ?
select * from posts where posts match 'title:タイトル AND body:本文';
select * from posts where posts match '最初 AND タイトル';
select * from posts where posts match '最初' AND 'タイトル';
select * from posts where posts match 'NOT 最初';
以下は間違っている。
select * from posts where posts match '最初 OR 二番目';
2|二番目のタイトルです|二番目の本文です。
論理演算がおかしい……。
あと、FTS4はorder by rank
が使えない。
ICUはFTS5で使えない
create virtual table posts using fts5(id, title, body, tokenize=icu ja_JP);
Error: parse error in "tokenize=icu ja_JP"
create virtual table posts using fts5(id, title, body, tokenize='icu ja_JP');
Error: no such tokenizer: icu
create virtual table posts using fts5(id, title, body, tokenize="icu ja_JP");
Error: no such tokenizer: icu
公式サイトにもそう書いてある。
The ICU tokenizer is not available.
所感
ICUをトークナイザとして使うならFTS4
。FTS5
は使えない。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- SQLite 3.29.0
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
前回まで
- SQLite3学習をはじめよう
- SQLite3学習 SQLiteについて
- SQLite3学習 SQLiteの適切な用途
- SQLite3学習 SQLiteの特徴
- SQLite3学習 SQLiteのクセ
- SQLite3学習 データ型とアフィニティ
- SQLite3学習 演算子の一覧
- SQLite3学習 よくある質問
- SQLite3学習 SQLiteダウンロード&コンパイル
- SQLite3学習 Tclで操作する
- SQLite3学習 ビルドオプション動作確認(SQLITE_ALLOW_URI_AUTHORITY)
- SQLite3学習 面白そうなコンパイルオプション
- SQLite3学習 SQLiteの拡張について
- SQLite3学習 JSON拡張
- SQLite3学習 JSON拡張(json_extract)
- SQLite3学習 JSON拡張(json_each)
- SQLite3学習 JSON拡張(json_tree オブジェクト→行)
- SQLite3学習 JSON拡張(json_tree オブジェクトツリー→行)
- SQLite3学習 JSON拡張(json_tree オブジェクト配列→行)
- SQLite3学習 JSON拡張(json_group_array 行→配列)
- SQLite3学習 JSON拡張(json_group_object 行→オブジェクト)
- SQLite3学習 JSON拡張(json_array_length)
- SQLite3学習 JSON拡張(json_type)
- SQLite3学習 JSON拡張(json_valid)
- SQLite3学習 JSON拡張(json_quote)
- SQLite3学習 JSON拡張(json_array)
- SQLite3学習 JSON拡張(json_object)
- SQLite3学習 JSON拡張(json_patch)
- SQLite3学習 JSON拡張(json_insert)
- SQLite3学習 JSON拡張(json_replace)
- SQLite3学習 JSON拡張(json_set)
- SQLite3学習 JSON拡張(json_remove)
- SQLite3学習 全文検索(FTS5)
- SQLite3学習 全文検索FTSを日本語で使う方法を調べてみた
- 形態素解析MeCabをインストールする
- SQLite3学習 全文検索FTS5のMeCab用トークナイザを実装する
- SQLite3学習 FTS5+MeCabでクエリ構文
- SQLite3学習 FTS5のテーブル作成と初期化
- SQLite3学習 FTS5の補助関数
- SQLite3学習 FTS5のfts5vocab仮想テーブル
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 ファイル入出力(SQL集計)
- SQLite3学習 拡張関数(generate_series)
- SQLite3謎 主キーの型をintにするとinsertで値を省略したらNULLになってしまう
- SQLite3学習 入出力関数(fsdir, readfile, writefile, edit)
- SQLite3ビルド コンパイルオプションを付与する方法(CFLAGS等))
- SQLite3 コンパイルオプション確認方法(pragma compile_options)
- SQLite3ビルド ICUを有効にする(SQLITE_ENABLE_ICU)
- SQLite3拡張 ICUを動的ロードする
- SQLite3拡張 ICUでcollateする