« Sennaのインストールレス化 | メイン | SQLite 本が届いたので読んだ »

2006年02月20日

Web関連の開発日誌:: Senna の SQLite 組込み方法案

    

SQLite へ Senna を組込むべく SQLite のソースを追っていたが、初期の案で組み込むのは少し難しそうなので、再考した。

次のような形になると思う。

SELECT * FROM table_name WHERE fulltext_index_match( 'table_name', 'coluon_name', 'words', pid, true ) ORDER BY match_score( pid ) DESC;

table_name が重複するのはかっこ悪いけど諦めてもらおう。
このような形にすると、SQLiteの関数のラッパーとトリガー、ユーザー定義関数のみで実装できそうだ。
SQLite 本体に手を加えなくてもいいので、patch を作ったりしなくても良くてお手軽。
ただし、複数の検索条件を指定したりすることは出来ない。
match_score の引数を増やせば検索条件が識別できるけど、それだと煩雑になる。
複数の検索条件で検索を行うなら、クエリー結果からテンポラリテーブルを作ってそれを使うような形になる。

SELECT pid,match_score(pid) FROM table_name WHERE fulltext_index_match( 'table_name', 'coluon_name', 'words', pid, true );

とすれば、スコアとIDが得られるようになるはず。
そうすれば、それと他のテーブルの内部結合でいろいろ出来るだろう。

後、このような形にしたのは構文拡張が大変そうだったから。
SQLite は、yacc ( or bison ) ではなく、Lemon という独自のパーサージェネレーターを使っているようだ。
これもいじるとなると大変なので、構文拡張ではなく関数のラッパーとトリガー、ユーザー定義関数を使うことにした。
でも、全文検索用の構文があったほうが使いやすいと言えば使いやすいので、将来気力がわいたら拡張するかも。( 過去の傾向からすると、こう言うのはなんだかんだで対応してしまっている気がしないでもない )


関係ないけど、Senna の読みはセナだと今日知った。
センナ だと思ってた。(笑
で、センナってなんだろうなぁ と一人考えてたり。
何となく辞書見たらあった。

センナ【旃那】 (ラテンsenna)生薬の一種。主としてインドおよびエジプト産のマメ科カワラケツメイ属植物数種の葉を乾燥したもの。レイン、アロエエモジンなどを含み下剤に用いる Kokugo Dai Jiten Dictionary. Shinsou-ban (Revised edition) Shogakukan 1988/国語大辞典(新装版)小学館 1988 より

綴り一緒だ。
でも、アイルトン・セナもこの Senna みたい。



投稿者 Takenori : 2006年02月20日 22:24




comments powered by Disqus
Total : Today : Yesterday : なかのひと