このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

GripGrop による全文検索システム

発言者:田中求之
( Date Thursday, May 21, 1998 16:04:31 )


OSTRA さんの作られたテキスト検索ツール GripGrop 3.0 を使った、全文検索
CGI のテストを始めました。検索対象には、この会議室の最近60日間に
更新されたページを、実験用フォルダーにコピーしたものを用いています
(ファイル数を制限するため)

GripGrop は、Multi-thread 対応でバックグランドでの高速検索を行いますし
AppleScript からコントロールする場合、非同期で検索を行わせられる
(つまり search コマンドを送ったら、検索が開始され、すぐに relay が
返ってくる)という特徴があります。

GripGrop はOSTRA さんのホームページから入手できます

<http://www2.tky.3web.ne.jp/~ostra/>


で、これなら Send Partial と組み合わせて全文検索システムが作れるな、と
いうのが事の発端です。

Tanaka's osax の MT List Files の keyword をつかった全文検索では
検索が終わるまで reply が返りませんので、ファイル数が多いとタイムアウト
(検索処理および表示用処理に時間がかかりすぎる)になるため、この会議室
では使用を中止した経緯があるのですが、GripGrop ならなんとか使えるか
と思います。

そうはいっても全文検索ですし、いくら GripGrop が Multi-thread でも、
AppleScript はそうじゃないため、それなりに時間がかかりますから、この
サイトのような、規模が小さい、アクセス数もあるていど限られているところ
でしか使えないとは思いますが、ま、試してみたいという方はどうぞ。

使用しているスクリプトは、いずれ公開します。


→  GripGrop による全文検索のテスト

石津@RJC さんからのコメント
( Thursday, May 21, 1998 19:32:00 )

これってLC475で動作しているんですか?

素晴らしいっす。(^-^;
検索状態まで表示するのはすごいですね!
早くスクリプトが見てみたいです。

森田@埼玉 さんからのコメント
( Thursday, May 21, 1998 20:04:30 )

私も試させていただきました。

Applescriptで動いているとは思えませんね〜
(特に状態表示が。こんなことできるんですか?GripGropに依存しているのかな?)

このスクリプトも公開するんですか 本当に楽しみです。いつも恩恵を受けてばかりで恐縮です。

状態表示もカスタマイズ出来る様な柔軟なものを期待してます。

田中求之 さんからのコメント
( Thursday, May 21, 1998 20:22:16 )

LC475 の AppleScript で動いてます (^_^)

検索の経過を見せることで、待ち時間を少しでも退屈せずに過ごしてもらおうという
ことで Send Partial を使って、経過をその都度送りだしています。トータルの
検索速度を速くするには、こんな処理は行わないほうがよいのですが、ユーザー
インターフェース(というか使ったときの感触)はこっちの方が良いと思います。

何も起きない10秒よりも、時計カーソルの出る20秒の方が短く感じる

というインターフェース設計の基本的なトリックですね (^_^;;

これが可能なのも、GripGrop が、Multi-thread 対応で非同期で検索を
行ってくれるからです(CGI のスクリプトの実行と同時並行で検索が行われて
いく)。

CGI は、Send Partial を使う関係で、ちょっと変則的な構成になります。

現在は GripGrop のベータテストも兼ねているのですが、ベータテストが終わって
GripGrop 3.0.1 が正式にリリースされたら、スクリプトも公開します。

猫の手 さんからのコメント
( Thursday, May 21, 1998 21:40:20 )

 うちは、ie4ですが、経過が見られないんですが、どうしてでしょう。

よしもと さんからのコメント
( Thursday, May 21, 1998 21:56:22 )

確かにうちのIE 4.01でも、全部データが揃ってからじゃないと、
表示されないですね。

田中求之 さんからのコメント
( Thursday, May 21, 1998 23:29:33 )

IE ではそうなのかぁ…

実は最初は Multipart-MIME を使って、検索が終わったら、ページを丸ごと
切り替えるという方法のテストをやってたんですが、このときも、Send Partial
の表示が思うように行かない部分があって困ったんです。

どうも Send Partial で細切れにページのデータを送ったときの表示が
ブラウザによって異なるみたいですね。

テーブルじゃないんだから、届いた分だけ素直に表示してくれると踏んでたん
だけどな。

IE 4.0 は研究室には入れてあるので、明日にでも対応が可能かどうかを
調べてみます。

重松修 さんからのコメント
( Friday, May 22, 1998 13:58:21 )

私もIEなので、途中結果が表示されないのでおかしいなと思っていたんです。

もしかしたら、ですけど、<UL>タグで括ってますよね。これが良くないのかも。
<TABLE>タグと同じで、中身を全部読まないとレンダリングを開始しない
仕様なのかもしれません。あくまでも推測ですが。

田中求之 さんからのコメント
( Friday, May 22, 1998 19:44:21 )

基本的に MSIE は、ページのデータが揃ってからレンダリングを
行うようになっているみたいです。

それならば、と MSIE を使っていたときには Multipart-MIME で
ページを切り替えていく方法にしました。

今度は途中経過が表示されるはずです> MSIE のユーザーの方

重松修 さんからのコメント
( Saturday, May 23, 1998 07:17:52 )

いや〜、感動です。IEでも動きました。

ところで、検索を一人に限定してあるとのことですが、わたしはちょっとその
意味するところを理解できないのですが、

[CGI]<--->[検索実行ソフト]<--->[GripGrop]

という構成だと理解しています。

CGIはSendPartialを使うので、リクエストを受け取るとSendParialで返信
するとWebstarにリプライしてセッションを終了すればよい。そのあとで、
検索を実際に行いSendPartialで返すソフトにAppleEventで検索指令をおくり
それがGripGropを使って検索して、結果をWebstarに送ると理解しています。

GripGropがマルチスレッドならば、検索実行ソフトを複数使用するか、
あるいは、MAX10セッションと決めておいて、それらを順次循環して処理
すれば複数の人間が同時に利用できるようになると思うのですが。

田中求之 さんからのコメント
( Saturday, May 23, 1998 11:07:07 )

>検索実行ソフトを複数使用するか、

この方法なら、実際にどれだけの処理速度になるかは別にして、複数の同時検索は
可能です。

でも、現在、私の LC475 は、空きメモリーが1Mぎりぎりで、夜間にメンテナンス
用のスクリプトを走らせたりするので、これ以上、アプレットを増やせないんです (^_^;;


関係ないですけど、昨日 MSIE 用のスクリプトをテストしていて気がついたのですが、
MSIE を使っていると、バックグランドの処理がかなり遅くなりますねぇ。Netscape
(4.05)とこんなに違うとは思わなかった…

1台のマック(PM8100)で WebSTAR 3 + GripGrop + CGI + ブラウザという状況
でテストしますので、遅くなるのは当然なんですが、MSIE だと顕著でした。

それと、やっぱ、同じ仕掛けをしてもブラウザによって表示のされ方が違うというのも
困ったもんです。もちろん、HTML の規格で決まっていることではない(データ転送
中の表示について)ので、文句は言えませんが。

MSIE 用には Mutlipart-mime でページ自体を取り換えていく方法を使ったのですが
同じスクリプトに Netscape でアクセスすると、途中経過の部分が見えない(文字は
一瞬表示されるが、真っ白なページが表示されている時間が長い)んですよ。

ま、へんなことしてるんだから、しょうがないんだけど (^_^;;

武藤くん さんからのコメント
( Saturday, May 23, 1998 13:25:29 )

信じられない速さです。
ほんとにLC475なんでしょうか?
web用の検索アプリほしいなぁと思っていたところなので、
まちどおしです(^^;

田中求之 さんからのコメント
( Saturday, May 23, 1998 15:08:10 )

検索速度が速いのは、GripGrop の検索速度が速いからです。

こういう素晴らしいツールが AppleScript 対応であることが
うれしいですね。

猫の手 さんからのコメント
( Monday, May 25, 1998 08:06:06 )

 はやいですねぇ。スクリプトの公開が待ちどうしいです。

田中求之 さんからのコメント
( Wednesday, May 27, 1998 15:20:43 )

GripGrop 3.0.2b によって、英語の大文字と小文字を区別せずに検索するというのが
可能になりました。

GripGrop 3.0 は、日本語システム上で使うかぎりは、大文字小文字を区別せずに
検索する(ignore Case)がうまくいくのですが、英語システム + JLK の環境
で、バックグランドで走らせたときには、ignore Case だと日本語(SJIS)の検索
がうまく行われないという問題がありました。このため、Case Sensitive という
制限が加わっていたのです。この問題が今回のベータで修正されました。

また、検索速度が、若干向上しています。

田中求之 さんからのコメント
( Friday, May 29, 1998 21:15:20 )

さきほどのメンテナンスの際に、この会議室の今年になって投稿された(最初の発言が
今年ということ)ものすべてを対象に検索するように変えてみました。

さすがに60秒ほどかかりますが、でも、けっこう使えるという感じです。

作者の OSTRA さんには、検索対象として FSSpec のリストを受け付けるように
して欲しいという要望を出してあるのですが(今のところ、次回の正式リリース
では見送られそうな気配)、それが実現すれば、全文検索エンジンとして
文句なしに使えるでしょう。

日本人が作ったものだけあって、漢字コードが混在していてもちゃんと認識
してくれますしね

みなさんも、GripGrop を使って、どんどん要望を出しましょう (^_^;;

田中求之 さんからのコメント
( Friday, June 05, 1998 00:56:10 )

GripGrop 3.0.1 がリリースされました。

ということで、今週末に、全文検索 CGI のサンプルを作りますね。


→  This is OSTRACISM CO.

重松修 さんからのコメント
( Friday, June 05, 1998 04:53:49 )

GripGrop私も使ってみました。

現在田中先生のOSAXをつかって全文検索しているんですが(遅いです。)、
GripGropを使えば、漢字コードも自由ですし、スレッドマネージャ対応が
いいですね。後は速度がどれほど速くなるかですが、基本的にFileI/O
でしょうから、こればっかりは仕方ないのかな。純正250MHD、未だ健在(笑)

サンプル、よろしくお願いします。m(__)m
# 他力本願で済みません。

田中求之 さんからのコメント
( Friday, June 05, 1998 15:57:03 )

GripGrop 3.0.1 のテスト用に作っていた FaceSpan のプロジェクトを
アプリケーションに仕立てたものを登録しておきます。もちろん、プロジェクト
も含まれています。 osax は純正のものだけでOKです。

GripGrop のフロントエンドとして、ファイル単位で検索結果を把握し、
簡単に中身を覗くためのものです。テスト目的で作ったのですが、
osax や xcmd のソースの検索に私自身が重宝してます。
Drag & Drop 対応ですので、テキストを Clipping File に落とせます。

FaceSpan 3.0 で作ってますので、プロジェクトは FaceSpan 3.0 がないと
使えません。また、アプリケーションの実行には MacOS 8 が必要です。

→  GuriGuri.hqx

田中求之 さんからのコメント
( Friday, June 05, 1998 15:58:17 )

あ、Complete Application も含まれてますので、ファイルのサイズはでかい
です(748K)。気をつけて (^_^;;

田中求之 さんからのコメント
( Friday, June 05, 1998 18:59:48 )

GripGrop 3.0.1 を利用する全文検索 CGI のサンプルを登録しました。

grip.acgi と sendP という2つのアプリケーションから成り立っています。
grip.acgi の方が Tanaka's osax を使ってます。

あくまでも、AppleScript で自分で CGI プログラムが作れる方を対象にした
サンプルです。

→  GripCGI.hqx

モリヤ さんからのコメント
( Monday, June 08, 1998 12:04:16 )

Send partialに対応しているフリーのWebサーバーってないんでしたっけ?

田中求之 さんからのコメント
( Monday, June 08, 1998 14:06:31 )

Quid Pro Quo や Web Sharing 1.5, MS PWS などは対応してないみたい
ですね。

モリヤ さんからのコメント
( Monday, June 08, 1998 20:59:05 )

う〜,なるほど。ものすごく試したいのに〜。とりあえず今のところ
は,WebSTARを買うしか,手はないのですね(涙)。

田中求之 さんからのコメント
( Monday, June 08, 1998 23:55:35 )

AppleScript の辞書には出てきませんが、Quid Pro Quo は Send Partial を
サポートしてます(マニュアルで確認取りました)。

ただし、"Send Partial" というコマンド名は通用しないようなので、

<<event WWWスSPar>> msg given <<class Kcid>>:connectionID, <<class Kmor>>:true

というような、AppleEvent の生の形で記述する必要があるようです。


田中求之 さんからのコメント
( Tuesday, June 09, 1998 00:23:56 )

ちょいと書き換えて試してみたら、 QPQ 1.0 でちゃんと動きました。
明日にでも、QPQ 用のものを登録しておきます。

モリヤ さんからのコメント
( Tuesday, June 09, 1998 02:50:00 )

 ありがとうございます。教えてもらったとおり書き換えたら,QPQ 
1.02で動きました。これだと,うちの非力IIsiでも,十分な体感速度で
検索を行なうことができました。ものすごく嬉しいです。感謝です。

>(マニュアルで確認取りました)
→確かにマニュアルに書いてありますね。調べもしないで投稿してし
まってスミマセン。

田中求之 さんからのコメント
( Tuesday, June 09, 1998 03:35:52 )

>調べもしないで投稿してし
>まってスミマセン。

いえいえ、私の方も、「たしかできたと思ったけど、違ったっけ?」と不安になって
マニュアルを引っ張り出したのでした( AppleScript の辞書に載せて欲しいぞ)。

なにはともあれ、動いて良かったです。

あ、実はスクリプトにちょっとバグがありましたので、どっちにせよ、修正して
QPQ 用に書き換えたもの(これなら WebSTAR でももちろんコンパイルできる)
を登録しますね。

検索途中にユーザーがキャンセルした場合に、検索が止まらないというバグです。

田中求之 さんからのコメント
( Tuesday, June 09, 1998 12:29:27 )

ということで、ちょっとしたバグを修正の上、Quid Pro Quo 用に書き換えた
ものを登録しておきます。

QPQ 1.0 で動作確認済みです

→  GripCGI_QPQ.hqx

田中求之 さんからのコメント
( Friday, June 12, 1998 17:37:23 )

REALbasic が AppleEvent で ObjectSpeficier をサポートしたので、REARbasic
でマルチスレッド対応の GripGrop CGI を作ろうとしているのですが、肝心の、該当ファイル
(found file of hit file) が得ることができずに中断してます。

REALbasic は、現時点(r38)では Reply に DescriptorList や FolderItem 型の
データを受け取れないため、イベントは送れる(やっと Object Specifier の記述方法が
理解できた (^_^;; )のですが、帰ってきたリプライを受け取れないのです (;_;)

リクエストを出しておくつもりですが、果たして対応してくれるかな?

小石 達也 さんからのコメント
( Sunday, June 21, 1998 21:33:35 )

田中先生のサンプルを参考に、うちのサイトにも載せてみました。
快調に動いております。ソースを読むことが出来て、大変勉強に
なりました。ありがとうございました。

一応、

・tgFldr変数等を、フォーム上の隠しフィールドから取得する
・リストにURL表示を添える
・サブディレトリも検索する
・検索の途中経過表示を表示しない
・その代わりといっては変だが、GripGropにactivateを送って、
  検索スピードを稼ぐ

等の修正を盛り込んでみました。
hitクラスのOutputプロパティを参照して、検索した書類の内容を
リスト上に表示しようとしているところですが、なかなかうまく
いきません。
次回バージョンアップ時に挑戦しようと思っています。:-)

→  Quester's Room(わたしのサイト)

田中求之 さんからのコメント
( Monday, June 22, 1998 00:18:55 )

>・検索の途中経過表示を表示しない

検索中待たされるのが嫌になりませんか?

私の場合、GripGrop を本格的に使おうと思った理由が、高速検索はもちろんですが、
途中経過を表示できることにあったもんですから… (^_^;;

小石 達也 さんからのコメント
( Monday, June 22, 1998 01:31:23 )

>>・検索の途中経過表示を表示しない
>
>検索中待たされるのが嫌になりませんか?

ウチ程度の規模だと、最大でも書類数が200程度なので、検索にかかる時
間がほとんどかわらない(大体5秒程度)のでそうしました。
途中経過表示はコメントアウトしているだけなので、サイトの規模が大き
くなったら復活させるつもりでいます。:-)

目下の悩むは、検索そのものよりもむしろ、リスト化する部分のルーチン
です。(自作した部分なので、出来が悪い:-))リストの出力には
send partialを使っているのでそれほど待たされる感じはしませんが、処
理時間のほとんどはここで喰ってしまっています。

大坪 俊昭 さんからのコメント
( Wednesday, July 22, 1998 09:30:41 )

わたくしは、大坪俊昭と申すもので、とある国立病院の院内LANの構築を担当
している脳神経外科医です。

常日頃、院内LANを構築するに当たって、このForumの皆様の活発な発言が
大変お役に立っている次第です。

さて、以下の環境のWeb環境を利用した病歴閲覧システムを構築し、お陰様で
大変役立ってまして感謝申し上げている次第です(将来的には書き込みも可
能にして、いわゆる電子カルテを目指しています)。

ところが、検索対象が1100 files余りで、全容量7MBの量の全文検索で約3分
余り検索に時間を要します。

現在は、なんとか待てる時間ではあるのですが、日々10filesくらいずつ増え
てまいりますので、いずれ限界が来るのが予想されます。

そこで、現在、ファイル名を例えば、12345日本太郎.HTMLというように患者
番号+姓名.HTMLというように決めてやってるのですが、この検索システムの
オプションでdefaultの全文検索以外に、ファイル名のみからの検索、という
ものを加えることが出来ないものでしょうか?

AppleScriptも殆ど理解できない状態で、まったく手探りで他に直接尋ねる
ひともおらず、ほそぼそとやっております。もし、どなたかいい知恵がござ
いましたら、ご教授下さいませんでしょうか?

おそらく、AppleScriptで、cgiソフトを書き換えればいいんじゃないかな、
とは思っているのですが、出来ません。

PowerMac8100/80AV
MAC OS 8.1
10Base-TのみによるEthernet
Cliantの数;およそ40

<Webサーバー>
Quid Pro Quo 2.1+Tanaka'sosax 2.0+grip.acgi+sendP
+田中求之先生のhtml form+GripGrop 3.0.1PPC

<ftp サーバー>
NetPresenz 4.1J

ps;あとサーバと同層にあるPCがやたらと遅くなるというク
レームを聞くのですが、こういう環境の場合そのようか可
能性があるのでしょうか?

木下@キー・プランニング さんからのコメント
( Wednesday, July 22, 1998 11:47:15 )

直接的な答えになっていないかもしれませんが、検索速度を重視するなら
ファイルメーカーProなどのWeb機能で処理した方が良いと思います。

検索の度にディスクをなめてキーワードを探すタイプのツールと違って、
データベースなら、事前に索引を付けてメモリ上のデータから検索でき
まし、検索対象をタイトルだけにすることで、全文検索時の速度より
圧倒的に速い処理が可能です。

→  KEY Planning Web

山本 武 さんからのコメント
( Friday, July 24, 1998 00:42:28 )

 1000ファイル7Mバイトで検索に3分というのはちょっと我慢の限界ですね。
「Macってそんなに遅いのかなぁ」と思って試してみました。
我が家の環境(PM8500/180 2GHD)では1000ファイル(各ファイル50文字*70行)
3500文字で7000バイト相当)の検索なら単体のGripGropで25秒程度です。
MgrepAPPなら14秒。(早いですね)MacJPerlでやったら10秒弱(これも早い)。
G3マシン+高速HDだったらいったいどうなるのだろうと思います。
サーバーと両立となると若干制約を受けそうですが10秒くらいにはなりそうな気がします。

大坪 俊昭 さんからのコメント
( Friday, July 24, 1998 14:28:01 )

ありがとうございます。

ファイルメーカーを利用することもオプションの一つとして考えてはいるのですが、
一つのファイルに追記される項目や文章が、不特定にあるという医療情報の特殊性
から、なかなか踏み切れないでいるところです。

また、GripGrop単体で検索したところ、40秒程度で検索が終了しました。
やはり、Web Browserを使ってLAN経由の環境では、違うのでしょうか?

木下@キー・プランニング さんからのコメント
( Friday, July 24, 1998 15:08:54 )

>一つのファイルに追記される項目や文章が、不特定にあるという医療情報の
>特殊性から、なかなか踏み切れないでいるところです。

他のデータベースならともかく、それこそファイルメーカーの出番と思うの
ですが...。

>やはり、Web Browserを使ってLAN経由の環境では、違うのでしょうか?
httpサーバとCGIのバックグランドで動いているのですから、最前面で操作した時とはかなり違うでしょう。

田中求之 さんからのコメント
( Friday, July 24, 1998 17:14:18 )

>最前面で操作した時とはかなり違うでしょう。

GripGrop に限らず、全文検索システムを高速で動かすコツとして、システムの
ディスクキャッシュを大きめにとる、あるいは RAM ディスクを使うなどして、
ハードディスクの読み出し時間を短縮するという方法はあります。

GripGrop の場合は、name mask によって検索するファイルをファイル名で
絞り込めますよ。また、もし OSTRA さんが私の願いを聞き入れてくだされば、
あらかじめ候補を AppleScript で絞り込んでから検索を行えるようになる
はずです(もっとも、次のリリースがいつになるかわからないのですが)。

大坪 俊昭 さんからのコメント
( Friday, July 24, 1998 21:47:59 )

お世話になります。

>GripGrop の場合は、name mask によって検索するファイルをファイル名で
絞り込めますよ。

????
具体的には、sendPのオプションのset.....のところを変更するのでしょうか?

済みません初心者なので、まとはずれの質問かもしれませんが。

田中求之 さんからのコメント
( Saturday, July 25, 1998 08:58:22 )

では、来週にでも、名前による絞り込み機能を追加したサンプルを作りますね。

山本 武 さんからのコメント
( Saturday, July 25, 1998 09:52:25 )

gripgropの用語説明を見ると

Class window: 
  mask enable  boolean--マスクを有効にするか
  mask file name  string---これでファイル名を絞る

で指定しているようですので、

sendPの
--- Start Searching
  tell application "GripGrop"
  tell window 1
            
  set search string to myKey
  set search folder to file tgFldr
  set kanji code to kanji_sjis ---- SJIS で検索
  set ignore case to true --- 大文字小文字は区別しない
  set boyer moore to true --- 高速検索
  set show after to true --- 表示は後回しにして速度を稼ぐ
            
  search
  - - - - - -

の一連のset文に追加すればよいのだと思いますがどうでしょう。
cgiの中身をあまり見ないで言っているので間違っていたらごめんなさい。