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

dirListerで同時に複数のキーワードで検索するには?

発言者:重松修
( Date Sunday, May 11, 1997 22:53:27 )


dirListerを用いて、自分のホームページにサイトサーチを付けようと思うの
ですが、同時に複数のキーワードを検索することはできるのでしょうか?
(AND検索、もしくはOR検索)

とりあえず、半角スペースで区切ってみたんですが、やっぱり駄目だったので、
駄目なら複数回検索しないとかなぁと思っています。

また、半角の<>に囲まれた部分を無視する、なんて機能はないですよね?


田中求之 さんからのコメント
( Sunday, May 11, 1997 23:46:34 )

dirLister にはそのような機能は組み込んでいません。単純に、ファイルをサーチして
キーワードが見つかるかどうかを見ているだけです。

検索機能を強化するとなると、ちょいと面倒なプログラミングが必要になりますし、
私自身は必要性を感じていない(というか、osax ではなくプログラムを使うべき
だと思う)ので、これからも検索機能を強化する予定はないです (^_^;;

かといって、サーチ用のツールで CGI から呼び出すのに手ごろなのもなかなか
ないですけどねぇ。

重松修 さんからのコメント
( Tuesday, May 13, 1997 11:00:33 )

田中先生、いつもお世話になっております。

機能の件、了解しました。
あれって、指定したフォルダより深い階層にあるファイルや、エイリアスは
検索できないですよね?

ちょっと、スクリプトネタになるかとは思いますが、

set myFlist1 to dirLister file(tgFldr) type TEXT keyword myKey2
set myFlist2 to dirLister file(tgFldr) type TEXT keyword myKey2

とすると、myFlist1とmyFlist2にヒットした結果が入る思います。
これを素早くANDやOR取る方法というのはあるのでしょうか?

repeat with thisF1 in myFlist1
  repeat with thisF2 in myFlist2
    if thisF1 is thisF2 then set end of myResut to thisF1
  end repeat
end repeat

とかしか思い浮かびません。(T_T)

もっとサクッと1行くらいで書けそうな気がするんですが。。。

関係ないですが、先生のCGIを参考にして、新しく会議室用のCGIを作って
見ました。


→  ウサギックパーク

田中求之 さんからのコメント
( Tuesday, May 13, 1997 22:27:43 )

リストの比較は、リピートでアイテムを一つずつチェックしていくしか方法はない
です。

それから、DirLister は、指定した階層しかチェックしません。サブフォルダーの
中は見ません(もともと、その名の通り、ディレクトリーのファイルのリストを作る
のが目的の osax ですから)。

なお、AND 検索の場合は、最初に dirLister を使ってファイルを選び、それらの
ファイルに対して hasKeyword でチェックを行うという方法をとれば、多少ははやく
なると思います。もっとも、osax を頻繁に呼び出すことによるオーバーヘッドが
生じる可能性もあるのですが。

いずれにせよ、dirLister で複雑な検索をやるのは、ちょっとつらいですよ。

重松修 さんからのコメント
( Wednesday, May 14, 1997 05:13:32 )

>それから、DirLister は、指定した階層しかチェックしません。サブフォルダーの
>中は見ません(もともと、その名の通り、ディレクトリーのファイルのリストを作る
>のが目的の osax ですから)。

これに関しては、フォルダの有無を調べて複数回処理することで一応ホーム
ページを見て回ってキーワードを含むファイルが検索できるようになりました。

ありがとうございました。

重松修 さんからのコメント
( Thursday, May 15, 1997 08:09:04 )

良いアイデアが思いつかなかったので、結局FileMakerProを使うことにしました。
3万も払って、全然使ってなかったので、ちょっとは活用しないとと。(^_^;;

3.0になってから、リレーショナルの機能などもくっついたようで、2.0と使い
勝手が違うので、少々戸惑っています。

田中先生は、FileMakerを利用したスクリプトを紹介されていたと思いますが、
AppleScriptからの文法はどうやって調べられたのですか?用語辞書?あれは
さっぱり意味不明ですが、マニュアルには1行も記入がないようで、クラリス
に電話して聞いたら、「(特殊な使い方なので、無償)サポートできない。」
というような回答でした。(--")

例えば、
tell Application "FileMaker Pro"
  try
    set myResult to every record whose cell "セル1" contins "条件"
    -- 一つしか見つからなかったら、形式をリストに
    if item 1 of myResult is not class then set myResult to {myResult}
  on error -- 見つからなかった
    set myResult to {}
  end try
end tell
myResult -- 結果を表\示

とすると、myResultにはセルの名前が"セル1"で"条件"を含むレコードすべての
セルが取り込まれます。

データが少ないときは問題ないのでしょうが、このうち最初の20件とか、取り出す
セルは"セル1"と"セル2"だけでよい、というののやり方がさっぱり分かりません。

よろしくお願いします。

田中求之 さんからのコメント
( Thursday, May 15, 1997 11:05:03 )

>set myResult to every record whose cell "セル1" contins "条件"

ここでいきなり該当するレコードのデータすべてを抜き出すと、メモリーなどへの
負担も大きくなりますので、

set myResult to ID of every record whose cell "セル1" contins "条件"

のように、まず該当するレコードの ID を得ておいてから、その ID を元に処理を
行うというのがよいでしょうね。私が公開しているサンプル(Booklist のやつ)
もこの方法を用いています。

FileMaker のスクリプトの用語については、FM の用語辞書(Dictionary)だけで
なんとかなります。というか、あそこに載っているものをうまく組み合わせていくしか
ないです。ただ、データベースというのは、奇麗に階層的なオブジェクトの構成になって
ますので、オブジェクトを扱うのはそれほど難しくないと思います。