Senna 非公式 PHPバインディング - php_senna

php_sennaは、組み込み型全文検索エンジンSennaをPHPから利用するためのPHPエクステンションです。

PHP 5系、Senna-1.0.9以降での動作を目指しています。CentOS4.4上のPHP5.2.1、Senna-1.0.9〜1.1.1で動作確認をしながら開発しています。Windows用のコンパイラは持っていないので、Windowsで使えるかどうかテストしていません。

現在のところ非公式で開発をしていますので、Senna本家様の設計方針とは異なる部分があるかと思います。エクステンション内のコードにAPIの不適切な使い方やバグを見つけた場合は、該当箇所を教えていただけると嬉しいです。ドキュメントの誤り等もご指摘ください。

php_sennaにはSenna本体は付属していません。Senna本体を先にインストールする必要があります。

php_sennaの使用例

以下のようなPHPコードでSennaを使うことができます。

<?php
$index = new Senna_Index('/tmp/php_senna_sample');
$index->upd('key1', NULL, 'This is a sample.');
$index->upd('key2', NULL, 'This is an another.');
$index->update('key3', 1, NULL, 'php_senna sample');
$index->update('key3', 2, NULL, 'binding');
$index->update('key3', 3, NULL, 'sample code');

$records = $index->query('sample');
foreach ($records as $row) {
    echo $row->getKey(), ' = ', $row->getScore(), "\n";
}
実行結果:
key3 = 10
key1 = 5

各クラスの詳しい使い方は使い方(API)ページに記載しています。

php_sennaの特徴

PHP用の言語バインディングとして実装しています。TritonnやLudiaのようなDBMSバインディングとは違い、特定のデータストレージに縛られることなくSennaを利用可能です。

以下のような状況でもSennaを使えるようになります

  • MySQLやPostgreSQLは既に稼動しているが、Senna対応バージョンにできない理由がある場合
  • バインディングの存在しないデータストレージに文書を保存したい場合
    • 通常ファイル、XMLファイル、HTMLファイル、SQLite、その他バインディング未開発のデータストレージ

なるべく簡単に扱えるインターフェイスを目指して設計しています

  • SennaAPIをカプセル化し、各種機能をクラスとして表現
  • 一部の引数を省略可能
  • APIが失敗した場合は例外発生
  • Sennaの不具合を回避するコードを可能な範囲で内包

できること(実装済み)

  • インデックスの生成、オープン、リネーム、削除
  • インデックスの更新
  • インデックスに対するクエリー検索
  • section単位やposition単位での検索
  • サブレコード情報の取得
  • Snippet(KWIC)の作成

インデックスの更新はsen_index_upd()sen_index_update()の両方を実装しています。文書単位だけでなく段落単位も扱うことができます。

Snippetはクエリ文字列からの生成も可能です。sen_query_snip()を使用します。

できないこと(未実装)

  • [basic API] sen_index_sel()関数に相当する1語での検索
  • [advanced API]
    • (sen_records型) 昇順ソート、sen_records_group()関数に相当するレコードの単位変更
    • (sen_index型) sen_index_update()以外の関数
    • (sen_query型) sen_query_term()関数
  • [low-level API] 未着手
  • log API --- 考え中

インデックスの検索はsen_index_sel()sen_index_select()実装していませんsen_query_exec()によるクエリー検索を実装しているため、この2つは不要と考えました。ただし、この2つのAPIを使わなければ実現できない処理があれば追加する予定です。

ライセンス

現在検討中です。Sennaと同じ「LGPL」にする予定ですが、LGPLが良くわからないんです。

その他のPHPバインディング

本サイトで公開しているPHPバインディングの他にも、

があります。本サイトの非公式版php_sennaが利用できなかった場合や目的の機能が未実装でしたら、上記のバインディングを試してみてください!

※関山隆介さん作のphp_sennaとはエクステンション名が同一のため、混在して使用できないかもしれません。

最終更新:2008/03/31 09:00