MindSearchコアとの通信方法
アプリケーションはソケットを使ってMindSearchコアと通信をおこなってください。一般的なソケットプログラミングの手法で構いません。
注1:ソケットを使った通信手法については市販の解説書をご参照願います。
注2:アプリケーションを Perl, Java, PHP で記述しているなら、後述する通信ライブラリが使えます。その場合にはソケット通信についての知識は不要です。
ホスト名
MindSearchデーモンは特に明示しない限り、ホスト名=localhost で立ち上がっています。アプリケーションからも同様の名前を指定してください。
MindSearch起動時のホスト名指定についてはこちらを参照してください
ポート番号
MindSearchデーモンは特に明示しない限り、ポート=3515 で立ち上がっています。アプリケーションからも同様の番号を指定してください。
MindSearch起動時のポート番号指定についてはこちらを参照してください
接続
前記したホスト名、ポート番号でMindSearchデーモンに接続してください。MindSearchデーモンはacceptするとfork(2)によって派生プロセスを生成し、以後はアプリケーションはその派生プロセスと交信することになります。
接続完了後の最初のデータの発信者はアプリケーション側です。アプリケーションは最初に"INI"コマンドを送ることになります。
アプリケーションとMindSearchコアは、交互にデータの送受信をおこなうとこで処理をすすめていきます。この様子はたとえばSMTPやPOP3プロトコルを使ったメールクライアントとメールサーバとの通信に似ています。
SMTPとMindSearchとの違いは、MindSearchではデータの単位が行ではないことです。やりとりされるデータは複数の行を含むこともあります。
データに複数行を含むことから、行末コードでデータ終端を表わせないため、以下の方法で不定長のテキストを扱います。
送信
接続後、最初に送信する"INI"コマンドを例にとります(プロフィール名をapp01と仮定します)。
最大4096バイト
<------->
[送信したいデータ(Script)] INI:app01
[ソケットに流し込むデータ] 0009INI:app01
上のようにデータの先頭にそのデータの長さ(上記では9バイト)を4桁の10進数として付与します。(リーディングゼロで必ず4桁にしてください)。
送信文末尾に改行コードは付けないでください(スクリプトに改行コードが含まれると文法エラーになります)。
送信できるデータの最大長はデータ長さ部分を除いて4096バイトです。
受信
データ形式は前記送信時と同じです。まず最初にソケットからヘッダ部の4バイトを読み取ります。通常のプログラム言語には「バイト数指定の読み出し」関数が有りますからそれを使ってください。
[ソケットからの受信データ] 0009INI:app01
[得られたデータ(Responce)] INI:app01
<------->
最大4096バイト
次いで、データ本体を同じくバイト数指定で受信します。先に受け取ったヘッダを数値に変換することでバイト数として指定します。データ本体は最大でも4096バイト長なので、用意するバッファもそれに合わせてください。
通常は受信データの末尾に行末コードが付くことはありません。受け取ったそのままがデータです。検索コマンドのレスポンスなど、必要な場面ではMindSearchの側から改行コードを付けて来ます。
送受信の関数化
アプリケーションの中で使えるよう、接続、切断、データ送信、データ受信を関数として定義しておき、それを使うことを勧めます。
Perl, Java, PHP については、本パッケージにライブラリ(通信ドライバ)が付属しますからの中の関数(orメソッド)をお使いください。次のセクションではそのライブラリについて解説します。
Perlのための通信ライブラリは以下の場所にあります。(二箇所にありますが同じものです)
mshyper/sample/program/
|
+--- perlCGI
| +--- lib
| +--- mschDriver.pl
|
+--- perlclient
| +--- lib
| +--- mschDriver.pl
以下に関数の使い方を説明します。
注1:本ライブラリを使う場合は、スクリプトあるいはレスポンス先頭部にある
データ長情報については関知する必要はありません
注2:不明な点は、mschDriver.pl のソースコードを直接に当ってください
注3:アプリケーション側記述例は、sample/program/ の
perlclient/perlClient, perlCGI/search.cgi
を参考にしてください
- msch_connect( host, port )
-
機能: MindSearchとの接続を確立する
引数: host:ホスト名 post:ポート番号
戻値: 成功すると空列を返す。接続エラーはエラーメッセージを返す
補足: ソケット情報はライブラリ内に保存されるのでアプリケーションは関知しくなて良い
- msch_disconnect()
-
機能: MindSearchとの接続を切断する
引数: なし
戻値: なし
- msch_sendScript( script, monitor )
-
機能: スクリプトをMindSearchに送信する(モニタ指定有効版)
引数: script:スクリプト、monitor:1を指定すると交信をコンソールにモニタ表示
戻値: なし
- msch_sendScript( script )
-
機能: スクリプトをMindSearchに送信する(モニタ指定の無い版)
引数: script:スクリプト
戻値: なし
- msch_receiveResponse( monitor )
-
機能: MindSearchからレスポンスを受信する(モニタ指定有効版)
引数: monitor:1を指定すると交信をコンソールにモニタ表示
戻値: レスポンス
- msch_receiveResponse
-
機能: MindSearchからレスポンスを受信する(モニタ指定の無い版)
引数: なし
戻値: レスポンス
Javaのための通信ライブラリは以下の場所にあります。javaCGI および javaclient と呼ぶサンプルプログラムの中に入っているので、ユーザが開発するアプリケーションはここからコピーして使ってください。(2つのサンプルにあるものは同じです)
mshyper/sample/program/
|
+-- javaCGI/
| +-- WEB-INF/
| +-- classes/
| +-- lib/
| +-- MschDriver.java ←Javaソース
| +-- MschDriver.class ←Classファイル
| +-- MschException.class ←Classファイル
|
+--- javaclient/
| +-- lib/
| +-- MschDriver.java ←javaCGIにある
| +-- MschDriver.class ものと同じ
| +-- MschException.class
以下にクラス・メソッドの使い方を説明します。
注1:本ライブラリを使う場合は、スクリプトあるいはレスポンス先頭部にある
データ長情報については関知する必要はありません
注2:不明な点は、MschDriver.java のソースコードを直接に当ってください
注3:アプリケーション側記述例は、sample/program/ の
javaclient/JavaClient.java, javaCGI/Search.java
を参考にしてください
クラス
class MschDriver( String enc )
機能: 通信ライブラリのコンストラクタです
引数は文字コードのエンコーディングです。
Unixでは"euc-jp"を与えます。
class MschException( String msg )
機能: MschDriver.java内のExceotionはこのクラスで発生します
利用者はExceptionを持つメソッドをこれでcatchしてください
メソッド
void connect( String host, int port )
throws MschException
機能: MindSearchとの接続を確立する
引数: host:ホスト名 post:ポート番号
戻値: なし(接続エラーはException発生)
補足: ソケット情報はライブラリ内に保存されるのでアプリケーションは関知しくなて良い
void disconnect()
機能: MindSearchとの接続を切断する
引数: なし
戻値: なし
void sendScript( String script, int monitorReq )
throws MschException
機能: スクリプトをMindSearchに送信する(モニタ指定有効版)
引数: script:スクリプト、monitor:1を指定すると交信をコンソールにモニタ表示
戻値: なし(通信エラーはException発生)
void sendScript( String script )
throws MschException
機能: スクリプトをMindSearchに送信する(モニタ指定の無い版)
引数: script:スクリプト
戻値: なし(通信エラーはException発生)
String receiveResponse( int monitorReq )
throws MschException
機能: MindSearchからレスポンスを受信する(モニタ指定有効版)
引数: monitor:1を指定すると交信をコンソールにモニタ表示
戻値: レスポンス(通信エラーはException発生)
String receiveResponse()
throws MschException
機能: MindSearchからレスポンスを受信する(モニタ指定の無い版)
引数: なし
戻値: レスポンス(通信エラーはException発生)
本ドライバはセンティリオン株式会社(http://www.centillion.co.jp/index2.html)殿から
寄贈していただきました。Copyrightは同社に帰属します。
MindSearchアプリケーションに付属させて利用される場合には、ソース内
にあるクレジットを維持していただけるようお願いします。
PHPのための通信ライブラリは以下の場所にあります。
mshyper/sample/program/
|
+--- phplib
+--- CREDIT.euc ←Copyright情報
+--- mschDriver.php ←通信ドライバ
+--- msch_format_keywords.php ←キーワード整形のライブラリ
mschDriver.php について
以下に関数の使い方を説明します。(Perlのドライバの関数仕様と同じです)
注1:本ライブラリを使う場合は、スクリプトあるいはレスポンス先頭部にある
データ長情報については関知する必要はありません
注2:不明な点は、mschDriver.php のソースコードを直接に当ってください
- msch_connect( host, port )
-
機能: MindSearchとの接続を確立する
引数: host:ホスト名 post:ポート番号
戻値: 成功すると空列を返す。接続エラーはエラーメッセージを返す
補足: ソケット情報はライブラリ内に保存されるのでアプリケーションは関知しくなて良い
- msch_disconnect()
-
機能: MindSearchとの接続を切断する
引数: なし
戻値: なし
- msch_sendScript( script, monitor )
-
機能: スクリプトをMindSearchに送信する(モニタ指定有効版)
引数: script:スクリプト、monitor:1を指定すると交信をコンソールにモニタ表示
戻値: なし
- msch_sendScript( script )
-
機能: スクリプトをMindSearchに送信する(モニタ指定の無い版)
引数: script:スクリプト
戻値: なし
- msch_receiveResponse( monitor )
-
機能: MindSearchからレスポンスを受信する(モニタ指定有効版)
引数: monitor:1を指定すると交信をコンソールにモニタ表示
戻値: レスポンス
- msch_receiveResponse
-
機能: MindSearchからレスポンスを受信する(モニタ指定の無い版)
引数: なし
戻値: レスポンス
msch_format_keywords.php について
これはキーワード整形のライブラリで、CGI環境で使う便宜のために置いてあります。たとえば
キーワード: [映画 監督]
のようにCGI画面で入力された情報から、
"映画"and"監督"
のような、MindSearchのKEYコマンドが必要とするフォーマットへの変換を行うものです。
送受する文字コードはUNIX版 MindSearch では euc-jp です。
MindSearchがテキストファイルをもとにインデックス作成をおこなう場合は文字コードを自動判定し、強制的に前記のネイティブ文字コードに変換してから処理をおこなうようにないます(プレーンテキストだけでなく、HTMLドキュメント等フィルタが関与するものも同様です)。
オリジナルがシフトJISのドキュメントはシフトJISの文字セット特有の文字コードを含むことがあります(JISコードあるいはEUCコードにマッピングできない文字)。そのようなドキュメントに対して、UNIX版のMindSearchは誤った検索をおこなうことがあります。
オリジナルドキュメント中にNULL文字(0x00)が含まれるとMindSearchは誤動作をすることがあります。
UNIX版であってもMindSearchは半角カナを受け付けることができるため、検索結果として半角カナコードを含む情報がレスポンスとして返される可能性があります。
注:半角カナの文字コードをEUCの 0x8EA1〜0x8EDF としています
UNIXの場合、組織によってはでは半角カナの使用を禁止していることがよくありますが、厳密にはOSが半角カナを扱えないわけではなく、シェルやエディタ、各種ツール類の幾つかが半角カナを処理できない、あるいはウィンドウに半角カナを表示できないといったアプリケーションレベルの問題であり、UNIXのOSそのものが半角カナを扱えないわけではありません。
MindSearchを使うアプリケーションは、MindSearchから半角カナが返されることがあることを意識してプログラムを作成してください。
アプリケーションをJavaで開発する場合の注意ですが、文字コード euc-jp でアプリケーションから外部へデータを出力すると漢字コードの一部(記号など)が文字化けすることがあります。これはJavaの特性のようでMindSearchが原因ではないのですが、対策としてJavaプログラムとMindSearchとの間を shift_jis で通信することで回避できることが分かっています。以下の手順によってください。(この場合であってもMindSearch内部の処理は euc-jp です)
- Java向け通信ドライバ MschDriver のインスタンス生成時の文字エンコード指定を "shift_jis" とします
- MindSearchと通信開始後(INI, STAコマンドの後)、"CHR:sjis" コマンドを実行してMindSearch側の動作をSJISに切り替えます。
詳しくはセクション 「CHR」コマンド(文字コード指定)」 を参照願います。
Copyright(C) 2000-2009 Scripts Lab. Inc.