データを扱うときに、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 にするのが始まりだったりもする。