SennaStore概要
Sennaはデータベースと検索エンジンとの距離を埋め、本格的な全文検索機能を持つアプリケーションを効率よくLAMPパーツで作れるようにすることを目的としています。 この目的のために、Sennaは二つの切り口を用意しています。
組込み向けインタフェース
DBMSへの組込みを想定したライブラリインタフェースです。DBMSの全文検索機能を自然な形で強化します。このインタフェースを利用したプロジェクトとしてTritonn(MySQLバインディング), Ludia(PostgreSQL)などがあり、多くの利用実績があります。
SennaStore
リレーショナルモデルに基づく独自のデータベースです。複数の表を定義してデータを蓄積したり検索したりできます。全文検索の要素技術をより柔軟に組み合わせて、高度な検索アプリケーションを効率よく作れるようにすることを目的としています。Senna1.1以降から使用可能です。
このページでは、SennaStoreの概要について説明します。
SennaStoreの特徴
SennaStoreは以下の点を特徴とするように重点を置いて開発しています。
Sennaの性能を最大限に発揮
Sennaは、大量のトラフィックをこなす大規模なwebアプリケーション等での使用を想定し、
- 検索精度(適合率・再現率)の高さ
- 検索・更新スループットの大きさ
- 文書許容量の大きさ
の各要件をそれぞれ高いレベルで満たすことを目指して設計されています。 SennaStoreはこれらのSennaの特徴を最大限に引き出すことを目標としています。
従来の全文検索エンジンの枠組を越えた柔軟なクエリ
SennaStoreは、リレーショナルモデルに基づいたデータベースですが、 高速な全文検索処理の実現に必要な部品を、 実体化タイミングを制御可能なビューおよび関係値属性という切り口で データモデルに組み込んでいます。 Schemeの上に実装したクエリ言語(SennaQL)からこれを操作することによって 高度な検索アプリケーションを柔軟に作ることができます。
アプリケーションインタフェース
以下の3種類のインタフェースを通してアプリケーションから使用することができます。
- 組込みライブラリインタフェース
- コマンドインタフェース
- クライアントサーバインタフェース
組込みライブラリはスレッド安全に設計されています。いずれのインタフェースでも、一つのデータベースを複数のスレッドand/or複数プロセスで共有することが可能です。 それぞれのインタフェースは可能な限り差異を小さく抑えているため、アプリケーションのプロセス構成の変更にも容易に対応することができます。
SennaQL
SennaStoreでは、いずれのアプリケーションインタフェースでもSennaQLと呼ばれるクエリ言語を使ってデータを定義・操作します。 SennaQLは、R^4RSベースのScheme処理系に埋め込まれており、クエリはS式で表現します。
S式は可読性に乏しいという意見もありますが、SennaQLでは若干の構文拡張を加え、 簡潔にクエリを記述できることを目指しています。 以下に同様のクエリをSQLとSennaQLで記述した例を示します。
例1
SQL:
SELECT name FROM users WHERE user_id = 'U00001';
SennaQL:
(<users> : "U00001").name
例2
SQL:
SELECT country.name FROM branch NATURAL JOIN city NATURAL JOIN country WHERE branch_id = 'B00001';
SennaQL:
(<branch> : 'B00001').city.country.name
例3
SQL:
CREATE TEMPORARY TABLE T1 AS SELECT DISTINCT url FROM tags WHERE comment like "%LISP%" UNION SELECT url FROM items WHERE body like "%LISP%";
SennaQL:
(define <t1> (((<terms>.tag_comment : "LISP") ::group :url) ::union (<terms>.item_body : "LISP")))
SennaQLの詳細については、以下のページを御覧下さい。
アーキテクチャ
図はSennaStoreのアーキテクチャを示しています。
- 図中の上側に示すアプリケーションプロセスは、libsennaライブラリをリンクします。
- libsennaライブラリは、従来と同様にbasic APIとadvanced APIに加えて、ql APIという新たなインタフェースを提供しています。
- アプリケーションプログラムはこのAPIを、直接的に、または(言語バインディング等を使って)間接的に呼び出すことによってSennaStoreの機能を使用できます。
- ql APIは、データベースと接続する手段を2種類用意しています。
- 一つは、データベースのファイルを直接操作する方法で、スタンドアロンモードと呼んでいます。
- スタンドアロンモードでデータベースを使用する場合には、そのデータベースファイルは、ローカルファイルシステム上に存在しなければなりません。
- スタンドアロンモードでは、データベースを操作するために必要なファイル識別子、作業メモリ、問合せ言語の実行環境等の資源は、全てライブラリを呼び出すプロセス上に展開されます。
- もう一つは、sennaサーバに接続して、ソケット経由で間接的に操作する方法で、クライアントモードと呼んでいます。
- クライアントモードは、TCPソケットを使って接続しますのでネットワークを介して異なるホストに存在するデータベースを操作することができます。
- クライアントモードでは、データベースを操作するために必要な諸資源はサーバプロセス上に展開されます。
- スタンドアロン/クライアントどちらの手段で接続した場合でも、ql APIはsen_ctxというオブジェクトへのハンドルが返し、以降ハンドルを介して全く同様に操作することができます。
- クライアントモードの場合、下図のようにクライアントからの総接続数分だけの問合せ言語の実行環境(sen_ctx)がサーバプロセス上に作られます。接続が閉じられれば実行環境は削除されます。
- 問合せ言語の実行環境が持つ変数のスコープは、当該sen_ctxに閉じており、複数のctx間で共有することはできません。
- データベースに対する更新操作は永続的であり、同じデータベースに接続する全てのctx間で共有されます。
- 複数のプロセスが同じデータベースを同時に使用しても問題ありません。
- ただし、更新操作は同時に一つまでしか動作せず、操作が完了するまで残りのプロセスはブロックすることになります。参照操作については複数のプロセス/スレッドが並列に動作することができます。
ロードマップ
SennaStoreは現在配布中のSVNリポジトリにすでに含まれています。 各種アプリケーションインタフェースから、基本的なクエリセットを試すことができます。 今後以下のステップで開発を進める予定です。
1.0.* ←いまここ
- 基本的なクエリセット
- 各種アプリケーションインタフェース
1.1.0
- クエリセットの拡充
- 永続化可能なデータ型の拡充
- viewの実体化タイミングの明示的な制御
2.0
- 高速化
- 安定化
2.*
- トランザクションサポート
- ACID特性サポート
開発者向け文書
FAQ
- Q:分散できないの?
- A:有料&非OSSの分散オプションがあります。台数を動的にどんどん追加して、大規模分散検索できます。
- Q:RDB(MySQL,PostgreSQL)とのすみわけは?
- A:更新系が主で信頼性に関する要求条件が高い用途ではRDBの方が優れています。標準的な問合せ言語であるSQLが使用できるのもRDBのメリットです。Sennaは参照系が主で複雑な検索処理が必要な用途に適しています。
- Q:どんな言語から使えるの?
- A:現在、C, PHP, Python, Rubyから使用できます。
- Q:組込みのSchemeでCGIとかwebアプリとか何でも書けるの?
- A:あくまで問合せ言語としての使用を想定しています。webアプリを全て組込みのSchemeで書くのはムリがあります。Schemeが元々得意な方は、Gauche等の汎用向けの処理系にsennaを組み込んで使うのが良いと思います。
- Q:いつ正式リリースされるの?
- A:この夏‥‥。まずSenna1.*としてリリースして、安定化した段階で2.0にします。
- Q:今までみたいに組込み用途でも使えるの?
- A:組込み型エンジンとしての機能はこれからも維持しますし、性能や機能の向上にも取り組んでいきます。TritonnやLudiaもこれまで通りよろしくお願いします。
その他質問どーぞ
- 2007-08-24 14:55:55 も : まだないのですが、正式リリースまでには是非入れたいと思います。
- 2007-08-24 13:19:01 baal : Gauche のバインディングはありますか?
- 2007-08-17 22:35:32 も : 同じです。makeすると両方が作られます。
- 2007-08-17 22:32:04 名無しさん : 新しいSennaと組み込み用とは別々のパッケージになるんですか?
その他
文責: 森(田)