データを扱うときに、table 構造状態のものはけっこうおおい。csv だったり JSON でいったらobject がarray につめられている状態とか。JSON だとjq なんか つかっていろいろいじったり加工したりする。

これが100万件とか1000万件とかになると当然使い物にならない

かといって、そこでDBに登録するのもまた時間かかる。データの総数が500Gとか…

ObjectBox とかsqlite みたいなものでももいいですが結局データ変換が必要。

ていうことでデータをいっさいいじらないで検索用のしょぼいindex を生成するプログラムを つくってみたvfs-index という名前にしてます。

データ分析をする場合とか渡されるデータがでかいとか、あとはスマホのゲームのマスターデータを探査したりするのにも 必要なのでその両方の用途を満たすので、自分が便利ということで

注意したのは可能な限りindex の作成がCtrl-Cとかでとめても,次またindex コマンドが継続してができること、同時に別のプロセスからindexing しても 壊れないようにです。なのでentry ごとにファイルで分割してつくって、あとでmerge する。merge 前でも後でも検索できるって構造にした。

ふるーいやり口

testdata/vfs-inter がindex ファイルを格納するディレクトリとして

index のエントリが一つ書き込まれると

adding.<プロセスid>.<key>-<key>.<レコードがあるファイルinode number>.<レコードがあるoffset>

て名前で書き込みはじめる

testdata/vfs-inter/content.gram.idx.adding.30.00304eba3082-00304eba3082.00064507ea.0000000004

て感じで書き込まれて。書き込みが終わると

testdata/vfs-inter/test/0030/4eba/3082/content.gram.idx.00304eba3082-00304eba3082.00064507ea.0000000004

こういう感じでrename され

merge というサブコマンドを使うと

testdata/vfs-inter/test/title.gram.idx.merged.0020002830b0-00304eba3082

こいつにmerge される

使い方

まずはコマンドのインストール

$ go get github.com/kazu/vfs-index/cmd/vfs-index

べつに毎回

$ go run github.com/kazu/vfs-index/cmd/vfs-index

とかしてもいい

最初にデータが格納されたディレクトリを指定してindex を作成する

データは testdata/data に test.json てファイル名である前提 ファイル名の前からアルファベット分がtable 名として認識します。 追加していく場合は test.json とかtest1.json test.1.json とかしてけばいい

$ vfs-index index --index=data-idx --table=test --column=id --data=testdata/data
# content は文字列なのでtri-gram としてindex される
$ vfs-index index --index=data-idx --table=test --column=content --data=testdata/data

これでもう検索は可能

$ vfs-index search --index=data-idx --table=test --data=testdata/data -q='id == 1234 '

文字列とかだと

$ vfs-index search --index=data-idx --table=test --data=testdata/data -q='content == "拉致問題" '

stdin から

$ echo "拉致問題" | vfs-index search --index=data-idx --table=test --data=testdata/data --column=content

いまは json のファイルだけなのでおいおい csv, xml とか あと 圧縮ファイルとかも対応していく予定

golang 用ライブラリとしてアクセスインターフェースもあるけどそれはgithub.com/kazu/vfs-index とかをみてください。 fbs をずっといじってたのは、これのindex をfbs にするのが始まりだったりもする。