高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technote 1141

Extending and Controlling Sherlock


 

目次


概要

インターネット検索プラグイン(Internet Search Plug-ins)
 検索プラグイン・ファイル(Search Plug-in Files)
 検索プラグインの例
 インターネット検索とXML検索の結果
 検索サイト管理者のヒント
 インターネット検索インターフェース言語のBNF


AppleScriptのサポート
インターネットを検索する
ファイルを検索する
kAEOpenDocumentsアップル・イベントのパラメータの追加


内容による検索(Find by Content)
内容による検索が使えるか調べる
サーチ・セッション(Search Session)での処理
検索を実行する
サーチ・セッションの情報を取り出す
内容による検索のリファレンス

データタイプ
サーチ・セッションの割り当てと初期化
サーチ・セッションの構成
検索の実行
ヒットに関する情報を得る
テキストの要約を作る
ヒープ・ゾーンの予約
内容による検索(Find by Content)C言語要約

Mac OS 8.5では、いくつかの強力な検索機能が追加されましたが、それらを総称してSherlockと呼びます。Mac OS 8.5以前、ユーザは検索アプリケーション(Find Application)により、マウントされたディスク・ボリュームに対して名称、変更日付、ファイル・タイプ(file type)などでファイルを検索することができました。Sherlockはこれらの機能を全て持っていますが、それに加えてファイルの内容による検索とインターネット検索をユーザが選択できるようになりました。

概要

インターネット検索を実行する際に、Sherlockアプリケーションはいくつかのインターネット検索サイトに、問い合わせ情報を送ります。検索サイトから戻された情報はSherlockアプリケーションにより解釈され、一覧できるように表示されます。それぞれのインターネット検索サイトは、それぞれ固有の問い合わせ形式と、その結果の情報の形式を持っていますので、Sherlockは個々のインターネット検索サイトに対する問い合わせ形式の生成と、結果の情報の構文解析を行うために、その形式を記述したプラグインを使います。インターネット検索プロバイダーが自身のインターネット解析プラグインを作成したい場合、インターネット検索プラグインの章にその説明がありますので見てください。

Sherlockアプリケーションは、その新しい内容を基にした検索機能とインターネット検索機能をアクセスするAppleScriptコマンドを提供しました。これらのコマンドには内容による検索のコマンド、ボリュームの索引を作るためのコマンド、そしたインターネット検索を実行するためのコマンドがあります。この機能の詳細の説明はAppleScriptのサポートの章にあります。

S herlockアプリケーションは、内容を指定した検索で見つかったファイルのオープンをファインダに依頼する時、ファイルが選択された理由に関する情報をファインダに渡す'odoc'アップル・イベントに付けます。ファインダはこの情報を'odoc'に関連したプロパティとしてアプリケーションに送ります。アプリケーションは'odoc'アップル・イベントの中のこの情報にアクセスして、さらに進んだ検索と表示を行うことができます。kAEOpenDocumentsの章にもっと詳しい説明をします。

内容による検索(Find by Content)はコード・フラグメント・ライブラリ(Code Fragment Library)で実現された新しいシステム-レベルの機能です。Serlockアプリケーションは内容による検索をアクセスし、内容を基にした検索を行う際にその検索機能を利用します。デベロッパのアプリケーションからのこの内容による検索のサービスを使いたい場合、"Findby Content"(引用符無し)という名称のPowerPCコード・フラグメント・マネージャのライブラリを利用します。ルーチンの説明と例が内容による検索の章にあります。


インターネット検索プラグイン(Internet Search Plug-ins)

Sherlockアプリケーションの"インターネット検索(Search Internet)"機能を使って、ユーザはいくつかのサーチ・エンジンを利用したインターネット検索を行うことができます。Sherlockアプリケーション自身は、個々のインターネット・サーチ・エンジンが期待しているデータ、あるいは生成するデータの正確な形式を持っていません。あるインターネット検索サイトをアクセスするSherlockアプリケーションは、サイトが検索のために期待するデータの形式と検索結果として生成されるデータの形式を記述する、検索プラグイン・ファイル(Search Plug-in file)と呼ばれるものを使います。

インターネット検索インターフェース言語(Internet Search Interface Language,ISIL)は、インターネット検索サイトの管理者がそのサイトの検索プラグイン・ファイルを提供するためにその内部で使われる言語です。検索プラグインのデータ・フォークは、検索サイトを記述するASCIIテキストを含んでいます。リソース・フォークは、カスタム・アイコン、ファインダ・ストリングなどで利用できます。検索プラグイン・ファイルのクリエータ・コードは'fndf''、ファイル・タイプは'issp'で、Sherlockアプリケーションは、それらが"インターネット検索サイト(Internet Search Site)"フォルダにあるとき認識します。システム・フォルダの(閉じた)アイコンにドロップされたとき、タイプ'issp'のファイルは"インターネット検索サイト(Internet Search Site)"フォルダに自動移動されます。

ISILでの記述法はHTMLに倣っていますので、HTML文法に馴染みのある人なら、ほとんど問題なく自身で検索プラグイン・ファイルを作れると思います。この言語の正確な仕様は、インターネット検索インターフェース言語BNFの章で詳しく説明します。

検索プラグイン・ファイルを作るのには、SimpleTextでかまいませんが、テキスト・エディタが必要です。また、プラグイン・ファイルのファイル・タイプを変更するユーティリティが必要です。以下に検索プラグイン・ファイルを編集する基本的なステップを示します。

  1. テキスト・エディタでファイルを開くか作成して、編集する。
  2. .変更した結果を保存して閉じる。
  3. ファイル・タイプを'TEXT'から'issp'に変える。
  4. Sherlockアプリケーションを使った、ファイル(Sherlockプラグイン・ファイルです)をテストする。うまくいったら完成。終了。
  5. ファイル・タイプを'issp'から'TEXT'に変更する。
  6. このリストのステップ1へ行く。
テキスト・エディタがどんなファイル・タイプでも編集できるのなら、編集するファイル・タイプを変更しなくてもすみますので、ステップ3とステップ5は省略することができます。

Sherlockアプリケーションは"Internet検索サイト(Internet Search Site)"フォルダを、起動時に1回だけスキャンします。検索サイト・ファイルをテストしたい場合には、毎回Sherlockアプリケーションを再起動しなければなりません。



検索プラグイン・ファイル

検索プラグイン・ファイルは、webページを定義するために使用するHTMLテキストと同様な形式のASCIIテキストを持っています。従って、本ドキュメントでは、HTMLを説明するために使用する用語を、ISILの文法を説明するために使います。インターネット検索サイトに関する情報はSEARCHタグというラベルのブロックが持ちます。このブロックは、Sherlockアプリケーションがインターネット検索サイトに問い合わせを送る方法を記述し、URLなどの情報を持ち、問い合わせを送信するHTTPコマンドと問い合わせパラメータに関する情報を持ちます。SEARCHブロックの典型的な配置をリスト1に示します。


リスト1. 検索プラグイン・ファイルのSEARCHブロックの典型的な配置:
                                                <SEARCH
    name = "<search engine name>"
    method = ["get" | "post"]
    action = "<url to address>"
    [update = "<url containing update file>"]
    [updateCheckDays = "<days between update pings>"]
    [description = "<human-readable-description">]
    [bannerImage = "<url containing banner image>"]
    [bannerLink = "<url to load when banner clicked>"]>
      
....
      
<INPUT
    name = "<input name>"
    value = "<value>"
    [mode = "results"]>
<INPUT
    name = "<input name>"
    value = "<value>"
    [mode = "browser"] >
      
....
      
<INPUT
    name = "<input name>"
    user>
      
....
      
<INTERPRET
    [bannerStart = "<text>"]
    [bannerEnd = "<text>"]
?    [relevanceStart = "<text>"]
    [relevanceEnd = "<text>"]
?    [resultListStart = "<text>"]
    [resultListEnd = "<text>"]
    [resultItemStart = "<text>"]
    [resultItemEnd = "<text>"]
    [skipLocal=true]
      
    [charset = "<text>"]
    [resultEncoding = <integer>]
    [resultTranslationEncoding = <integer>]
    [resultTranslationFont = "<text>"]>
      
....
      
</SEARCH>

サーチ・ブロックは、<SEARCH...>タグから始まり(表1に示されるいくつかの属性を含み)</SEARCH>タグで終わります。検索サイトを記述する実際のサーチ・ブロックでは、いくつかのINPUTタグとひとつのINTERPRETタグを持ちます。SEARCHブロックの属性は、どのように検索サイトをアクセスするか、最新の検索プラグインのあるサイトの場所はどこかを記述します。


表1 SEARCHブロックの属性
属性名称 説明
name 検索プラグインの人間が読める名称
method method属性は、HTTPサーバとの通信に用いるHTTPコマンドのタイプを指定します。現時点では"GET"あるいは"POST"を通信法として指定できます。
action 検索サーバへの完全URL(full URL)を指定します。結果のリストの全ての相対リンクは、ここで指定したURLを使ってローカライズされます。
update この属性はオプションで、最新のバージョンの検索プラグインがある場所を指定します。このオプションが指定された場合、Sherlockアプリケーションは、このURLを定期的にチェックして、変更があるかどうかを調べます。もし、このURLにあるファイルが現在インストールしてあるファイルより新しいことが分かった場合、Sherlockアプリケーションは、ユーザにこのファイルをダウンロードするようダイアローグを表示し、自動的にインストールします。このURLにあるファイルのフォーマットはBinHexでなければなりません(それ以外の圧縮やエンコードは禁止されています)。
dateCheckDays この属性はオプションで、updateのURLで指定されているファイルの最新のバージョンをチェックする日にちの間隔を指定します。この属性が存在しない場合、省略時解釈の30日が使われます。
description この属性はオプションで、サーチ・エンジン、その能力、検索結果の内容の種類などを説明するテキストを指定します。ユーザ・インターフェース機能は、このテキストを利用することができます。
bannerImage この属性はオプションで、当該サーチ・エンジンを使った検索の結果の詳細ペインで表示されるイメージのURLを指定します。
注:INTERPRETタグのbannerプロパティーと本属性が矛盾する場合、INTERPRETタグの指定が優先されます。
bannerLink この属性はオプションで、bannerイメージがクリックされた時にロードされるURLを指定します。
注:INTERPRETタグのbannerプロパティと本属性の指定が矛盾する場合、INTERPRETタグの指定が優先されます。



INPUTタグはHTTPサーバに送るGETあるいはPUTコマンドが使うデータ・フィールドを構成するために使われます。データ・フィールドはHTTPシンタックスを使って構成され、methodフィールドにより、サーバに問い合わせる方法が決定されます。サーチ・ブロックは、いくつかのINPUTタグを持つことができますが、INPUTタグのうちUSER INPUTタグとなるのはひとつだけです。

INPUTタグには2つのモードがあります。Sherlockアプリケーションは2つのタイプの問い合わせを送ることができ、そのひとつは結果を受け取るときのもので、もうひとつは問い合わせURLをブラウザに送るときのものです。"result"モード(デフォルト)と指定されたINPUTタグはSherlockアプリケーションが問い合わせを検索サイトに送ってSherlockアプリケーションのウィンドの検索結果のリストに表示するときに使われます。"browser"と表示されたINPUTタグは、ブラウザ・アプリケーションが表示するために送る、問い合わせURLで指定します。例えば、下の2つのINPUTタグは、ひとつのサーチ・プラグイン・ファイルに共存させることができます。


<input name="sv" value="AP" mode = "results">
<input name="sv" value="IS" mode = "browser">


ここで、"sv"="AP"は、Sherlockアプリケーションに送られて、結果を表示するために使われ、"sv"="IS"はwebブラウザに送られて結果が表示されます。

INTERPRETタグは、サイトに送られた問い合わせから戻される情報の形式を記述します。この情報によりSherlockアプリケーションは、個々の問い合わせの検索結果を抽出し、リストの形式にすることができます。表2はINTERPRETタグに指定できる、さまざまた属性を記述しています。INTERPETタグで指定されるそれぞれの属性は、特定の部分にデリミタ(区切り)として現れるテキストパターンを指定します。これらの属性が指定された時、Sherlockアプリケーションは、指定されたテキストパターンを使って、インターネット検索サイトから返される結果ページから、検索結果を抽出します。


表2 INTERPRETタグ属性
属性名称 説明
resultListStart サーバが返した結果のページの中で、検索結果のリストの先頭に現れるテキストパターンを指定します。resultListStartが指定されていない場合、Sherlockアプリケーションは結果ページの最初から結果リストが始まると仮定します。
resultListEnd サーバが返した結果のページのなかで検索結果のリストの末尾に現れるテキストパターンを指定します。resultListEndが指定されていない場合、Sherlockアプリケーションは結果ページの最後が結果リストの末尾であると仮定します。resultListStart属性とresultListEnd属性は、結果リストを区切るために使われます。
resultItemStart 結果のリストの個々の項目の先頭に現れるテキストパターンを指定します。結果ページの中で指定されてテキストが一致した場合、テキストパターンのすぐ後に続くリンクがリストとしてユーザに表示されます。
resultItemEnd 結果のリストの項目を記述するテキストの末尾に現れるテキストパターンを指定します。結果のリンクと、このテキストパターンに間のテキストが詳細ペインに表示されます。resultStart属性とresultEnd属性は、サーバから返された結果のリストの個々の項目を区切るテキストパターンを定義するために使われます。
bannerStart 検索結果に表示するバーナーイメージの位置を示すために使われるテキストパターン。テキストパターンに続く最初のリンクがbannerLinkとして使われ、最初のイメージがbannerImageとして使われます。bannerStart属性に指定されたテキストパターンが一致した場合、bannerLinkとbannerImageがSEARCHタグでの指定に優先します。
bannerEnd バーナー情報の末尾の印となるテキストパターンを指定します。結果ページでのbannerImageとbannerLinkの検索は、このテキストパターンが現れた時点で終了します。bannserStart属性とbannerEnd属性で定義されたテキストパターンは、結果のページに現れるバーナー情報を区切るために使われます。
relevanceStart 結果リストのそれぞれの項目に対して、適切さに関する情報の始まりを示すテキストパターンを指定します。これが指定されたとき、このパターンの後に最初に見つかった数値テキストがその項目の適切度として解釈されます。注:適切度を表す数値は0から100までです。
relevanceEnd 適切度情報の末尾を示すテキストパターンを指定します。適切度情報の検索はこのテキストで終了します。relevanceStart属性とrelevanceEnd属性は、個々の検索結果の適切性の数値を区切るために使われます。注:適切度を表す数値は0から100までです。
skipLocal skipLocalはブール属性です。skipLocalがtrueの場合、Sherlockアプリケーションは、action属性で指定されたSEARCHタグのなかの同じホストへのリンクを無視します。
charset HTMLでの結果が期待するエンコーディング。この属性にはcharset HTMLメタタグで使用できる任意の値が設定できます。
resultEncoding HTMLでの結果のエンコーディング。<TextCommon.h>で定義された任意の整数が指定できます。
resultTranslationEncoding ここで指定されたエンコーディングにHTMLでの結果が変換されます。<TextComman.h>で定義された任意の整数が指定できます。
resultTranslationFont 変換されたテキストが期待するフォントです。



charset属性、resultEncoding属性、resultTranslationEncoding属性とresultTranslationFont属性は、異なったキャラクタ・エンコーディングの結果を解釈するためのものです。結果ページがHTMLメタタグ"charset"を持つ場合、SherlockアプリケーションがTextEncoding Converterを使ってドキュメントをMacintosh Encodingに変換します。

しかし、Sherlockアプリケーションが名称を使ったテキスト・エンコーディングの解釈ができない可能性もあります。そのような場合、検索プラグインの作者は、resultEncodingを使って、問い合わせの答えに用いるキャラクタ・エンコーディングを明示的に指定することができます。resultEncoding属性に指定する値はファイルで定義された任意の整数定数を指定することができます。同様に、resultTransationEncodingは、処理を進める前にドキュメントを変換するテキストエンコーディングを指定するために使われます。この属性で使われる値もまたからの整数の定数です。

例えば、検索サイトから戻ってきた結果のページが"euc-jp"キャラクタセット(では"euc-jp"はkTextEncodingEUC_UP=2336で定義されています)でエンコードされていて、Mac Japanese(>TextCommon.h>ではkTextEncodingMacJapanese=1で定義されている)に変換し、"Osaka"フォントで表示したいとすると、以下のキャラクタ変換の値を指定します。


<interpret resultEncoding = 2336 resultTranslationEncoding = 1 resultTranslationFont = "Osaka" >


INTERPRETタグはオプションで、またINTERPRETタグ内の属性もオプションです。SEARCHブロックにINTERPRETタグがない場合、結果ページ全てを結果として取り扱い、Sherlockアプリケーションは、全てのリストをユーザの問い合わせの結果として表示します。



この例は架空のものですが、URLにあるサイトの検索プラグインを作成するものとします。(これを書いている時点で、このサイトは存在しませんが、以下の文はサイトが存在しているかのよう書かれています。サイトがあったとして、そのサイトは牛犬クララに関する情報が検索できるものとします。野犬捕獲員以外の人に、このサイトがどのように役に立つか説明することは、読者への宿題とします。)


ステップ1:最初に、webブラウザを使って検索サイトに行き、webページのHTMLソースを見てください。HTMLのどこかに以下のFORMタグがあると思います。

<form action="http://clarus.apple.com/Titles" method="get" name="Search">

あるいはactionが以下のようにローカルなストリングで指定されているかもしれません。

<form action="/Titles" method="get" name="Search">

actionがローカルストリングで指定されている場合、SEARCHタグのaction属性では、アドレスを前に付けてください。これまでに見つかった情報で、サーチ・ブロックの最初のSEARCHタグを構成することができます。

		<search
			name="Clarus"
			description = "The Clarus Search Site"
			action="http://clarus.apple.com/Titles/"
			method=get>
                        
HTMLソースからactionがhttp://clarus.apple.com/Titles/で、通信に適したmethodがgetであることが決められます。サイトの名前と説明は独自に設定します。


ステップ2:INPUTタグを定義する

インターネット検索サイトがどのような入力を求めているか知る方法は2つあります。最初の方法は手作業で問い合わせを実行して、サーバに送られるURLを観察することです。第2はHTMLを見て情報を発見することです。

問い合わせによる方法。 問い合わせ情報を観察するのは一番簡単な方法です。例えば、webブラウザで検索サイトに行き、問い合わせ文字列"coffee"とタイプし検索を開始すると、下のようなURLを観察することができます。

http://clarus.apple.com/Titles?qt=coffee&nh=10

ここから入力を見つけることができます。入力は"?"の後にあり、アンパサント文字[&]で分けられています。この問い合わせでは入力は以下のようになります。
qt=coffee
nh=10
この情報を使って、以下の2つのINPUTタグを作ることができます。
<input name="qt" user>
<input name="nh" value="10">
検索サイトでは、その他のパラメータが利用できる場合があるので、別のオプションや問い合わせを指定してみると、多くの有益な情報が得られるでしょう。

HTMLによる方法。 入力のURLが見られない場合、HTMLソースを調べなければなりません。さて、入力の記述を決めるため、検索サイトのwebページにあるINPUTタグをさがしましょう。例えば、以下のような形式であったとします。
<form action="/Titles" method="get" name="Search">
<table width="100%" cellspacing=0 cellpadding=3 border=0>
<tr><td colspan=4>
Search</td>
<td align=center><a href="/Help?pg=Help.HTML"><b>Tips</b></a>
</td></tr>
<tr><td colspan=5>
<input type="text" name="qt" value="" size="25" MAXLENGTH=255>
</td></tr>
<INPUT TYPE=hidden NAME="nh" VALUE="10">
</table>
</form>
<form>タグと</form>タグの間に検索エンジンにアクセスするために利用する2つのinputがあります。

<input type="text" name="qt" value="" size="25" MAXLENGTH=255>
<INPUT TYPE=hidden NAME="nh" VALUE="10">

再び、この情報を使って、以下の二つの入力タグが構成できます。

<input name="qt" user>
<input name="nh" value="10">

これらの入力パラメータや異なったタイプの問い合わせURLを書いて実験すると、その意味や使用法に関して、有益な情報が得られます。例えば、何種類かの問い合わせURLを書いてみると、nhが問い合わせの応答の中のヒットの数であることが発見できます。一度に10ヒットではなく25ヒットを見たいとすると入力を以下のように変更します。

<input name="qt" user>
<input name="nh" value="25">

さて、入力が決まり充分な情報が得られたので、検索プラグイン・ファイルが完成できます。

<search
name="Clarus Test"
description = "The Clarus Search Site"
action="http://clarus.apple.com/Titles/"
method=get>
<input name="qt" user>
<input name="nh" value="25">
</search>

問い合わせを送り結果を表示することはできましたが、INTERPRETタグがないので正しく表示されない可能性があります。正しく表示させるためにはINTERPRETタグを追加しなければなりません。


ステップ3:INTERPRETタグで結果を表示する

インターネット検索エンジンの応答のなかのデリミタを見つけるには、いくつかの問い合わせをし、その応答のHTMLソースを調べる必要があります。このデータから応答情報の必要な部分を区切るテキスト・パターンを見つけることができます。例えば以下のものが問い合わせに対する応答であると仮定します。


リスト2 問い合わせに対するHTML応答のサンプル
<HTML>
<HEAD><TITLE>Sample Results</TITLE></HEAD>
<BODY>
      
<A HREF="http://www.apple.com">
<IMG SRC="http://www.apple.com/main/elements/apple.gif"
 ALT="Apple Computer"
</A>
?<P>
<SMALL>90%</SMALL>
<A HREF="http://www.apple.com/hotnews/">Hot News</A> 
Apple Hot News - http://www.apple.com/hotnews
<BR><A HREF="http://www.apple.com">Apple Computer</A>
</P>
<P>
<SMALL>85%</SMALL>
<A HREF="http://www.apple.com/products/">Apple Products</A>
 
Apple - Products - http://www.apple.com/products
<BR><A HREF="http://www.apple.com">Apple Computer</A>
</P>
</BODY>
</HTML>
                        


この情報から、バーナー・セクションは以下のようにテキストパターン"<BODY>"と"<P>"で区切られることが分かります。

bannerStart="<BODY>"
bannerEnd="<P>"

結果のリストは""と"<BODY>"で区切られています。

resultListStart="</A>"
resultListEnd="</BODY>"

結果のリストのなかのそれぞれの項目はテキストパターン"<P>"と"</P>"でくくられています。

resultItemStart="<P>"
resultItemEnd="</P>"

それぞれの項目の適切度は"<SMALL>"と"</SMALL>"で括られています。

relevanceStart="<SMALL>"
relevanceEnd="</SMALL>"

これらを合わせて、検索プラグインを完成させると以下のようになるでしょう。

	<search
		name="Clarus Test"
		description = "The Clarus Search Site"
		action="http://clarus.apple.com/Titles/"
		method=get>
	<input name="qt" user>
	<input name="nh" value="25">
	<interpret
		bannerStart="<BODY>"
		bannerEnd="<P>"
		resultListStart="</A>"
		resultListEnd="</BODY>"
		resultItemStart="<P>"
		resultItemEnd="</P>"
		relevanceStart="<SMALL>"
		relevanceEnd="</SMALL>">
	</search>
                        
インターネット・サーチとXMLでの検索結果
検索エンジンはExtensible Makeup language(XML)などのマシン可読な形式のインターフェースを提供することもできます。


リスト3. XMLドキュメントのサンプル
<searchResponse>
 <advertisement>
  <a href="http://www.advertiser.com">
  <img src="ad.gif">
  </a>
 </advertisement>
? <searchResults>
  <resultItem>
   <b><relevance>67%</relevance></b>
   <link><a href="http://www.foo.com">Title</a></link><br/>
   <summary>Summary</summary>
  </resultItem> 
 </searchResults>
</searchResponse>
                        


このドキュメントを作っている時点で、XMLの仕様は開発中ですが、現状での標準を使っても、XMLでの結果のリストを解釈する検索プラグインは、簡単に構成することができます。例えば、下のINTERPRETタグは、リスト3に示したXMLドキュメントを解釈する検索プラグインで、検索プラグインをどのように設定するかの参考になると思います。

	<interpret
		bannerStart = "<advertisement>"
		bannerEnd = "<</advertisement>"
		resultListStart = "<<searchResults>"
		resultListEnd = "</searchResults>"
		resultItemStart = "<resultItem>"
		resultItemEnd = "</resultItem>"
		relevanceStart = "<relevance>"
		relevanceEnd = "</relevance>">
                        


サイト管理者へのヒント

コメント風のデリミタ(区切り記号)

Sherlockアプリケーションは、検索プラグインの中の情報を利用して、インターネット検索サイトからのHTMLでの結果の情報を抜き出します。特に、検索プラグインの情報は、応答情報の中でバーナー情報と検索結果の区切りを見つけるために使われます。Sherlockアプリケーションが一貫して結果を見つけ、表示を続けていくためには、検索サイトと検索プラグイン・ファイルで指定された形式との同期がとれているか否かが重要です。検索プラグイン・ファイルで指定された属性が、上の例のような少数の結果ファイルで見られる内部的な属性に依存しているとすると、検索サイトが生成した結果ページの形式が、ほんの少しだけ変化しただけで非同期が発生してしまいます。この問題を避けるために、検索サイトの管理者には、コメント・テキストをデリミタとして使いことをすすめます。そうすることで、検索プラグイン・ファイルは、コメント・テキストをデリミタとして使用できるので、現在そのサイトにアクセスしている検索プラグイン・ファイルが動かなくなるというリスク無しに、結果ページに含むHTMLの形式を変更することができます。例えば、下のINTERPRETタグでリスト4で示されるHTML応答情報を解釈することができます。


	bannerStart="<!-- BANNER START -->"
	bannerEnd="<!-- BANNER END -->"
	resultListStart="<!-- RESULT LIST START -->"
	resultListEnd="<!-- RESULT LIST END -->"
	resultItemStart="<!-- RESULT ITEM START -->"
	resultItemEnd="<!-- RESULT ITEM END -->"
	relevanceStart="<!-- RELEVANCE START -->"
	relevanceEnd="<!-- RELEVANCE END -->"
	                        
これらのテキストデリミタを使って、検索プロバイダは、現在使用している検索プラグイン・ファイルが動かなくなる心配なしに、応答ページに自由に形式情報を追加することができます。全ての検索サイト・プロバイダがこの方法で検索プラグイン・ファイルを作成するよう強く奨めます。


リスト4.デリミタコメントを問い合わせを含む簡単なHTML応答
<HTML>
<HEAD><TITLE>Sample Results</TITLE></HEAD>
<BODY>
?<!-- BANNER START -->
<A HREF="http://www.apple.com">
<IMG SRC="http://www.apple.com/main/elements/apple.gif"
 ALT="Apple Computer"
</A>
<!-- BANNER END -->
?<!-- RESULT LIST START -->
?<!-- RESULT ITEM START -->
<P>
<SMALL>
<!-- RELEVANCE START -->
90%
<!-- RELEVANCE END -->
</SMALL>
<A HREF="http://www.apple.com/hotnews/">Hot News</A> 
Apple Hot News - http://www.apple.com/hotnews
<BR><A HREF="http://www.apple.com">Apple Computer</A>
</P>
<!-- RESULT ITEM END -->
?<!-- RESULT ITEM START -->
<P>
<SMALL>
<!-- RELEVANCE START -->
85%
<!-- RELEVANCE END -->
</SMALL>
<A HREF="http://www.apple.com/products/">Apple Products</A>
 
Apple - Products - http://www.apple.com/products
<BR><A HREF="http://www.apple.com">Apple Computer</A>
</P>
<!-- RESULT ITEM END -->
?<!-- RESULT LIST END -->
?</BODY>
</HTML>
                        

バーナー・アド(Banner Advertizements)
>BR? Sherlockアプリケーションはバーナー・セクションの最初に見付かったHTMLアンカー(すなわちハイパーテキストジャンプとイメージを含むもの)をバーナーイメージとして使います。最良の結果を得るためには、バーナー・アドは、ハイパーテキスト・ジャンプ(HREF属性)と、SRC属性とできればALT属性を含むIMGタグの両方を含む、HTMLアンカーで囲まれるべきです。例えば、下に示すHTMLアンカーをバーナー・アドの形式として奨めます。

<A HREF="http://www.apple.com">
<IMG SRC="http://www.apple.com/main/elements/apple.gif"
ALT="Apple Computer"
</A>


結果リスト
検索結果を解釈するとき、Sherlockアプリケーションは、ハイパーテキスト・ジャンプ属性を含むHTMLアンカーを探して結果を認識します。ハイパーテキスト・ジャンプ(HREF属性)を含むアンカーが、resultItemStartとresultItemEndまたはresultItemStartの間のテキストに少なくともひとつ現れなければなりません。Sherlockアプリケーションは、そのようなテキスト・パターンの間のHTMLの解釈をし、また少なくともひとつはそのようなアンカーがあると思っています。


インターネット検索インターフェース言語のBNF
タグは全て、大文字小文字の区別をせず、空白は無視されます。

<search-interface>   ::= <search-start> <input-interp-list> <search-end>

<search-start>       ::= "<search " (<search-attribute> <req-S>)* ">"
<search-attribute>   ::= <name> | <method> | <action> | <update> | 
                         <updateCheckDays> | <description> |
                         <banner-link> | <banner-image>
<name>               ::= "name" <attrib-assign>
<method>             ::= "method" <attrib-assign>
<action>             ::= "action" <attrib-assign>
<update>             ::= "update" <attrib-assign>
<updateCheckDays>    ::= "updateCheckDays" <attrib-assign>
<description>        ::= "description" <attrib-assign>
<banner-link>        ::= "bannerlink" <attrib-assign>
<banner-image>       ::= "bannerimage" <attrib-assign>


<input-interp-list>  ::= <input>* <interpret>? <input>*
<input>              ::= "<input " (<input-attribute> <req-S>)* ">"
<input-attribute>    ::= <name> | <value> | <user-select>
<value>              ::= "value" <attrib-assign>
<user-select>        ::= "user"

<interpret>          ::= <interpret " (<interpret-attribute> <req-S>)* ">"
<interpret-attribute>::= <rl-start> | <rl-end> | <ri-start> | <ri-end>
                         <banner-start> | <banner-end> | <rel-start> |
                         <rel-end> | <skip-local>
<rl-start>           ::= "resultListStart" <attrib-assign>
<rl-end>             ::= "resultListEnd" <attrib-assign>
<ri-start>           ::= "resultItemStart" <attrib-assign>
<ri-end>             ::= "resultItemEnd" <attrib-assign>
<banner-start>       ::= "bannerStart" <attrib-assign>
<banner-end>         ::= "bannerEnd" <attrib-assign>
<rel-start>          ::= "relevanceStart" <attrib-assign>
<rel-end>            ::= "relevanceEnd" <attrib-assign>
<skip-local>         ::= "skipLocal"

<attrib-assign>      ::= <opt-S> "=" <opt-S> <attrib>
<attrib>             ::= <quotestr> | <doublequotestr> | <noquotestr>
<quotestr>           ::= '\'' [^']* '\''
<doublequotestr>     ::= '"' [^"]* '"'
<noquotestr>         ::= [^ ]*
<req-S>              ::= (#x20 | #x09 | #x0D | #x0A)+
<opt-S>              ::= (#x20 | #x09 | #x0D | #x0A)*
                        

AppleScriptのサポート
Sherlockアプリケーションが提供している新しい検索機能はAppleScriptのスクリプトからアクセスすることができます。AppleScriptのスクリプトは、いくつかの検索サイトを使ったインターネット検索をSherlockアプリケーションに依頼することができ、また内容を指定して、ローカルあるいはリモートにあるボリュームの中のファイルを探すことができます。さらにAppleScriptのスクリプトはSherlockアプリケーションに検索結果を表示させることができます。


インターネットで探す
インターネットによる検索には"search Internetコマンドを使います。"search Internet"コマンドを使うとAppleScriptは問い合わせに関する情報とともに、検索に使うインターネット検索サイトを指定することができます。問い合わせの情報は文字列として指定することも、問い合わせ情報を持っているファイルへの参照で指定することもできます(が同時に両方を指定することはできません)。検索の結果は、文字列によって返されますが、Searlockアプリケーションに結果を表示させるように指定することもできます。定義1はSherlockアプリケーションのAppleScriptディクショナリの"search Internet"エントリです。


定義1 Sherlockアプリケーションの"search Internet"ディクショナリ

 search Internet: Search the Internet

	search Internet string -- the Internet sites to search, optional

		[for string] -- the text to look for...
		[using alias] -- ...or a saved Find file containing the query
		[display boolean] -- Specifies whether or not to display
		the result (default is without display)

	Result: string -- the URLs that match the query
		

"for"と"using"パラメータは、お互いに排他的で1つのコマンドで同時に使うことはできません。問い合わせ情報は、文字列で指定するかファイルの中で指定するかのどちらかです。displayパラメータがtrueの場合、Sherlockアプリケーションが検索の結果を表示します。

このコマンドへの直接オブジェクトは、インターネット検索サイト名のリストです。インターネット検索サイトの名前の指定がなく、"for string"パラメータが使われた場合、直前のインターネット検索で使われたものと同じサイトが検索に使われます。インターネットサイトのリストは"using alias"パラメータで指定された場合は無視されます。


ファイルを探す
Sherlockアプリケーションの、内容による検索機能にアクセスするために、2つのAppleScriptコマンドが提供されています。最初のコマンドでAppleScriptのスクリプトは内容の基にしてファイルを探すことができ、第二のコマンドでAppleScriptのスクリプトは、内容による検索で使うインデックスを特定のボリュームに作成したり、更新したりすることができます。"search"コマンドに対するAppleScriptディクショナリ・エントリが定義2に示され、"index volume"コマンドが定義3に示されています。


 search: Search disks or servers

	search alias -- the volumes or folders to search, optional

		[for string] -- the text to look for...
		[similar to alias] -- ...or file(s) containing text for Find
		by Content...
		[using alias] -- ...or a saved Find file containing the query
		[display boolean] -- (default is without display) Specifies
		whether or not to display the result

	Result: alias -- the files that match the query
                        


"search"コマンドで"for"パラメータ、"similar to"パラメータと"using"パラメータは互いに排他的なパラメータで、同じコマンドで同時に使うことはできません。

インターネット検索コマンドと同様に"using"パラメータを使うと、問い合わせ情報を問い合わせ文字列ではなくファイルにより指定することができます。そのためのファイルは、Sharlockアプリケーションのファイルメニューの"Save Search Criteria"を使って作ることができます。 Searchコマンドの直接オブジェクトは検索するボリュームあるいはフォルダのリストです。"search for"パラメータあるいは"search similar to"パラメータが使用された場合、"search"コマンドは全てのインデックスを持つローカルボリュームを検索します。"using"パラメータが指定された場合、ボリュームのリストは無視されます。


ボリュームはインデックスがなければ、内容による検索機能でのボリュームの検索はできません。インデックス・ファイルはボリュームのルートディレクトリにある"TheFindByContentFolder"と呼ばれる見えないフォルダに保存されていて、内容による検索を実行するための必要な情報を持っています。ボリュームにインデックスがなければ、内容による検索機能を使った検索はできません。AppleScriptのスクリプトはSherlockアプリケーションに、いくつかのボリュームのインデックスファイルの更新あるいは作成を依頼することができます。


定義3.Sherlockアプリケーションの"index volumes"ディクショナリエントリ
 index volumes: Create or update the index(es) of the specified volume(s)

	index volumes alias -- list of volumes


kAEOpenDocumentsアップルイベントのパラメータの追加
アプリケーションに対して、ユーザが興味を持つドキュメントを選択して表示するために有用な情報を提供するために、内容による検索によって探し出されたファイルを、ユーザがSherlockアプリケーションのウィンドのひとつからそれを開いたとき、Sherlockアプリケーションはそのファイルの検索に関する情報を、ファイルを開くためのkAEOpenDocuments('odoc')アップルイベントに挿入します。SherlockアプリケーションはkAEOpenDocumentsアップルイベントを受け取ったとき、ドキュメントを持っているアプリケーションをランチしてイベントをアプリケーションに送ります。このタイプのkAEOpenDokumentsアップルイベントはkeyAEPropData(AERegitry.hで定義されています)パラメータを含んでいます。keyAEPropDataパラメータにはキーワード'srwd'で識別される属性があり、そこにはファイルを探すときに使った元の問い合わせ文字列が含まれています。'srwd'属性はCスタイルの文字列です。

リスト5 'odoc'アップルイベントから検索語を取り出す。
OSErr GetSearchWordsFromAppleEvent(AppleEvent* inAppleEvent,
                                      char* theText, long *maxLength)
{
    OSErr err;
    AERecord propData;
    DescType outType;
   
        /* set up our variables */
    AECreateDesc(typeNull, NULL, 0, &propData);
    if (maxLength == NULL || theText  == NULL) return paramErr;
    if (*maxLength > 255) return paramErr;
   
        /* get the property data from the Apple event */
    err = AEGetParamDesc(inAppleEvent,
                    keyAEPropData, typeAERecord, &propData);
   
        /* extract the search words information */
    if (err == noErr)
        err = AEGetKeyPtr(&propData, 'srwd', typeChar,
                    &outType, theText, *maxLength, maxLength);
   
        /* clean up and return */
    AEDisposeDesc(&propData);
    return err;
}
			

リスト5の例では、アプリケーションがkAEOpenDocumentsアップルイベントから問い合わせ情報を抜き出す方法を示しています。ここでルーチンはkeyAEPropDataパラメータを抜き出そうとしていて、属性データから'srwd'情報を引き出そうとしています。問題がなく、'srwd'データが存在している場合、元の問い合わせテキストはtheTextで指されるバッファに返され、maxLengthに文字列の長さ(末尾のゼロのバイトも含む)が設定され、関数はnoErrを返します。

この追加されたバラメータは、アプリケーションがInside Macintosh:Interapplication Communicationの"Respoinding to Apple Events"の章に定めてあるガイドラインに沿って作られている限り、そのアプリケーションの動作に影響を与えません。しかし、アプリケーションにあるその新しい情報は、ユーザが最初に見たいドキュメントの場所の手がかりなので、うまく利用すると便利です。kAEOpenDocumentsアップルイベントに'srwd'情報があると言うことは、ユーザが内容による検索を行い、検索で見付かったファイルのリストからファイルを選択して開いたということを示しています。例えば、アプリケーションはその語が文字列にあれば、その全てをハイライト(強調表示)し、その最初の部分を見せることもできるし、あるいはいくつかの問い合わせ項目をもつ、その語に関する検索ウィンドを表示することもできます。

しかしながら、開いたドキュメントの中に、それらの語が必ずしも現れるわけではありません。問い合わせフレーズを元にした通常の検索では、内容による検索は問い合わせの中の語がいくつかあるファイルを見つけだします。しかし、ユーザが前に検索したファイルのうちから、いくつかのドキュメントを選び、"似ている(Similar)"ドキュメントを要求した場合、見付かったドキュメントのうちには、元の検索で指定された語のないものもある可能性があります。'srwd'属性にアクセスするデベロッパは問い合わせ文字列の中のキーの全てが、開いているドキュメントにあるわけではないことを考慮に入れてください。



内容による検索
Mac OS 8.5で提供された内容に検索(Find by Content,FBC)機能は"機能拡張(Extensions)"フォルダにあるPowerPCコード・フラグメント・マネージャのライブラリにより実現されています。SherlockアプリケーションはFBCのクライアントで、このシェアド・ライブラリによりFBCが提供する機能にアクセスします。この章では、このシェアド・ライブラリを使って、デベロッパがFBCにアクセスする製品を作る方法を解説します。

FBCへのコンパイラ・インターフェースはCヘッダファイルにあります。またリンク用のコード・フラグメント・マネージャ・ライブラリは"Find By Content"(引用符無し)という名称です。ここで説明しているFBCルーチンを使う場合、このライブラリに対して弱リンク(weak-link)する必要があり、またアプリケーションは、この中のルーチンを呼ぶ前にGestaltセレクタをチャックしなければなりません。


内容による検索が利用できるかどうか決定する
FBCは2つのGestaltセレクタを定義しています。FBCのクライアントはFBCに対するコールをする前に、正しいバージョンが利用できるか検証しなければならず、また検索を行う前にはFBCのインデックスの状態をチェックするはずです。

	enum
	{
		gestaltFBCVersion = 'fbcv',
		gestaltFBCCurrentVersion = 0x0011
	};
                        

gestaltFBCVersion セレクタはコンピュータにインストールされたFBCのバージョンを返します。デベロッパはこのバージョンと gestaltFBCCurrentVersion を使って、プログラムをコンパイルした時のインターフェースのバージョンを比較して、安全にFBCを呼ぶことができるかを判断できます。gestaltFBCVersion で得たバージョンと、デベロッパがアプリケーションをコンパイルした時のインターフェースのバージョンが異なる場合、アプリケーションはFBCをコールすることはできません。

	enum
	{
		gestaltFBCIndexingState = 'fbci',
		gestaltFBCindexingSafe = 0,
		gestaltFBCindexingCritical
	};
                        

gestaltFBCIndexingState セレクタはFBCのインデックスの現在の状態に関する情報を返します。任意の時点で、インデックスの状態は gestaltFBCindexingState であるか gestaltFBCindexingCritical であるかのどちらかです。gestaltFBCindexingCritical の状態の場合、検索は gestaltFBCindexingSafe に戻るまで同期待ちの状態に陥ります。FBCのインデックスの状態が gestaltFBCindexingSafe の場合、検索は即座に実行されます。同期待ちを避けるため、gestaltFBCindexingState セレクタをチェックして、インデックスの状態 がgestaltFBCindexingSaf eの時にFBCをコールすべきです。


サーチ・セッションを使う
FBCのクライアント・アプリケーションは"サーチ・セッション(search session)"のオープンとクローズができます。サーチ・セッションは検索に関する全ての情報を持ち、特にその中には検索完了時にマッチしていたファイルのリストが含まれます。FBCのクライアントは、セッションに対して定義されたルーチンを使って、サーチ・セッションの参照を得て、それらを変更したり、その状態を問い合わせることができます。
サーチ・セッションに対する参照はFBCライブラリのopaqueポインタ型として定義されています。

	typedef struct OpaqueFBCSearchSession* FBCSearchSession;
                        
デベロッパがサーチ・セッションの構造にアクセスする場合、ここで定義されたルーチンを必ずつかわなければなりません。この中にはサーチ・セッションの複製や廃棄のためのFBCルーチンも含まれています。サーチ・セッションは複雑なメモリ構造でポインタやその他のデータを含み、サーチ・セッションを複製する場合には、それらをコピーしなければならず、またサーチ・セッションを解放するときには廃棄しなければなりません。

FBCライブラリを使用するとき、通常の動作手順では、サーチ・セッションを生成し、特定のボリューム向けにサーチ・セッションを構成し、検索を行い、検索結果を問い合わせ、そしてサーチを廃棄します。他に考えられるケースとして例えばサーチ・セッションの再初期化を行って、それを他の検索に使ったり、サーチ・セッションの複製によって後戻りして、さらにクローンを作って別の検索を行ったり、あるいは検索結果をある特定のディレクトリに制限したりなどがあります。

サーチ・セッションの準備
新しいサーチ・セッションを作成して検索の準備をするには、リスト6で示されるように少なくとも2つのFCBライブラリへのコールが必要です。この例では、新しいサーチ・セッションが作成され、それがインデックスファイルを含む全てのローカルボリュームの検索向けに構成されます。FBCAddAllVomlumesToSessionを呼ぶことでサーチ・セッションは、全てのインデックス付きボリュームの検索用に構成されます。


リスト6 サーチ・セッションを全てのインデックス付きのローカルボリューム用に準備する。
/* SimpleSetUpSession allocates a new search session and
    returns a FBCSearchSession value in the *session
    parameter. if an error occurs, *session is left
    untouched. */
            
OSErr SimpleSetUpSession(FBCSearchSession* session)
{
    OSErr err;
    FBCSearchSession newsession;
   
        /* set up our local variables */
    err = noErr;
    newsession = NULL;
    if (session == NULL) return paramErr;
   
        /* create the new session */
    err = FBCCreateSearchSession(&newsession);
    if (err != noErr) goto bail;
   
        /* search all available local volumes */
    err = FBCAddAllVolumesToSession(newsession, false);
    if (err != noErr) goto bail;
   
        /* store our result and leave */
    *session = newsession;
    return noErr;
   
bail:
    if (newsession != NULL)
        FBCDestroySearchSession(newsession);
    return err;
}
                                


FBCが提供するルーチンにより、デベロッパはサーチ・セッションを使うことで、どのボリュームを検索するか制御することができます。リスト7は、どのようにしたら新しいサーチ・セッションが特定のボリュームの集合向けに構成されるかを示しています。


リスト7 特定のボリュームの集合用にサーチ・セッションを準備する。
/* SetUpVolumeSession allocates a new search session and
    returns a FBCSearchSession value in the *session parameter.
    if vCount is not zero, then vRefNums points to an array of
    volume reference numbers for volumes that are to be searched.
    if any of the vRefNums refer to a volume without an index,
    paramErr is returned.  */
            
OSErr SetUpVolumeSession (FBCSearchSession* session,
                            UInt16 vCount, SInt16 *vRefNums)
{
    OSErr err;
    UInt16 i;
    FBCSearchSession newsession;
   
        /* set up our local variables */
    err = noErr;
    newsession = NULL;
    if (vCount == 0) return paramErr;
    if (session == NULL) return paramErr;
    if (vRefNums == NULL) return paramErr;
   
        /* create the new session */
    err = FBCCreateSearchSession(&newsession);
    if (err != noErr) goto bail;
   
        /* search the volumes specified in vRefNums */
   
    for (i=0; i
                        


この例では、FBCAddVolumeToSessionルーチンがサーチ・セッションにボリュームと追加するために使われています。現在のサーチ・セッションが対象としているボリュームを問い合わせるルーチンとリストからボリュームを取り除くルーチンも示されています。

ひとたび、いくつかのボリュームを検索するサーチ・セッションが構成されると、検索が実行された後に再利用する場合にも、対象ボリュームを再構成する必要はありません。検索が行われて結果を調べた後、FBCReleaseSessionHitsを呼んで、そのサーチ・セッションを他の検索用に準備させることができます。このルーチンは対象のボリュームのリストを残したままで、最後の検索の検索結果を解放します。

FBCCloneSearchSessionルーチンを使ってサーチ・セッションのコピーを作ると、対象ボリュームのリストも複製されたうえでコピーされます。

検索の実行


リスト8 インデックス付きの全てのローカルボリュームのサーチによる問い合わせ
OSErr SimpleFindByQuery (char *query, FBCSearchSession *session)
{
    OSErr err;
    FBCSearchSession newsession;
	
        /* set up locals, check parameters... */
    if (query[0] == 0) return paramErr;
    if (session == NULL) return paramErr;
    newsession = NULL;
	
        /* allocate a new search session */
    err = SimpleSetUpSession(&newsession);
    if (err != noErr) goto bail;
	
        /* Here is the call that does the actual search,
        storing the results in the search session. */
    err = FBCDoQuerySearch(newsession, query,
                                   NULL, 0, 100, 100);
    if (err != noErr) goto bail;
	
        /* save the results and return */
    *session = newsession;
    return noErr;
	
bail:
    if (newsession != NULL)
        FBCDestroySearchSession(newsession);
    return err;
}
                                

FBCDoExampleSearchルーチンあるいはFBCBlindExampleSearchを使って行った検索では、他のファイルと似ているファイルを探し出すことができます。類似検索は、例として指定されたファイルと内容が類似しているファイルを探し出します。例(example)は、事前の検索で得られたヒットを参照することもでき、またディスクのファイルを参照するFSSpecレコードのリストで指定することもできます。

3つのサーチルーチン--FBCDoExampleSearch,FBCBlindExampleSearchとFBCDoQuerySearch--は、検索結果をいくつかのディレクトリにあるファイルだけに制限する機能を持っています。このためには、クライアントは対象とするディレクトリを参照するFSSpecレコードのリストを準備します。リスト9の例は、特定のディレクトリの集合に検索の結果を制限する方法を示しています。

リスト9 特定のディレクトリ集合の検索
enum {
    kMaxVols = 20,
    maxHits = 10,
    maxHitTerms = 10
};
   
OSErr RestrictedFindByQuery (char *query, UInt16 dirCount,
                                  FSSpec* dirList,
                                      FBCSearchSession* session)
{
    UInt16 vCount, i;
    SInt16 vRefNums[kMaxVols], normalVol;
    FBCSearchSession newsession;
   
    vCount = 0;
    newsession = NULL;
    if (dirList == NULL || dirCount == 0) return paramErr;
    if (query == NULL) return paramErr;
    if (*query == 0) return paramErr;
    if (session == NULL) return paramErr;
   
        /* collect all of the unique volume reference numbers
        from the list of FSSpecs provided in the parameters. */
    for (i=0; i>dirCount; i++) {
        Boolean found;
        HParamBlockRec pb;
   
            /* ensure the vRefNum is a volume
            reference number */
        pb.volumeParam.ioVRefNum = dirList[i].vRefNum;
        pb.volumeParam.ioNamePtr = NULL;
        pb.volumeParam.ioVolIndex = 0;
        if ((err = PBHGetVInfoSync(&pb)) != noErr) goto bail;
        normalVol = pb.volumeParam.ioVRefNum;
   
            /* make sure it's not already in the list */
        for (found = false, j=0; j<vCount; j++)
            if (vRefNums[j] == normalVol) {
                found = true;
                break;
            }
   
            /* add the volume to the list */
        if (!found && vCount < kMaxVols)
            vRefNums[vCount++] = normalVol;
    }
   
        /* set up a session to use the volumes we found */
    err = SetUpVolumeSession(&newsession, vCount, vRefNums);
    if (err != noErr) goto bail;
   
        /* Here is the call that does the actual search,
        storing the results in the search session. */
    err = FBCDoQuerySearch(newsession, (char*)queryTxt,
                    dirList, dirCount, maxHits, maxHitTerms);
    if (err != noErr) goto bail;
    
        /* save the result and return */
    *session = newsession;
    return noErr;
   
bail:
    if (newsession != NULL)
        FBCDestroySearchSession(newsession);
    return err;
}
                                


ここで、対象のディレクトリを参照するFSSpecレコードの配列から抽出されたボリューム参照眼号が、サーチ・セッションによる検索のためのボリュームを構成するためのパラメータとして使われています。それから、対象となるディレクトリのリストがFBCDoQuerySearchにパラメータとして渡されます。

サーチ・セッションから情報を取り出す
サーチ・セッションを使って検索を行った後には、サーチ・セッションにはマッチしたファイルに関するいくつかの情報が含まれています。クライアントはファイルのFSSpecレコード、ファイルにマッチした語、最後の検索操作の間にファイルに割り当てられた"点数(score)"、そしてファイルに関するその他の情報を含んだ、個々のヒットの情報にアクセスすることができます。リスト10は、検索の結果として返されたヒットに関する情報をどのように得るかを示しています。

リスト10 サーチ・セッションで見つかった全てのファイルを列挙する。
   typedef OSErr (*HitProc) (FSSpec theDoc,
                             float score,
                             UInt32 nTerms,
                             FBCWordList hitTerms);
   
/* SampleHandleHits can be called after a search to enumerate
    the search results.  For each search hit, the hitFileProc
    function parameter is called with information describing
    the target.  */
OSErr SampleHandleHits (FBCSearchSession session,
                                   HitProc hitFileProc)
{	
    OSErr err;
    UInt32 hitCount, i;
    FSSpec targetDoc;
    float targetScore;
    FBCWordList targetTerms;
    UInt32 numTerms;
   
        /* set up locals, check parameters */
    targetTerms = NULL;
    if (hitFileProc == NULL) return paramErr;
    if (session == NULL) return paramErr;
   
        /* count the number of hits in this session */
    err = FBCGetHitCount(session, &hitCount);
    if (err != noErr) goto bail;
   
        /* iterate through the hits */
    for (i = 0; i < hitCount; i++) {
   
            /* get the target document's FSSpec */
        err = FBCGetHitDocument(session, i, &targetDoc);
        if (err != noErr) goto bail;
   
            /* get the score for this document */
        err = FBCGetHitScore(session, i, &targetScore);
        if (err != noErr) goto bail;
   
            /* get a list of the words matched in 
            this document */
        numTerms = maxHitTerms;
        err = FBCGetMatchedWords(session, i, &numTerms,
                                            &targetTerms);
        if (err != noErr) goto bail;
   
            /* call the call back routine provided as a
            parameter to do something with the information. */
        err = hitFileProc(&targetDoc, score, numTerms,
                                            targetTerms);
        if (err != noErr) goto bail;
   
            /* clean up before moving to the next iteration. */
        FBCDestroyWordList(targetTerms, numTerms);
        targetTerms = NULL;
   
    }
	
    return noErr;
	
bail:
    if (targetTerms != NULL)
        FBCDestroyWordList(targetTerms, numTerms);
    return err;
} 
                               


内容による検索(Find By Content)リファレンス
この章では、PowerPC FBCライブラリに対するCMFベースのインターフェースを説明します。これらのルーチンを使うPowerPCアプリケーションは"Find By Content"(引用符無し)というライブラリに対してリンクします。


データタイプ
FBCは以下のデータタイプを提供します。これらのデータタイプに対する記憶管理機能もFBCが提供しています。クライアントがメモリ・マネージャを使ってこれらの構造を割り当てたり、解放したりすることは禁止されています。

	FBCSearchSession

		typedef struct OpaqueFBCSearchSession* FBCSearchSession;
                        

FBCにより作成されたサーチ・セッションを参照するポインタ変数のタイプです。クライアントはこのデータを直接アクセスしたり、変更したりしてはいけません。


	FBCWordItem

		typedef char* FBCWordItem;
                        

通常のC文字列。このタイプはサーチ・セッションのヒットから情報を取り出すために使われます。
	FBCWordList

		typedef FBCWordItem* FBCWordList;
                        

WordItemsの配列。このタイプはサーチ・セッションのヒットから情報を取り出すために使われます。


サーチ・セッションの割り当てと初期化
以下のルーチンをサーチ・セッションの割り当てと解放に使います。サーチ・セッションが占める記憶域はFBCライブラリが所有します。また、サーチ・セッションを割り当て、コピーし、放棄するには必ずこれらのルーチンを使ってください。

	FBCCreateSearchSession

	OSErr FBCCreateSearchSession(
			FBCSearchSession* searchSession);

	searchSessionはFBCSearchSession型の変数を指します
                        

FBCCreateSearchSessionは新しいサーチ・セッションを割り当て、それへの参照をsearchSessionで指される変数に返します。

	FBCDestroySearchSession

	OSErr FBCDestroySearchSession(
			FBCSearchSession theSession);
                        

theSessionはサーチ・セッションを指します。

FBCDestroySearchSessionは、サーチ・セッションで占有された記憶域を返却します。

	FBCCloneSearchSession

	OSErr FBCCloneSearchSession(
		FBCSearchSession original,
		FBCSearchSession* clone);

	originalはサーチ・セッションを指します。

	cloneはFBCSearchSession型の変数を指します。
                        

FBCCloneSearchSessionは新しいサーチ・セッションを生成し、それへのポインタをcloneパラメータで指される変数に保存します。元のサーチ・セッション(original)からの情報は新しいセッションにコピーされますが、サーチ・セッションの対象のボリュームと事前のサーチで見つかったヒットがあれば、それも含まれます。


サーチ・セッションを構成する
サーチ・セッションを特定のボリュームの集合の検索に制限することができます。これらのルーチンによってクライアントは、FBCを使って特定のボリュームを検索することができます。

	FBCAddAllVolumesToSession

	OSErr FBCAddAllVolumesToSession(
			FBCSearchSession theSession,
			Boolean includeRemote);
                        
theSessionはサーチ・セッションを指します。
includeRemoteはブール値です。

FBCAddAllVolumesToSessionはサーチ・セッションをインデックスを持つ全てのマウントされたボリュームを指すように構成します。inlcudeRemoteが真の場合、リモートのボリュームがサーチ・セッションの対象ボリュームのリストに含まれます。インテックの無いボリュームはサーチ・セッションの対象のボリュームに追加されません。

	FBCSetSessionVolumes

	OSErr FBCSetSessionVolumes(
				FBCSearchSession theSession,
				const SInt16 vRefNums[],
				UInt16 numVolumes);
                        
theSessionはサーチ・セッションへのポインタです。
vRefNumはボリューム参照番号(16ビット整数)の配列です。
numVolumesはvRefNum配列のボリューム参照番号の数を含む整数値です。

FBCSetSessionVolumesによりクライアントは、サーチ・セッションの単一のコールの対象となるボリュームのリストに、いくつかのボリュームを加えることができます。

	FBCAddVolumeToSession

	OSErr FBCAddVolumeToSession(
				FBCSearchSession theSession,
				SInt16 vRefNum);
                        
theSessionはサーチ・セッションを指します。
vRefNumはボリューム参照番号です。

FBCAddVolumeToSessionは、サーチ・セッションにより検索されるボリュームのリストに、指定されたボリュームを追加します。

	FBCRemoveVolumeFromSession

	OSErr FBCRemoveVolumeFromSession(
				FBCSearchSession theSession,
				SInt16 vRefNum);
			
theSessionはサーチ・セッションへのポインタです。
vRefNumはボリュームの参照番号です。

FBCRemoveVolumeFromSessionは指定されたボリュームを、サーチ・セッションが検索するボリュームのリストから取り除きます。

	FBCGetSessionVolumeCount

	OSErr FBCGetSessionVolumeCount(
				FBCSearchSession theSession,
				UInt16* count);
			
theSessionはサーチ・セッションを指します。
countは結果が保存される16ビット整数を指します。
FBCGetSessionVolumeCountは、*countにサーチ・セッションが検索するボリュームのリストの中のボリュームの数を返します。
	FBCGetSessionVolumes

	OSErr FBCGetSessionVolumes(
				FBCSearchSession theSession,
				SInt16 vRefNums[],
				UInt16* numVolumes);
			
theSessionはサーチ・セッションを指します。
vRefNumsはボリューム参照番号(16ビット整数)の配列です。
*numVolumesは16ビット整数へのポインタです。入力としては、これはvRefNumsに保存できる要素の数で、出力では実際にvRefNumsに保存された要素の数です。
FBCGetSessionVolumeはサーチ・セッションにより検索されたボリュームのリストをvRefNumで指される配列として返します。*numVolumeは配列に戻されたボリューム参照番号の数が設定されます。


検索を実行する
FBCは、この章で説明する検索を行うための2つの異なったルーチンを提供しています。

	FBCDoQuerySearch

	OSErr FBCDoQuerySearch(
			FBCSearchSession theSession,
			char* queryText,
			const FSSpec targetDirs[],
			UInt32 numTargets,
			UInt32 maxHits,
			UInt32 maxHitWords);
			
theSessionはサーチ・セッションへのポインタです。
queryTextは検索項目を含んでいるC形式の文字列です。
targetDirsはディレクトリを参照するFSSpecレコードの配列を指します。numTargetsがゼロの場合、このパラメータはNULLにセットすることができます。
numTargetsは、targetDirsが指す配列中のFSSpecレコードの数を含んでいます。
maxHits 返されるヒットの最大数
maxHitsWord 報告されるヒット語の最大数

FBCDoQuerySearchは、queryTextで指定された検索項目に基ずく検索を実行します。targetDirsパラメータがある場合(numTargetsがゼロでない)、targetDirsで指定されたディレクトリにあるファイルだけが検索で見つかったヒットとして含まれます。

	BCDoExampleSearch

	OSErr FBCDoExampleSearch(
				FBCSearchSession theSession,
				const UInt32* exampleHitNums,
				UInt32 numExamples,
				const FSSpec targetDirs[],
				UInt32 numTargets,
				UInt32 maxHits,
				UInt32 maxHitWords);
			
theSessionには、サーチ・セッションへのポインタが含まれます。このセッションには事前の検索で生成されたヒットリストを含んでいなければなりません。
exampleHitNumsは32ビット整数の配列です。
targetDirsは、ディレクトリを参照するFSSpecレコードの配列を指します。numTargetsがゼロの場合、このパラメータはNULLに設定することができます。
numTargetsはtargetsDirsで指される配列のFSSpecレコードの数を含みます。
maxHitsは返されるヒットの最大数です。
maxHitwordsは、報告されるヒット語の最大数です。

FBCDoExampleSearchは、事前に検索されたものを例とした、例を基にした検索、あるいは"類似性(similarity)"検索を行います。exampleHitNumsは、例として使われるファイルの、いくつかのヒットのインデックスを含む長整数(long integer)の配列を指します。targetDirsパラメータがある場合(numTargetsがゼロでない)、targetDirsで指定されたディレクトリにあるファイルだけが、検索で見つかったヒットに含まれます。

	FBCBlindExampleSearch

	OSErr FBCBlindExampleSearch(
				SSpec examples[],
				UInt32 numExamples,
				const FSSpec targetDirs[],
				UInt32 numTargets,
				UInt32 maxHits,
				UInt32 maxHitWords,
				Boolean allIndexes,
				Boolean includeRemote,
				FBCSearchSession* theSession);
			
examplesは、ファイルを参照するFSSpecレコードの配列を指します。FBCはこれらのファイルと似ているファイルを探します。
numExamplesには、examplesで指される配列の中のFSSpecレコードの数が含まれます。
targetDirsは、ディレクトリを参照するFSSpecのレコードの配列を指します。targetDirsがNULLの場合、numTargetsはゼロではなく、これらのディレクトリにあるファイルだけ検索で返されるヒットリストに含まれます。
targetDirsはディレクトリを参照するFSSPecレコードの配列を指します。numTargetsがゼロの場合、このパラメータはNULLに設定することができます。
numTargetsはtargetDirsで指される配列の中のFSSpecレコードの数を含みます。
numHitsは返されるヒットの最大数です。
maxHitWordsは、報告されるヒット語の最大数です。
includeRemoteは、ブール値です。
theSessionは、このルーチンにより生成されるFBCSearchSession型の変数を指します。

FBCBlindExampleSearchは新しいサーチ・セッションを作成し、examplesパラメータで指定されたFSSpecレコードの配列で参照されるファイルを使った類似検索を行います。targetDirsパラメータがある場合(numTargetsがゼロでない)、targetDirsに指定されたディレクトリにあるファイルだけが、検索で見つかったヒットに含まれます。includeRemoteがtrueの場合、リモート・ボリュームもサーチ・セッションのターゲット・ボリュームに含まれます。
もし、インデックスされていないファイルがある場合、検索はその他にファイルに対して進められますが、エラーコード"kFBCsomeFilesNotIndexed"が返されます。この場合でもサーチ・セッションは作成され、*theSessionにそれへの参照が返されます。


ヒットの情報を得る
検索が完了すると、サーチ・セッションには、検索の結果見つかったヒットのリストが含まれます。この章で説明するルーチンにより、クライアントはサーチ・セッションに保存されたヒットに関する情報にアクセスすることができます。ヒットレコードには0からcount-1までのインデックスが付きます。

	FBCGetHitCount

	OSErr FBCGetHitCount(
			FBCSearchSession theSession,
			UInt32* count);
			
theSessionはサーチ・セッションへのポインタです。
countは32ビット整数へのポインタです。

FBCGetHitCountはサーチ・セッション中のヒットの数をcountで指される変数に設定します。ヒットレコードには0からcount-1までのインデックスがつきます。

	FBCGetHitDocument

	OSErr FBCGetHitDocument(
				FBCSearchSession theSession,
				UInt32 hitNumber,
				FSSpec* theDocument);
			
theSessionはサーチ・セッションへのポインタです。
hitNumberはサーチ・セッションの中のヒットレコードを参照するインデックスの値です。

FBCGetHitDocumentは、インデックスがhitNumberであるサーチ・セッションのヒットに対するFSSpecレコードを返します。

	FBCGetHitScore

	OSErr FBCGetHitScore(
				FBCSearchSession theSession,
				UInt32 hitNumber,
				float* score);
			
theSessionはサーチ・セッションへのポインタです。
hitNumberはサーチ・セッションの中のヒットレコードを参照するインデックスの値です。
scoreはfloat型変数へのポインタです。

FBCGetHitScoreは、サーチ・セッションの中のインデックスがhitNumberであるヒットに割り当たられた適切度数を返します。scoreは当該検索のコンテキストでの検索基準に対する、ドキュメントの適切性の直接的な尺度です。scoreは0.0-1.0に正規化され、どの検索に対しても最も適切なもののscoreは1.0となります。

	FBCGetMatchedWords

	OSErr FBCGetMatchedWords(
				FBCSearchSession theSession,
				UInt32 hitNumber,
				UInt32* wordCount,
				FBCWordList* list);
			
theSessionはサーチ・セッションへのポインタです。
hitNumberはサーチ・セッションのヒットレコードを参照するインデックス値です。
wordCountは32ビット整数へのポインタです。
listはFBCWordList型変数へのポインタです。

FBCGetMatchedWordsはサーチ・セッションの中のインデックスがhitNumberであるヒットに対する一致した語のリストです。語のリストは、ヒットが返された理由を示しています。関数から戻った時、*listは語のリスト構造へのポインタを含み、*wordCountには、その構造のエントリの数が設定されます。その構造に対する作業が終わった後、必ずFBCDestoryWordListを呼んでその構造を廃棄したください。
ヒットの一致した語は、ヒット自身にも含まれていますので、高速に取り出すことができます。

	FBCGetTopicWords

	OSErr FBCGetTopicWords(
			FBCSearchSession theSession,
			UInt32 hitNumber,
			UInt32* wordCount,
			FBCWordList* list);
			
theSessionはサーチ・セッションへのポインタです。
hitNumberはサーチ・セッションのヒットレコードを参照するインデックスです。
wordCountは32ビット整数へのポインタです。
listはFBCWordList型変数へのポインタです。

FBCGetTopicWordsはサーチ・セッションの中のインデックスがhitNumberであるトピック語のリストを返します。この語のリストは"このドキュメントはどんなものか"の手がかりになる語のリスト構造へのポインタを含み*wordCountはこの構造の中のエントリの数に設定されます。この構造に関する作業が終わった後、必ずFBCDestoryWordListを呼んで、この構造を廃棄してください。
特定のヒットに対するトピック語のリストはインデックス・ファイルを通して生成され、そのため、この関数はFBCGetMatchedWordsに比べて大幅に遅くなります。

	FBCDestroyWordList

	OSErr FBCDestroyWordList(
				FBCWordList theList,
				UInt32 wordCount);
			
theListは語のリストに対するポインタです。
wordCountはリストの中の語の数です。

FBCDestroyWordListはFBCGetMatchedWord、あるいはFBCGetTopicWordsで割り当てられた語のリストを廃棄します。

	FBCReleaseSessionHits

	OSErr FBCReleaseSessionHits(
				FBCSearchSession theSession);
			
theSessionはサーチ・セッションに対するポインタです。このセッションには検索によって生成されたヒットが含まれます。
FBCReleaseSessionHitsは、サーチ・セッションの最新の検索のヒットに関して保存された情報を解放します。ボリューム構成情報は保持され、このコールが完了するとこのサーチ・セッションを使った新しい検索が実行可能となります。


テキストの要約を作る
このコールは入力テキストの中で見付かった"最も適切な"文を含む要約を生成します。

	FBCSummarize

	OSErr FBCSummarize(
				void* inBuf,
				UInt32 inLength,
				void* outBuf,
				UInt32* outLength,
				UInt32* numSentences);
			
inBufは要約するテキストへのポインタです。
inLengthはinBufで指されるテキストの長さです。
outBufは要約を保存するためのバッファを指します。
outLengthは32ビット整数へのポインタです。入力時、この値はoutBufで指されるバッファの大きさに指定します。出力時outBufで指されるバッファは、保存されるデータの実際の長さが設定されます。

numSentencesは32ビット整数へのポインタです。入力時、この値は要約のセンテンスの最大数です。出力時、生成されたセンテンスの実際の数になります。入力時numSentencesが0の場合、FBCは入力バッファ内のセンテンスを10で割った数を採用します。結果が0の場合は、値1が最大数として使われ、そうでなく結果が10以上の場合、値10が最大数として使われます。

ボリュームに関する情報を得る
FBCはボリュームに関する情報にアクセスするための以下の2つのユーティリティルーチンを提供しています。

	FBCVolumeIsIndexed

	Boolean FBCVolumeIsIndexed (SInt16 theVRefNum);
			
theVRefNumはボリューム参照番号です。

FBCVolumeIsIndexedはボリュームがインデックスを持つときtrueを返します。
	FBCVolumeIsRemote

	Boolean FBCVolumeIsRemote(SInt16 theVRefNum);
			
theVRefNumはボリューム参照番号です。

FBCVolumeIsRemoteはボリュームがリモートサーバにあることを示すときtrueを返します。ネットワークによる遅延を避けるためにクライアントはネットワークボリュームを除外することができます。

	FBCVolumeIndexTimeStamp

	OSErr FBCVolumeIndexTimeStamp(SInt16 theVRefNum,
				UInt32* timeStamp);
			
theVRefNumはボリューム参照番号です。
timeStampは32ビット整数へのポインタです。

FBCVolumeIndexTimeStampはボリュームのインデックスが最後に更新された時の値を返します。timeStampに返される値はGetDateTimeで返される値の形式と同じです。

	FBCVolumeIndexPhysicalSize

	OSErr FBCVolumeIndexPhysicalSize(SInt16 theVRefNum,
				UInt32* size);
			
theVRefNumはボリューム参照番号です。
sizeは32ビット整数へのポインタです。(訳注:原文のtimeStampをsizeに訂正)

FBCVolumeIndexPhysicalSizeはボリュームのインデックスファイルの大きさをバイトで返します。


ヒープ領域を予約する
FBCのクライアントは検索を行う前に、コールバックルーチン用の領域をヒープゾーンに予約することができます。

	FBCSetHeapReservation

	void FBCSetHeapReservation(UInt32 bytes);
			
bytesには予約したいバイト数を示す整数値を指定します。

FBCSetHeapReservationには、検索の間にクライアントのコールバックルーチンが呼ばれたときに、FBCが保証しなければならないアプリケーション・ヒープゾーンのバイト数を指定します。もし明示的にヒープスペースが予約されなかった場合、200Kが予約されます。


アプリケーション定義ルーチン
クライアントは検索の最中に定期的に呼ばれるルーチンを定義することができます。このルーチンによりクライアントは検索の状態に関する情報を得ることができ、検索が完了する前に検索を取り消す機会を持つことができます。

コールバックルーチンは以下のように定義します。

	FBCCallbackProcPtr

	typedef Boolean (*FBCCallbackProcPtr)(
				UInt16 phase,
				float percentDone,
				void *data);
			
phaseは検索の現在の状態を示す以下の定数のひとつを含む16ビットの整数です
	enum
	{
		kFBCphSearching = 6,
		kFBCphMakingAccessAccessor = 7,
		kFBCphAccessWaiting = 8,
		kFBCphSummarizing = 9,
		kFBCphIdle = 10,
		kFBCphCanceling = 11
	};
			
percentDoneは進行状況を表す0.0-1.0の値です。
dataにはFBCSetCallbackのdataパラメータで得られるものと同じ値が含まれます。

検索の進行中にシステムがロックすることを防ぐため、コールバックルーチンは、直接的あるいは間接的にWaitNextEventを呼ばなければなりません。コールバック関数がtrueを返した場合、進行中の検索は取り消されます。

	void FBCSetCallback(FBCCallbackProcPtr fn, void* data);
			
fnはコールバック関数へのポインタです。
dataはコールバック関数へ渡される値です。

FBCSetCallbackは検索の間に呼ばれるコールバック関数を設定します。クライアントがコールバック関数を定義しない場合、デフォルトのコールバック関数が使われます。デフォルトのコールバック関数はwaitNextEventを呼んで、falseを返します


内容による検索(Find By Content)のC言語要約

定数
                        enum
{
    gestaltFBCIndexingState      = 'fbci',
    gestaltFBCindexingSafe       = 0,
    gestaltFBCindexingCritical   = 1
};
   
   
enum
{
    gestaltFBCVersion            = 'fbcv',
    gestaltFBCCurrentVersion     = 0x0011
};
   
enum /* error codes */
{
    kFBCvTwinExceptionErr     = -30500,
                    /* miscellaneous error */
    kFBCnoIndexesFound        = -30501,
    kFBCallocFailed           = -30502,
                    /*probably low memory*/
    kFBCbadParam              = -30503,
    kFBCfileNotIndexed        = -30504,
    kFBCbadIndexFile          = -30505,
                    /*bad FSSpec, or bad data in file*/
    kFBCtokenizationFailed    = -30512,
                    /*couldn't read from document or query*/
    kFBCindexNotFound         = -30518,
    kFBCnoSearchSession       = -30519,
    kFBCaccessCanceled        = -30521,
    kFBCindexNotAvailable     = -30523,
    kFBCsearchFailed          = -30524,
    kFBCsomeFilesNotIndexed   = -30525,
    kFBCillegalSessionChange  = -30526,
                    /*tried to add/remove vols */
                    /*to a session  that has hits*/
    kFBCanalysisNotAvailable  = -30527,
    kFBCbadIndexFileVersion   = -30528,
    kFBCsummarizationCanceled = -30529,
    kFBCbadSearchSession      = -30531,
    kFBCnoSuchHit             = -30532
};
   
enum /* codes sent to the callback routine */
{
    kFBCphSearching             = 6,
    kFBCphMakingAccessAccessor  = 7,
    kFBCphAccessWaiting         = 8,
    kFBCphSummarizing           = 9,
    kFBCphIdle                  = 10,
    kFBCphCanceling             = 11
};
                        


データタイプ
    /* A collection of state information for searching*/
typedef struct OpaqueFBCSearchSession* FBCSearchSession;
   
    /* An ordinary C string (used for hit/doc terms)*/
typedef char* FBCWordItem;
   
    /* An array of WordItems*/
typedef FBCWordItem* FBCWordList;
                        


サーチ・セッションの割り当てと初期化
OSErr FBCCreateSearchSession(
             FBCSearchSession* searchSession);
OSErr FBCDestroySearchSession(
             FBCSearchSession theSession);
OSErr FBCCloneSearchSession(
             FBCSearchSession original,
             FBCSearchSession* clone);
                        


サーチ・セッションの構成
OSErr FBCAddAllVolumesToSession(
             FBCSearchSession theSession,
             Boolean includeRemote);	
OSErr FBCSetSessionVolumes(
             FBCSearchSession theSession,
             const SInt16 vRefNums[ ],
             UInt16 numVolumes);
OSErr FBCAddVolumeToSession(
             FBCSearchSession theSession,
             SInt16 vRefNum);
OSErr FBCRemoveVolumeFromSession(
             FBCSearchSession theSession,
             SInt16 vRefNum);
OSErr FBCGetSessionVolumeCount(
             FBCSearchSession theSession,
             UInt16* count);
OSErr FBCGetSessionVolumes(
             FBCSearchSession theSession,
             SInt16 vRefNums[ ],
             UInt16* numVolumes);
                        


検索の実行
OSErr FBCDoQuerySearch(
             FBCSearchSession theSession,		
             char* queryText,
             const FSSpec targetDirs[ ],
             UInt32 numTargets,
             UInt32 maxHits,
             UInt32 maxHitWords);
OSErr FBCDoExampleSearch(
             FBCSearchSession theSession,	
             const UInt32* exampleHitNums,
             UInt32 numExamples,
             const FSSpec targetDirs[ ],
             UInt32 numTargets,
             UInt32 maxHits,
             UInt32 maxHitWords);
OSErr FBCBlindExampleSearch(
             FSSpec examples[ ],
             UInt32 numExamples,
             const FSSpec targetDirs[ ],
             UInt32 numTargets,
             UInt32 maxHits,
             UInt32 maxHitWords,
             Boolean allIndexes,
             Boolean includeRemote,
             FBCSearchSession* theSession);
                        


ヒット情報の取得
OSErr FBCGetHitCount(
             FBCSearchSession theSession,
             UInt32* count);
OSErr FBCGetHitDocument(
             FBCSearchSession theSession,
             UInt32 hitNumber,
             FSSpec* theDocument);
OSErr FBCGetHitScore(
             FBCSearchSession theSession,
             UInt32 hitNumber,
             float* score);
OSErr FBCGetMatchedWords(
             FBCSearchSession theSession,
             UInt32 hitNumber,
             UInt32* wordCount,
             FBCWordList* list);
OSErr FBCGetTopicWords(
             FBCSearchSession theSession,
             UInt32 hitNumber,
             UInt32* wordCount,
             FBCWordList* list);
OSErr FBCDestroyWordList(
             FBCWordList theList,
             UInt32 wordCount);
OSErr FBCReleaseSessionHits(
             FBCSearchSession theSession);
                        


テキストの要約
OSErr FBCSummarize(
             void* inBuf,
             UInt32 inLength,
             void* outBuf,
             UInt32* outLength,
             UInt32* numSentences);
                        


ボリュームの関する情報の取得
Boolean FBCVolumeIsIndexed (SInt16 theVRefNum);
Boolean FBCVolumeIsRemote(SInt16 theVRefNum);
OSErr FBCVolumeIndexTimeStamp(SInt16 theVRefNum,
             UInt32* timeStamp);
OSErr FBCVolumeIndexPhysicalSize(SInt16 theVRefNum,
             UInt32* size); 
                        


ヒープ領域の取得
void FBCSetHeapReservation(UInt32 bytes);
                        


アプリケーション定義ルーチン
typedef Boolean (*FBCCallbackProcPtr)(
             UInt16 phase,
             float percentDone,
             void *data);
void FBCSetCallback(FBCCallbackProcPtr fn, void* data);