やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3学習 FTS5のfts5vocab仮想テーブル

 トークナイザが分解したトークンを取得するテーブルをつくる。

成果物

fts5vocab仮想テーブル

 fts5vocabはFTS5の情報を得るためのテーブルである。row,col,instanceの3種類ある。

作成

create virtual table テーブル名 using fts5vocab('FTSテーブル名', 'タイプ');

 作ってみる。

.load ./fts5_mecab

begin transaction;

-- FTSテーブル
create virtual table posts using fts5(title, content, tokenize='mecab');
insert into posts values('タイトルです', '本文です。');
insert into posts values('タイトなタイトルです', '本文章は本文です。');
insert into posts values('表題です', 'タイトな本文です。');

-- fts5vocabテーブル
create virtual table posts_row using fts5vocab('posts', 'row');
create virtual table posts_col using fts5vocab('posts', 'col');
create virtual table posts_instance using fts5vocab('posts', 'instance');

commit;

 テーブルの中身をみてみる。

.headers on
.mode column
select * from posts;
select * from posts_row;
select * from posts_col;
select * from posts_instance;
title       content   
----------  ----------
タイトルです      本文です。     
タイトなタイトルです  本文章は本文です。 
表題です        タイトな本文です。 

 row

term        doc         cnt       
----------  ----------  ----------
。           3           3         
です          3           6         
な           2           2         
は           1           1         
タイト         2           2         
タイトル        2           2         
文章          1           1         
本           1           1         
本文          3           3         
表題          1           1         

 col

term        col         doc         cnt       
----------  ----------  ----------  ----------
。           content     3           3         
です          title       3           3         
です          content     3           3         
な           title       1           1         
な           content     1           1         
は           content     1           1         
タイト         title       1           1         
タイト         content     1           1         
タイトル        title       2           2         
文章          content     1           1         
本           content     1           1         
本文          content     3           3         
表題          title       1           1         

 instance

term        doc         col         offset    
----------  ----------  ----------  ----------
。           1           content     2         
。           2           content     5         
。           3           content     4         
です          1           title       1         
です          1           content     1         
です          2           title       3         
です          2           content     4         
です          3           title       1         
です          3           content     3         
な           2           title       1         
な           3           content     1         
は           2           content     2         
タイト         2           title       0         
タイト         3           content     0         
タイトル        1           title       0         
タイトル        2           title       2         
文章          2           content     1         
本           2           content     0         
本文          1           content     0         
本文          2           content     3         
本文          3           content     2         
表題          3           title       0         

 トークナイザによって分解されたトークンが格納されている。

 気づいたのだが、ほとんどがキーワードたりえない無駄な語である。「です」「。」「な」「は」など文中に出てくる語は排除したい。このように、解析するときに有用か。

タイプ

 fts5vocabのタイプについて。

row

概要
term FTS5インデックスに保存されている用語。
doc 用語のインスタンスを少なくとも1つ含む行の数。
cnt FTS5テーブル全体の用語のインスタンスの総数。

col

概要
term FTS5インデックスに保存されている用語。
col 用語を含むFTS5テーブル列の名前。
doc $colに用語のインスタンスが少なくとも1つ含まれているFTS5テーブル内の行の数。
cnt FTS5テーブルの列$colに表示される用語のインスタンスの総数(すべての行を考慮)。

instance

概要
term FTS5インデックスに保存されている用語。
doc インスタンスという用語を含むドキュメントのROWID。
col インスタンスという用語を含む列の名前。
offset 列内の用語インスタンスのインデックス。用語には、0から始まる出現順に番号が付けられます。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで