/[hyperestraier]/trunk/doc/nguide-ja.html
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/doc/nguide-ja.html

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Fri Jul 29 21:57:20 2005 UTC (18 years, 10 months ago) by dpavlin
File MIME type: text/html
File size: 76516 byte(s)
make working copy from version 0.5.1

1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
5 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
6
7 <head>
8 <meta http-equiv="Content-Language" content="ja" />
9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
10 <meta http-equiv="Content-Style-Type" content="text/css" />
11 <meta name="author" content="Mikio Hirabayashi" />
12 <meta name="keywords" content="Hyper Estraier, Estraier, full-text search, API, Node, P2P" />
13 <meta name="description" content="API specifications of Hyper Estraier" />
14 <link rel="contents" href="./" />
15 <link rel="alternate" href="nguide-en.html" hreflang="en" title="the English version" />
16 <link rel="stylesheet" href="common.css" />
17 <link rel="icon" href="icon16.png" />
18 <link rev="made" href="mailto:mikio@users.sourceforge.net" />
19 <title>P2P Guide of Hyper Estraier Version 1 (Japanese)</title>
20 </head>
21
22 <body>
23
24 <h1>P2Pガイド</h1>
25
26 <div class="note">Copyright (C) 2004-2005 Mikio Hirabayashi</div>
27 <div class="note">Last Update: Tue, 07 Jun 2005 06:17:00 +0900</div>
28 <div class="navi">[<a href="nguide-en.html" hreflang="en">English</a>] [<a href="index.ja.html">HOME</a>]</div>
29
30 <hr />
31
32 <h2 id="tableofcontents">目次</h2>
33
34 <ol>
35 <li><a href="#introduction">はじめに</a></li>
36 <li><a href="#architecture">アーキテクチャ</a></li>
37 <li><a href="#tutorial">チュートリアル</a></li>
38 <li><a href="#estmaster">ノードマスタ用コマンド</a></li>
39 <li><a href="#protocol">プロトコル</a></li>
40 <li><a href="#nodeapi">ノードAPI</a></li>
41 <li><a href="#estcall">クライアント用コマンド</a></li>
42 <li><a href="#tips">助言</a></li>
43 </ol>
44
45 <hr />
46
47 <h2 id="introduction">はじめに</h2>
48
49 <p>この文書では、Hyper EstraierのP2P機構の詳細な使い方を説明します。<a href="uguide-ja.html">ユーザガイド</a>をまだお読みでない場合は先にそちらに目を通しておいてください。</p>
50
51 <p>estseek.cgiで検索を行う場合、起動する度にデータベースを立ち上げ直すので、処理効率が悪いです。また、estcmdでデータベースの更新作業を行っている間は、データベースがロックされてしまうので検索ができません。これらの問題に対処するために、Hyper EstraierはC/S(クライアント/サーバ)方式のサーバプログラムを提供します。データベースを内包したプロセスをシステムに常駐させておいて、それをネットワーク経由で操作するものです。C/S方式には以下の利点があります。</p>
52
53 <ul>
54 <li>サーバとクライアントを別々のマシン上で動作させることができます。</li>
55 <li>単一のサーバに対する複数のクライアントが並列に処理を行えます。</li>
56 <li>クライアントがクラッシュしてもデータベースが壊れません。</li>
57 <li>実装言語やAPIに依存しないでクライアントを実装できます。</li>
58 </ul>
59
60 <p>C/S間のプロトコルはHTTPベースなので、一般的なWebブラウザをクライアントにすることが可能です。もちろん、独自のクライアントを実装していただいてもかまいませんし、WebブラウザにJavaScriptやFlashなどの技術を組み合わせることもできるでしょう。</p>
61
62 <p>複数のサーバが相互に通信することよって、P2P(Peer to Peer)方式の分散処理を行うこともできます。100万件の文書のインデックスを管理する10個のサーバを連携させれば、1000万件の文書を扱う検索システムを構築することができるというわけです。サーバ同士は対等の関係であるため、クライアントはどのサーバにアクセスしてもサービスを享受することができますし、どれかのサーバがダウンしてもシステム全体が停止することはありません。また、サーバ間の信頼度を元に検索精度を向上させる仕組みも備わっています。</p>
63
64 <p>C/S間のプロトコルを隠蔽する「ノードAPI」も提供されます。ノードAPIを使えば、ネットワークに関する詳細な知識がなくても、クライアントのプログラムを実装することができます。この文書では、ノードAPIの使い方についても説明します。</p>
65
66 <hr />
67
68 <h2 id="architecture">アーキテクチャ</h2>
69
70 <p>ここでは、Hyper EstraierにおけるP2Pのアーキテクチャについて説明します。</p>
71
72 <h3>ノードマスタとノードサーバ</h3>
73
74 <p>多数のインデックスを管理することを想定した場合、インデックス毎にサーバを起動するのは非効率です。したがって、単一のプロセスおよび単一のポートで複数のインデックスを管轄できる「ノードマスタ」というプログラムが提供されます。ノードマスタ内の個々のインデックスは独立したサービスを提供するので、ノードマスタは複数のサーバの集合体とみなすこともできます。そこで、個々のインデックスを管轄する仮想的なサーバを「ノードサーバ」と呼ぶことにします。各ノードサーバには別々のURLが割り当てられます。ユーザが操作するアプリケーションはノードサーバのクライアントとして位置づけられますが、接続先のノードサーバについてはURLだけ知っていればよく、ノードサーバがどのノードマスタ上に存在しているかをアプリケーション側で意識する必要はありません。</p>
75
76 <div class="illust"><img src="nodeframe.png" width="720" height="350" alt="[framework]" /></div>
77
78 <p>「ノード(node)」という用語をここではP2P機構における「ピア(peer)」とほぼ同じ意味で使っています。クライアントは、ノードマスタそのものに接続してノードの管理を行うとともに、各々のノードサーバに接続してインデックスに対する検索や文書の登録などの操作を行うことができます。</p>
79
80 <h3>メタ検索と信頼度</h3>
81
82 <p>ノードサーバは別のノードサーバに対して一方的にリンクを張ることができます。クライアントがノードサーバに検索要求を出した場合、依頼を受けたノードサーバは自分がリンクを張っているノードサーバにもクエリを中継し、返された結果を自分のインデックスの結果とマージしてクライアントに返します。つまり、いわゆるメタ検索機能を全てのノードサーバが持つことによって、P2P型の分散処理を実現しているのです。</p>
83
84 <p>メタ検索は多階層的に行われます。経路の循環は自動的に検出されて抑止されますので、検索時には木構造のネットワークからデータを収集しているような挙動になります。この機構によって、検索対象となるノードの数は際限なく増やしていくことが可能になります。</p>
85
86 <div class="illust"><img src="metatree.png" width="720" height="400" alt="[tree of meta search]" /></div>
87
88 <p>ノード間の各リンクには、信頼度という数値が定義されます。ノードがメタ検索の結果をマージする際には、スコアの重みづけに信頼度が利用されます。信頼度が高いノードの結果は上位に来やすいということです。リンク作成や信頼度設定の指示はアプリケーションに任されますが、よく利用されるノードの信頼度を高めるように指示することによって、検索の精度が高めて行くことができます。</p>
89
90 <h3>認証</h3>
91
92 <p>クライアントがノードマスタやノードサーバに接続する際には、ユーザ名とパスワードを用いた認証が行われます。ユーザには、スーパーユーザと普通のユーザの2種類があります。前者はノードの管理やユーザの管理を行う権限を持つユーザで、後者はそれらの権限を持たないユーザです。また、ノードサーバの単位でも権限の付与が行われます。各ノードについて、インデックスの更新が可能な管理者ユーザのリストと、検索だけが可能な普通のユーザのリストが管理されます。なお、ノードマスタのスーパーユーザは配下のどのノードにも管理者としてアクセスできます。ユーザの管理はクライアントがノードマスタに指示を出すことで行います。</p>
93
94 <hr />
95
96 <h2 id="tutorial">チュートリアル</h2>
97
98 <p>P2Pの概念はなかなか難解なものですが、まずはコマンドを使ってみながら雰囲気を掴んで行きましょう。</p>
99
100 <h3>起動と終了</h3>
101
102 <p>ノードマスタを動作させる準備として、サーバルートディレクトリを作成します。設定ファイルやインデックスなどを格納するディレクトリです。以下のコマンドを実行すると、「casket」というディレクトリが作成されます。</p>
103
104 <pre>estmaster init casket
105 </pre>
106
107 <p>次に、ノードマスタを起動します。以下のようにします。</p>
108
109 <pre>estmaster start casket
110 </pre>
111
112 <p>ノードマスタを終了させる場合は、ノードマスタを実行している端末でCtrl-Dを入力するか、別の端末で以下のコマンドを実行します。</p>
113
114 <pre>estmaster stop casket
115 </pre>
116
117 <h3>管理用インターフェイス</h3>
118
119 <p>ノードマスタが起動しているならば、「http://localhost:1978/masterui」というURLにWebブラウザでアクセスすることで、管理用インターフェイスを使うことができます。アクセスするとユーザ名とパスワードを聞かれるダイアログが出ますので、「admin」「admin」と入力してください。すると、管理用のメニューが表示されます。</p>
120
121 <p>「Manage Master」経由で「SHUTDOWN」を選ぶとノードマスタを終了させられますが、今は放っておきましょう。</p>
122
123 <p>「Manage Users」を選んでください。今は「admin」というユーザでログインしていますが、新しいユーザを作っておきましょう。画面の下の方にある入力フォームに、右からユーザ名、パスワード、フラグ、本名、その他の情報を入力します。ユーザ名とパスワードは英数字とハイフンとアンダースコアで指定します。とりあえずは、「mikio」「oikim」「s」「平林幹雄」「管理用ユーザ」としてみましょう。フラグに「s」を入力しているのが重要なところです。そのユーザが管理者権限を持つことを指示しています。</p>
124
125 <p>もはや「admin」ユーザは不要です。セキュリティの問題となるので、消してしまいましょう。「admin」の欄にある「DELE」を選択して、確認の画面で「delete」を選択してください。</p>
126
127 <p>次に、「Manage Nodes」を選択してください。もう「admin」ユーザが消えてしまったので、再びユーザ名とパスワードを聞かれます。先ほどの「mikio」「oikim」を入力すると進むことができます。今度は新しいノードを作ります。画面の下の方にある入力フォームにノード名とラベルを指定します。ノード名は英数字とハイフンとアンダースコアで指定します。とりあえずは、「test1」「テスト用ノードその壱」というノードと、「test2」「テスト用ノードその弍」というノードを作ってください。</p>
128
129 <h3>文書の登録</h3>
130
131 <p>今度はコマンドラインの操作に戻ります。管理用インターフェイスの画面は閉じて構いません。ノードマスタを起動した端末はいろいろログが出て塞がれているでしょうから、別の端末を立ち上げてください。</p>
132
133 <p>ノードのインデックスに文書を登録してみましょう。登録対象の文書は文書ドラフト形式で表現する必要がありますので、予め以下のようなファイルを「data001.est」という名前で作成してください。</p>
134
135 <pre>@uri=data001
136 @title=Material Girl
137
138 Living in a material world
139 And I am a material girl
140 You know that we are living in a material world
141 And I am a material girl
142 </pre>
143
144 <p>「test1」ノードに文書を登録するには、以下のコマンドを実行します。インデックスの更新には管理者権限が必要なので、-authオプションで管理者のユーザ名とパスワードを指定しています。登録処理は一瞬で終わるので、本当に登録されているか疑いたくなるかもしれませんが、何もメッセージが出なければ成功ということです。</p>
145
146 <pre>estcall put -auth mikio oikim http://localhost:1978/node/test1 data001.est
147 </pre>
148
149 <p>メタ検索の説明のために、「test2」ノードにも文書を登録しておきましょう。以下のファイルを「data002.est」として作成してください。</p>
150
151 <pre>@uri=data002
152 @title=Liberian Girl
153
154 Liberian girl
155 You came and you changed My world
156 A love so brand new
157 </pre>
158
159 <p>そして、以下のコマンドを実行してください。</p>
160
161 <pre>estcall put -auth mikio oikim http://localhost:1978/node/test2 data002.est
162 </pre>
163
164 <p>文書ドラフト形式のファイルさえ作れば、リモートマシンからでも文書の登録ができるのがミソです。同じ要領で、いくつかの文書を登録してみてください。</p>
165
166 <h3>文書の検索</h3>
167
168 <p>では、登録した文書を対象とした検索を行ってみましょう。以下のコマンドを実行します。</p>
169
170 <pre>estcall search http://localhost:1978/node/test1 "material world"
171 </pre>
172
173 <p>すると、先ほど登録した文書の情報が表示されます。なお、日本語(UTF-8)が表示できない端末だと文字化けするかもしれません。</p>
174
175 <p>ノード間にリンクを張ることで、メタ検索を行うことができるようになります。試しに、「test1」から「test2」に対してリンクを張ってみましょう。リンク元のURL、リンク先のURL、表示用のラベル、信頼度の順で引数を指定します。</p>
176
177 <pre>estcall setlink -auth mikio oikim http://localhost:1978/node/test1 \
178 http://localhost:1978/node/test2 TEST02 8000
179 </pre>
180
181 <p>ではまた検索してみましょう。今度は-dptオプションでメタ検索の深度を指定します。</p>
182
183 <pre>estcall search -dpt 1 http://localhost:1978/node/test1 "girl"
184 </pre>
185
186 <p>「test1」に対して検索したのに、「test2」の結果もマージされて表示されます。これがP2P型のメタ検索です。「test1」と「test2」が別々のコンピュータにあれば、分散処理ができるわけです。</p>
187
188 <p>リンクの信頼度を高くすると、リンク先のノードが返した結果の方が表示順位が上がります。以下のコマンドを実行してから、先ほどと同じコマンドで検索してみてください。ちゃんと順位が入れ替わっていますよね。</p>
189
190 <pre>estcall setlink -auth mikio oikim http://localhost:1978/node/test1 \
191 http://localhost:1978/node/test2 TEST02 12000
192 </pre>
193
194 <p>検索結果をXML形式で取得することもできます。以下のコマンドを実行してみてください。XMLの詳しい書式についてはestresult.dtdをご覧ください。</p>
195
196 <pre>estcall search -dpt 1 -vx http://localhost:1978/node/test1 "girl"
197 </pre>
198
199 <p>コマンドラインで検索しても大して面白くないので、Webブラウザで検索できるインターフェイスも用意されています。「http://localhost:1978/node/test1/searchui」にアクセスしてみてください。</p>
200
201 <h3>アプリケーションの開発</h3>
202
203 <p>文書ドラフト形式のデータを作るのは面倒くさいし、付属の検索用インターフェイスもちょっと渋い感じですよね。しかし、ここから先はあなたの出番なのです。estcallコマンドやノードAPIを使って小粋なアプリケーションを作ってみてください。この文書の残りの項目では、そのための詳細な説明をします。</p>
204
205 <hr />
206
207 <h2 id="estmaster">ノードマスタ用コマンド</h2>
208
209 <p>ノードマスタを管理するためのコマンドとして「estmaster」が提供されます。ここではその仕様を説明します。</p>
210
211 <h3>書式</h3>
212
213 <p>estmasterは多くのサブコマンドの集合体です。サブコマンドの名前は第1引数で指定されます。その他の引数はサブコマンドの種類に応じて解釈されます。<var>rootdir</var> という引数はサーバルートディレクトリのパスです。サーバルートディレクトリとは、ノードマスタの動作に必要な設定ファイルなどを格納するディレクトリツリーのトップのことです。</p>
214
215 <dl>
216 <dt><kbd>estmaster init [-ex] <var>rootdir</var></kbd></dt>
217 <dd>サーバルートディレクトリを作成します。</dd>
218 <dd>-exを付けると、サンプルのユーザとノードを作成します。デフォルトでは、ユーザ名とパスワードがともに「admin」であるスーパーユーザのみが作成されます。</dd>
219 </dl>
220
221 <dl>
222 <dt><kbd>estmaster start [-bg] [-st] <var>rootdir</var></kbd></dt>
223 <dd>ノードマスタを起動します。</dd>
224 <dd>-bgをつけると、デーモンプロセスとしてバックグラウンドで実行します。</dd>
225 <dd>-stをつけると、マルチスレッドを使わずにシングルスレッドで動作します。</dd>
226 </dl>
227
228 <dl>
229 <dt><kbd>estmaster stop <var>rootdir</var></kbd></dt>
230 <dd>起動中のノードマスタを終了させます。</dd>
231 </dl>
232
233 <dl>
234 <dt><kbd>estmaster unittest <var>rootdir</var></kbd></dt>
235 <dd>ユニットテストを行います。</dd>
236 </dl>
237
238 <dl>
239 <dt><kbd>estmaster crypt <var>key</var> [<var>hash</var>]</kbd></dt>
240 <dd>指定した文字列の暗号用ハッシュ値を出力します。</dd>
241 <dd><var>key</var>は処理対象の文字列を指定します。</dd>
242 <dd><var>hash</var>を指定すると、キーとハッシュが対応するかどうかを判定します。</dd>
243 </dl>
244
245 <p>全てのサブコマンドは、処理が正常に終了した場合には0を、そうでない場合は1を終了ステータスにします。起動中のノードマスタに2(SIGINT)、3(SIGQUIT)、15(SIGTERM)のどれかのシグナルを送ることにより、データベースを閉じて正常終了させることができます。また、起動中のノードマスタにシグナル1(SIGHUP)を送ることにより、再起動して設定ファイルを読み込み直させることができます。</p>
246
247 <p>ノードマスタを終了させるにはコマンドラインによる方法や後述のネットワーク経由による方法がありますが、いずれにせよ、必ず規定の手順で終了させてください。さもなくばインデックスのデータが壊れる可能性があります。</p>
248
249 <h3>サーバルートディレクトリの構成</h3>
250
251 <p>サーバルートディレクトリは以下のファイルやディレクトリを格納しています。</p>
252
253 <ul>
254 <li><kbd>_conf</kbd> : 設定ファイル。詳細は後述します。</li>
255 <li><kbd>_user</kbd> : ユーザアカウントファイル。詳細は後述します。</li>
256 <li><kbd>_log</kbd> : ログファイル。サーバのイベントログや各クライアントのアクセスログを記録します。</li>
257 <li><kbd>_meta</kbd> : メタデータのデータベースファイル。重複起動防止のロック機構も兼ねます。</li>
258 <li><kbd>_pid</kbd> : プロセスIDファイル。起動中のノードマスタのプロセスIDが書かれます。</li>
259 <li><kbd>_stop</kbd> : 停止指示用ファイル。このファイルがあるとノードマスタは自分で停止しようとします。</li>
260 <li><kbd>_node/</kbd> : ノードディレクトリ。各ノードの転置インデックスを格納します。</li>
261 <li><kbd>_sess/</kbd> : セッションディレクトリ。各ユーザのセッション情報を格納します。現状では未使用です。</li>
262 </ul>
263
264 <p>設定ファイルやユーザアカウントは任意のエディタで書き換えることができます。ただし、ユーザアカウントファイルは起動中のノードマスタが停止する際に更新されますので、ユーザアカウントファイルの編集はノードマスタを止めてから行ってください。</p>
265
266 <p>estcmdで作成したデータベースをノードディレクトリに入れてからノードマスタを起動すると、そのデータベースをノードとして利用することができるようになります。</p>
267
268 <h3>設定ファイル</h3>
269
270 <p>設定ファイルは、変数名と値を「:」で区切った形式の行を並べたものです。デフォルトでは、設定ファイルは以下のような内容になっています。</p>
271
272 <pre>hostname: localhost
273 portnum: 1978
274 runmode: 1
275 authmode: 2
276 maxconn: 30
277 sessiontimeout: 600
278 searchtimeout: 8
279 searchdepth: 5
280 proxyhost:
281 proxyport:
282 loglevel: 2
283 docroot:
284 indexfile:
285 trustednodes:
286 denyuntrusted: 0
287 cachesize: 64
288 specialcache:
289 snipwwidth: 480
290 sniphwidth: 96
291 snipawidth: 96
292 </pre>
293
294 <p>それぞれの変数の機能を以下に示します。</p>
295
296 <ul>
297 <li><kbd>hostname</kbd> : サーバのホスト名を指定します。</li>
298 <li><kbd>portnum</kbd> : サーバのポート番号を指定します。</li>
299 <li><kbd>runmode</kbd> : 運用モードを指定します。1は通常モード、2は読み込み専用モードです。</li>
300 <li><kbd>authmode</kbd> : 認証モードを指定します。1は認証を一切しないモード、2は管理機能のみで認証を行うモード、3は全ての操作で認証を行うモードです。</li>
301 <li><kbd>maxconn</kbd> : 最大同時接続数を指定します。</li>
302 <li><kbd>sessiontimeout</kbd> : セッションのタイムアウトを秒単位で指定します。未実装です。</li>
303 <li><kbd>searchtimeout</kbd> : 検索処理のタイムアウトを秒単位で指定します。</li>
304 <li><kbd>searchdepth</kbd> : メタ検索の最大深度を指定します。</li>
305 <li><kbd>proxyhost</kbd> : プロクシサーバのホスト名を指定します。</li>
306 <li><kbd>proxyport</kbd> : プロクシサーバのポート番号を指定します。</li>
307 <li><kbd>loglevel</kbd> : ログのレベルを指定します。1ならデバッグ、2なら通常、3なら警告、4ならエラー、5なら無しです。</li>
308 <li><kbd>docroot</kbd> : 通常のWebサーバとして公開するディレクトリのパスを指定します。不要なら空文字列にします。</li>
309 <li><kbd>indexfile</kbd> : 通常のWebサーバとして公開する際のディレクトリのインデックスファイルの名前を指定します。不要なら空文字列にします。</li>
310 <li><kbd>trustednodes</kbd> : 認証を省略するノード(クライアント)のIPアドレスを10進数ドット付き表記で指定します。</li>
311 <li><kbd>denyuntrusted</kbd> : 正数なら上記のノード以外からのアクセスを拒絶します。</li>
312 <li><kbd>cachesize</kbd> : インデックス用キャッシュのサイズをメガバイト単位で指定します。</li>
313 <li><kbd>specialcache</kbd> : スペシャルキャッシュの属性名を指示します。</li>
314 <li><kbd>snipwwidth</kbd> : 検索結果の紹介文の全体の幅を指示します。</li>
315 <li><kbd>sniphwidth</kbd> : 検索結果の紹介文を作る際に文書の冒頭から取得する幅を指示します。</li>
316 <li><kbd>snipawidth</kbd> : 検索結果の紹介文を作る際に検索語の周辺から取得する幅を指示します。</li>
317 </ul>
318
319 <h3>ユーザアカウントファイル</h3>
320
321 <p>ユーザアカウントファイルは、ユーザ名、暗号化されたパスワード、フラグ、フルネーム、雑多な情報をタブ区切りで並べた行を並べたものです。文字コードはUTF-8です。デフォルトでは以下のような内容になっています。</p>
322
323 <pre>admin 21232f297a57a5a743894a0e4a801fc3 s Carolus Magnus Administrator
324 </pre>
325
326 <p>パスワードはMD5のハッシュ値で表現されます。フラグには、管理者であることを示す「s」とアクセス禁止者であることを示す「b」を用いることができます。フラグとフルネームと雑多な情報は省略可能です。</p>
327
328 <h3>内蔵ユーザインターフェイス</h3>
329
330 <p>Webブラウザで、ノードマスタの相対URL「/masterui」にアクセスすると、管理用のインターフェイスを使うことができます。管理用インターフェイスを使うには、スーパーユーザのアカウントでログインする必要があります。</p>
331
332 <p>Webブラウザで、ノードサーバのURLの後ろに「/searchui」をつけたURLにアクセスすると、検索用のインターフェイスを使うことができます。</p>
333
334 <hr />
335
336 <h2 id="protocol">プロトコル</h2>
337
338 <p>ノード間およびクライアント・ノード間の通信はHTTPベースのプロトコルに基づいて行われます。ここでは、その具体的な仕様について見て行きます。</p>
339
340 <h3>概要</h3>
341
342 <p>ノードマスタおよびノードサーバはHTTP/1.0を実装しています。現状では、HTTP/1.1特有の機能であるキープアライブ接続やチャンクエンコーディングや各種のネゴシエーションには対応していません。</p>
343
344 <p>HTTPのメソッドはGETでもPOSTでも構いませんが、情報を取得するだけの場合はGET、ノードマスタやノードサーバに更新が発生する場合はPOSTを使うことが推奨されます。パラメータの文字コードはUTF-8ですが、URLに含められない文字にはURLエンコード(application/x-www-form-urlencoded)を施す必要があります。GETメソッドで送れるデータのサイズは8000バイトまでです。ユーザ名とパスワードの受け渡しはHTTPのBasic認証機構を使って行われます。</p>
345
346 <p>処理が成功した場合は原則的に200または202のステータスコードが返ります。エラーの場合は、以下のステータスコードが返ります。</p>
347
348 <ul>
349 <li>400 : パラメータが不正です。</li>
350 <li>401 : 認証情報がないか、間違っています。</li>
351 <li>403 : 現在のアカウントにはアクセス権限がありません。</li>
352 <li>404 : 接続先のパスが存在しません。</li>
353 <li>500 : サーバに原因があるエラーが発生しました。</li>
354 </ul>
355
356 <p>検索等の操作ではメッセージボディに結果のデータが含まれます。データ形式はUTF-8のテキストですが、タブや改行で構造化されている場合もあります。操作の種類によって結果の解釈方法は変わります。</p>
357
358 <h3>ノードマスタの操作</h3>
359
360 <p>ノードマスタに対する操作は「/master」というパスに接続することで行います。例えばホスト名が「skyhigh.estraier.go.jp」でポートが「8888」の場合は、「http://skyhigh.estraier.go.jp:8888/master」に接続することになります。ノードマスタの操作はスーパーユーザのみが行えます。ノードマスタの操作はいくつかのサブコマンドからなりますが、サブコマンドの名前は「action」パラメータで指定します。その他のパラメータはサブコマンドによって変わります。パラメータの順番は任意です。</p>
361
362 <dl>
363 <dt><kbd>/master?action=shutdown</kbd></dt>
364 <dd>ノードマスタをシャットダウンします。</dd>
365 <dd>パラメータはありません。</dd>
366 <dd>成功すれば202のステータスコードが返信されます。</dd>
367 </dl>
368
369 <dl>
370 <dt><kbd>/master?action=userlist</kbd></dt>
371 <dd>ユーザアカウントのリストを取得します。</dd>
372 <dd>パラメータはありません。</dd>
373 <dd>成功すれば200のステータスコードとともにTSV形式のリストが返信されます。各行が各ユーザの情報を表し、ユーザ名、暗号化されたパスワード、フラグ、フルネーム、その他の情報をタブ区切りのフィールドとして表現します。</dd>
374 </dl>
375
376 <dl>
377 <dt><kbd>/master?action=useradd&amp;name=<var>str</var>&amp;passwd=<var>str</var>&amp;flags=<var>str</var>&amp;fname=<var>str</var>&amp;misc=<var>str</var></kbd></dt>
378 <dd>ユーザアカウントを追加します。</dd>
379 <dd><var>name</var>は新規のユーザ名を指定します。必須です。ユーザ名に利用できる文字はUS-ASCIIの英数字とハイフンとアンダーバーのみです。既存のユーザ名と重複していた場合はエラーになります。</dd>
380 <dd><var>passwd</var>はパスワードを指定します。必須です。</dd>
381 <dd><var>flags</var>はフラグを指定します。省略可能です。</dd>
382 <dd><var>fname</var>はフルネームを指定します。省略可能です。</dd>
383 <dd><var>misc</var>は雑多な情報を指定します。省略可能です。</dd>
384 <dd>成功すれば200のステータスコードが返信されます。</dd>
385 <dd>パスワードを送信することになるため、パラメータはPOSTメソッドで送信すべきです。</dd>
386 </dl>
387
388 <dl>
389 <dt><kbd>/master?action=userdel&amp;name=<var>str</var></kbd></dt>
390 <dd>ユーザアカウントを削除します。</dd>
391 <dd><var>name</var>はユーザ名を指定します。必須です。</dd>
392 <dd>成功すれば200のステータスコードが返信されます。</dd>
393 </dl>
394
395 <dl>
396 <dt><kbd>/master?action=nodelist</kbd></dt>
397 <dd>ノードサーバのリストを取得します。</dd>
398 <dd>パラメータはありません。</dd>
399 <dd>成功すれば200のステータスコードとともにTSV形式のリストが返信されます。各行が各ノードの情報を表し、ノード名、ラベル、登録文書数、登録語数、サイズをタブ区切りのフィールドとして表現します。</dd>
400 </dl>
401
402 <dl>
403 <dt><kbd>/master?action=nodeadd&amp;name=<var>str</var>&amp;label=<var>str</var></kbd></dt>
404 <dd>ノードサーバを追加します。</dd>
405 <dd><var>name</var>は新規のノード名を指定します。必須です。ノード名に利用できる文字はUS-ASCIIの英数字とハイフンとアンダーバーのみです。既存のノード名と重複していた場合はエラーになります。</dd>
406 <dd><var>label</var>はラベルを指定します。省略可能です。省略した場合はノード名と同じラベルが付けられます。</dd>
407 <dd>成功すれば200のステータスコードが返信されます。</dd>
408 </dl>
409
410 <dl>
411 <dt><kbd>/master?action=nodedel&amp;name=<var>str</var></kbd></dt>
412 <dd>ノードサーバを削除します。</dd>
413 <dd><var>name</var>はノード名を指定します。必須です。</dd>
414 <dd>成功すれば200のステータスコードが返信されます。</dd>
415 </dl>
416
417 <h3>ノードサーバの操作</h3>
418
419 <p>各ノードサーバに対する操作は「/node/」の後にノード名をつけたパスに接続することで行います。例えばホスト名が「skyhigh.estraier.go.jp」でポートが「8888」でノード名が「foo」の場合は、「http://skyhigh.estraier.go.jp:8888/node/foo」に接続することになります。ノードマスタの操作はいくつかのサブコマンドからなりますが、サブコマンドの名前はノード名の後に「/」を挟んで指定します。パラメータはサブコマンドによって変わります。パラメータの順番は任意です。ノードマスタの操作は検索系と更新系の二つに大別できますが、前者はどのユーザでも実行でき、後者はそのノードの管理者のみが実行できます。</p>
420
421 <dl>
422 <dt><kbd>/node/<var>name</var>/inform</kbd></dt>
423 <dd>ノードの情報を取得します。</dd>
424 <dd>パラメータはありません。</dd>
425 <dd>成功すれば200のステータスコードとともにTSV形式のデータが返信されます。第1行目は、ノード名、ラベル、登録文書数、登録語数、サイズをタブ区切りのフィールドとして表現したものです。空行を挟んで、次の空行までの各行は管理者のユーザ名のリストです。空行を挟んで、次の空行までの各行は一般ユーザのユーザ名のリストです。空行を挟んで、以降はリンク情報のリストです。リンク情報の各行はURLとラベルと信頼度をタブ区切りのフィールドで表現したものです。</dd>
426 </dl>
427
428 <dl>
429 <dt><kbd>/node/<var>name</var>/search?phrase=<var>str</var>&amp;attr=<var>str</var>&amp;order=<var>str</var>&amp;max=<var>num</var>&amp;options=<var>num</var>&amp;depth=<var>num</var></kbd></dt>
430 <dd>検索を実行します。</dd>
431 <dd><var>phrase</var>は検索フレーズを指定します。省略可能です。書式はコアAPIのものと同じです。</dd>
432 <dd><var>attr</var>は属性条件を指定します。省略可能です。<var>attr1</var>から<var>attr9</var>を使って複数の属性条件を指定することも可能です。書式はコアAPIのものと同じです。</dd>
433 <dd><var>order</var>はソート条件を指定します。省略可能です。書式はコアAPIのものと同じです。</dd>
434 <dd><var>max</var>は取得件数を指定します。省略可能です。デフォルトは10です。</dd>
435 <dd><var>options</var>はオプションを指定します。省略可能です。値はコアAPIのものと同じです。</dd>
436 <dd><var>depth</var>はメタ検索の深度を指定します。省略可能です。デフォルトは0です。</dd>
437 <dd>成功すれば200のステータスコードとともに検索結果のデータが返信されます。詳細は後述します。</dd>
438 </dl>
439
440 <dl>
441 <dt><kbd>/node/<var>name</var>/get_doc?id=<var>num</var>&amp;uri=<var>str</var></kbd></dt>
442 <dd>文書の情報を取得します。</dd>
443 <dd><var>id</var>は対象文書のID番号を指定します。省略可能です。</dd>
444 <dd><var>uri</var>は対象文書のURIを指定します。省略可能です。</dd>
445 <dd>成功すれば200のステータスコードとともに文書ドラフト形式のデータが返信されます。</dd>
446 </dl>
447
448 <dl>
449 <dt><kbd>/node/<var>name</var>/get_doc_attr?id=<var>num</var>&amp;uri=<var>str</var>&amp;attr=<var>str</var></kbd></dt>
450 <dd>文書の属性値を取得します。</dd>
451 <dd><var>id</var>は対象文書のID番号を指定します。省略可能です。</dd>
452 <dd><var>uri</var>は対象文書のURIを指定します。省略可能です。</dd>
453 <dd><var>attr</var>は属性名を指定します。必須です。</dd>
454 <dd>成功すれば200のステータスコードとともに属性値のデータが返信されます。</dd>
455 </dl>
456
457 <dl>
458 <dt><kbd>/node/<var>name</var>/uri_to_id?uri=<var>str</var></kbd></dt>
459 <dd>URIに対応する文書のID番号を取得します。</dd>
460 <dd><var>uri</var>は対象文書のURIを指定します。必須です。</dd>
461 <dd>成功すれば200のステータスコードとともに該当文書のID番号が返信されます。</dd>
462 </dl>
463
464 <dl>
465 <dt><kbd>/node/<var>name</var>/put_doc?draft=<var>str</var></kbd></dt>
466 <dd>文書を登録します。管理者のみが利用できます。</dd>
467 <dd><var>draft</var>は対象文書の内容を文書ドラフト形式で指定します。必須です。</dd>
468 <dd>成功すれば200のステータスコードが返信されます。</dd>
469 </dl>
470
471 <dl>
472 <dt><kbd>/node/<var>name</var>/out_doc?id=<var>num</var>&amp;uri=<var>str</var></kbd></dt>
473 <dd>文書を削除します。管理者のみが利用できます。</dd>
474 <dd><var>id</var>は対象文書のID番号を指定します。省略可能です。</dd>
475 <dd><var>uri</var>は対象文書のURIを指定します。省略可能です。</dd>
476 <dd>成功すれば200のステータスコードが返信されます。</dd>
477 </dl>
478
479 <dl>
480 <dt><kbd>/node/<var>name</var>/_set_user?name=<var>str</var>&amp;mode=<var>num</var></kbd></dt>
481 <dd>ユーザのアクセス権限を設定します。管理者のみが利用できます。</dd>
482 <dd><var>name</var>はユーザ名を指定します。必須です。</dd>
483 <dd><var>mode</var>は操作内容を指定します。必須です。0なら指定したユーザのアクセス権限を剥奪します。1なら指定したユーザを管理者として登録します。2なら指定したユーザを一般ユーザとして登録します。</dd>
484 <dd>成功すれば200のステータスコードが返信されます。</dd>
485 </dl>
486
487 <dl>
488 <dt><kbd>/node/<var>name</var>/_set_link?url=<var>str</var>&amp;label=<var>str</var>&amp;credit=<var>num</var></kbd></dt>
489 <dd>他のノードへのリンクを設定します。管理者のみが利用できます。</dd>
490 <dd><var>url</var>はリンク先のノードサーバのURLを指定します。必須です。既存のリンクと重複していた場合はラベルと信頼度が再設定されます。</dd>
491 <dd><var>label</var>はリンク先のノードサーバのラベルを指定します。必須です。</dd>
492 <dd><var>credit</var>はリンクの信頼度を指定します。省略可能です。省略した場合はリンクが削除されます。</dd>
493 <dd>成功すれば200のステータスコードが返信されます。</dd>
494 </dl>
495
496 <p>ノードマスタのスーパーユーザは各ノードの管理権限を持ちますが、各ノードの管理者はノードマスタのスーパーユーザとは限らないということに注意してください。また、各ノードの一般ユーザは、認証モードを3(all)にした場合にのみ意味を持ちます。</p>
497
498 <h3>検索結果の書式</h3>
499
500 <p>searchコマンドの結果のエンティティボディは、MIMEのマルチパートに似た形式をとります。以下に例を示します。</p>
501
502 <pre>--------[2387AD2E34554FFF]--------
503 VERSION 0.9
504 NODE http://localhost:1978/node/sample1
505 HIT 2
506 HINT#1 give 2
507 DOCNUM 2
508 WORDNUM 31
509 TIME 0.001
510 LINK#0 http://localhost:1978/node/sample1 Sample1 10000 2 31 2731304 2
511 LINK#1 http://localhost:1978/node/sample2 Sample2 4000 3 125 8524522 1
512 VIEW SNIPPET
513
514 --------[2387AD2E34554FFF]--------
515 #nodelabel=Sample Node One
516 #nodeurl=http://localhost:1978/node/sample1
517 @id=1
518 @uri=http://localhost/foo.html
519
520 You may my glories and my state dispose, But not my griefs; still am I king of those. (
521 Give give
522 it u
523
524 p, Yo!
525 Give give
526 it up, Yo!)
527
528 --------[2387AD2E34554FFF]--------
529 #nodelabel=Sample Node One
530 #nodeurl=http://localhost:1978/node/sample1
531 @id=2
532 @uri=http://localhost/bar.html
533
534 The faster I go, the behinder I get. (
535 Give give
536 it up, Yo!
537 Give give
538 it up, Yo!)
539
540 --------[2387AD2E34554FFF]--------:END
541 </pre>
542
543 <p>改行コードは単一のLFです。第1行目は区切り文字列の定義です。ここで定義された文字列の行で、パートが区切られます。最後の区切り文字列の末尾には「:END」という文字列がつきます。最初のパートはメタ部です。それ以降のパートは文書部です。</p>
544
545 <p>メタ部は、TSV形式をとります。各行の意味は第1フィールドの文字列で識別できます。以下の種類があります。</p>
546
547 <ul>
548 <li><kbd>VERSION</kbd> : プロトコルのバージョンを示します。</li>
549 <li><kbd>NODE</kbd> : ノードのURLを示します。</li>
550 <li><kbd>HIT</kbd> : 該当文書数の総計を示します。</li>
551 <li><kbd>HINT#<var>n</var></kbd> : 各検索語の該当数を示します。第2フィールドが語で、第3フィールドが該当数です。</li>
552 <li><kbd>DOCNUM</kbd> : 登録文書数の総計を示します。</li>
553 <li><kbd>WORDNUM</kbd> : 登録語数の総計を示します。</li>
554 <li><kbd>TIME</kbd> : 処理にかかった時間をミリ秒単位で示します。</li>
555 <li><kbd>LINK#<var>n</var></kbd> : 各ノードの情報を示します。第2フィールドはURL、第3フィールドはラベル、第4フィールドは信頼度、第5フィールドは登録文書数、第6フィールドは登録語数、第8フィールドはデータベースのサイズ、第8フィールドは該当文書数です。LINK#0はそのノード自身の情報を示します。</li>
556 <li><kbd>VIEW</kbd> : 文書パートの形式を示します。現状ではSNIPPETのみが定義されています。</li>
557 </ul>
558
559 <p>文書部は、該当文書の属性情報とスニペットを示します。最初の空行までが属性情報で、それ以降が紹介文です。属性情報の形式は文書ドラフトと同じです。紹介文の形式はTSVです。その各行は表示すべき文字列です。ほとんどの行は単一のフィールドしか持ちませんが、いくつかは二つのフィールドを持ちます。もし第2フィールドが存在したならば、第1フィールドはハイライトして表示すべき文字列で、第2フィールドはその正規化された文字列です。</p>
560
561 <p>searchコマンドやget_docコマンドの操作を行った際に返される文書情報には、以下の疑似属性が付加されます。</p>
562
563 <ul>
564 <li><kbd>#nodeurl</kbd> : その文書が登録されているノードのURL。</li>
565 <li><kbd>#nodelabel</kbd> : その文書が登録されているノードのラベル。</li>
566 </ul>
567
568 <h3>文書登録の特殊形式</h3>
569
570 <p>put_docコマンドでは大きなサイズのパラメータを送ることが多いですが、それをURLエンコードすると効率が悪くなります。POSTメソッドのContent-Typeヘッダの値を「text/x-estraier-draft」にすると、エンティティボディとして文書ドラフトそのものを送ることができます。例えば、以下のようなリクエストを送信します。</p>
571
572 <pre>POST /node/foo/put_doc HTTP/1.0
573 Content-Type: text/x-estraier-draft
574 Content-Length: 138
575
576 @uri=http://gogo.estraier.go.jp/sample.html
577 @title=Twinkle Twinkle Little Star
578
579 Twinkle, twinkle, little star,
580 How I wonder what you are.
581 </pre>
582
583 <hr />
584
585 <h2 id="nodeapi">ノードAPI</h2>
586
587 <p>ノードサーバを操作する際にHTTPを駆使するのが面倒な場合はノードAPIを使うと便利です。ここではその詳細について説明します。</p>
588
589 <h3>概要</h3>
590
591 <p>ノードAPIを使えば、TCP/IPやHTTPについての低レベルな処理を気にすることなく、ノードサーバと通信を行うことができます。コアAPIと比べると通信の分のオーバーヘッドがかかりますが、リモートホストから実行できたり、リーダやライタの区別を気にせずに並列処理ができるといった利点は重要です。</p>
592
593 <p>ノードAPIを使うアプリケーションのソースコードでは、estraier.hとestnode.hとcabin.hとstdlib.hをインクルードしてください。 </p>
594
595 <pre>#include &lt;estraier.h&gt;
596 #include &lt;estnode.h&gt;
597 #include &lt;cabin.h&gt;
598 #include &lt;stdlib.h&gt;
599 </pre>
600
601 <p>アプリケーションをビルドする際には、以下ようなコマンドを実行してください。コアAPIのビルド方法と全く同じです。</p>
602
603 <pre>gcc `estconfig --cflags` -o foobar foobar.c `estconfig --ldflags` `estconfig --libs`
604 </pre>
605
606 <p>ノードAPIを利用する際には、コアAPIで定義されている機能も利用することになりますので、<a href="pguide-ja.html">プログラミングガイド</a>をまだお読みでない場合は先にそちらに目を通しておいてください。</p>
607
608 <h3>初期化のためのAPI</h3>
609
610 <p>ノードAPIのネットワーク機能を使う前提として、プログラムの冒頭でネットワーク環境を初期化してください。また、プログラムが終了する際にはネットワーク環境を破棄してください。</p>
611
612 <p>ネットワーク環境を初期化するには、関数 `est_init_net_env' を用います。</p>
613
614 <dl>
615 <dt><kbd>int est_init_net_env(void);</kbd></dt>
616 <dd>戻り値は成功なら真、エラーなら偽です。</dd>
617 </dl>
618
619 <p>ネットワーク環境を破棄するには、関数 `est_free_net_env' を用います。</p>
620
621 <dl>
622 <dt><kbd>void est_free_net_env(void);</kbd></dt>
623 <dd>パラメータや戻り値はありません。</dd>
624 </dl>
625
626 <h3>ノードを扱うAPI</h3>
627
628 <p>構造体型 `ESTNODE' は、ノードとの接続を抽象化したものです。各ノードはURLで識別されます。`ESTNODE' の実体が直接参照されることはなく、必ずポインタを介して間接参照されます。このポインタおよびその参照先を総じてノード接続オブジェクトと呼びます。ノード接続オブジェクトは関数 `est_node_new' によって生成され、`est_node_delete' によって破棄されます。生成されたノード接続オブジェクトは必ず破棄してください。</p>
629
630 <p>ノード接続オブジェクトの典型的なライフサイクルを以下に示します。</p>
631
632 <pre>ESTNODE *node;
633
634 /* 生成する */
635 node = est_node_new("http://estraier.gov:1978/node/foo");
636
637 /* プロクシとタイムアウトと認証情報を設定する */
638 est_node_set_proxy(node, "proxy.qdbm.go.jp", 8080);
639 est_node_set_timeout(node, 5);
640 est_node_set_auth(node, "mikio", "oikim");
641
642 /* ここで文書を登録したり、検索を行ったりする */
643
644 /* 破棄する */
645 est_node_delete(node);
646 </pre>
647
648 <p>ノード接続オブジェクトを生成するには、関数 `est_node_new' を用います。</p>
649
650 <dl>
651 <dt><kbd>ESTNODE *est_node_new(const char *<var>url</var>);</kbd></dt>
652 <dd>`url' はノードのURLを指定します。戻り値はノード接続オブジェクトです。</dd>
653 </dl>
654
655 <p>ノード接続オブジェクトを破棄するには、関数 `est_node_delete' を用います。</p>
656
657 <dl>
658 <dt><kbd>void est_node_delete(ESTNODE *<var>node</var>);</kbd></dt>
659 <dd>`node' はノード接続オブジェクトを指定します。</dd>
660 </dl>
661
662 <p>ノード接続で直前に起きたステータスコードを取得するには、関数 `est_node_status' を用います。</p>
663
664 <dl>
665 <dt><kbd>int est_node_status(ESTNODE *<var>node</var>);</kbd></dt>
666 <dd>`node' はノード接続オブジェクトを指定します。戻り値はノード接続で直前に起きたステータスコードです。-1は接続に失敗したことを意味します。</dd>
667 </dl>
668
669 <p>ノード接続オブジェクトにプロクシの情報を設定するには、関数 `est_node_set_proxy' を用います。</p>
670
671 <dl>
672 <dt><kbd>void est_node_set_proxy(ESTNODE *<var>node</var>, const char *<var>host</var>, int <var>port</var>);</kbd></dt>
673 <dd>`node' はノード接続オブジェクトを指定します。`host' はプロクシサーバのホスト名を指定します。`port' はプロクシサーバのポート番号を指定します。</dd>
674 </dl>
675
676 <p>ノード接続オブジェクトにタイムアウトの情報を設定するには、関数 `est_node_set_timeout' を用います。</p>
677
678 <dl>
679 <dt><kbd>void est_node_set_timeout(ESTNODE *<var>node</var>, int <var>sec</var>);</kbd></dt>
680 <dd>`node' はノード接続オブジェクトを指定します。`sec' は接続のタイムアウト時間を秒単位で指定します。</dd>
681 </dl>
682
683 <p>ノード接続オブジェクトに認証情報を設定するには、関数 `est_node_set_auth' を用います。</p>
684
685 <dl>
686 <dt><kbd>void est_node_set_auth(ESTNODE *<var>node</var>, const char *<var>name</var>, const char *<var>passwd</var>);</kbd></dt>
687 <dd>`node' はノード接続オブジェクトを指定します。`name' は認証情報のユーザ名を指定します。`passwd' は認証情報のパスワードを指定します。</dd>
688 </dl>
689
690 <p>ノードに文書を追加するには、関数 `est_node_put_doc' を用いる。</p>
691
692 <dl>
693 <dt><kbd>int est_node_put_doc(ESTNODE *<var>node</var>, ESTDOC *<var>doc</var>);</kbd></dt>
694 <dd>`node' はノード接続オブジェクトを指定します。`doc' は文書オブジェクトを指定します。文書オブジェクトはURI属性を持っていなければなりません。戻り値は成功なら真、エラーなら偽です。指定された文書オブジェクトのURI属性がノード内の既存の文書と一致する場合、既存の方は削除されます。</dd>
695 </dl>
696
697 <p>ノードから文書を削除するには、関数 `est_node_out_doc' を用います。</p>
698
699 <dl>
700 <dt><kbd>int est_node_out_doc(ESTNODE *<var>node</var>, int <var>id</var>);</kbd></dt>
701 <dd>`node' はノード接続オブジェクトを指定します。`id' は登録文書のID番号を指定します。戻り値は成功なら真、エラーなら偽です。</dd>
702 </dl>
703
704 <p>ノードからURIで指定した文書を削除するには、関数 `est_node_out_doc_by_uri' を用います。</p>
705
706 <dl>
707 <dt><kbd>int est_node_out_doc_by_uri(ESTNODE *<var>node</var>, const char *<var>uri</var>);</kbd></dt>
708 <dd>`node' はノード接続オブジェクトを指定します。`uri' は登録文書のURIを指定します。戻り値は成功なら真、エラーなら偽です。</dd>
709 </dl>
710
711 <p>ノードから文書を取得するには、関数 `est_node_get_doc' を用います。</p>
712
713 <dl>
714 <dt><kbd>ESTDOC *est_node_get_doc(ESTNODE *<var>node</var>, int <var>id</var>);</kbd></dt>
715 <dd>`node' はノード接続オブジェクトを指定します。`id' は登録文書のID番号を指定します。戻り値は文書オブジェクトか、エラーなら `NULL' です。戻り値のオブジェクトは `est_doc_new' で生成されているので、不要になったら `est_doc_close' で破棄してください。</dd>
716 </dl>
717
718 <p>ノードからURIで指定した文書を取得するには、関数 `est_node_get_doc_by_uri' を用います。</p>
719
720 <dl>
721 <dt><kbd>ESTDOC *est_node_get_doc_by_uri(ESTNODE *<var>node</var>, const char *<var>uri</var>);</kbd></dt>
722 <dd>`node' はノード接続オブジェクトを指定します。`uri' は登録文書のURIを指定します。戻り値は文書オブジェクトか、エラーなら `NULL' です。戻り値のオブジェクトは `est_doc_new' で生成されているので、不要になったら `est_doc_close' で破棄してください。</dd>
723 </dl>
724
725 <p>ノードから文書の属性値を取得するには、関数 `est_node_get_doc_attr' を用います。</p>
726
727 <dl>
728 <dt><kbd>char *est_node_get_doc_attr(ESTNODE *<var>node</var>, int <var>id</var>, const char *<var>name</var>);</kbd></dt>
729 <dd>`node' はノード接続オブジェクトを指定します。`id' は登録文書のID番号を指定します。`name' は属性名を指定します。戻り値は該当の属性値か、無ければ `NULL' です。戻り値の領域は `malloc' で生成されているので、不要になったら `free' で破棄してください。</dd>
730 </dl>
731
732 <p>ノードからURIで指定した文書の属性値を取得するには、関数 `est_node_get_doc_attr_by_uri' を用います。</p>
733
734 <dl>
735 <dt><kbd>char *est_node_get_doc_attr_by_uri(ESTNODE *<var>node</var>, const char *<var>uri</var>, const char *<var>name</var>);</kbd></dt>
736 <dd>`node' はノード接続オブジェクトを指定します。`uri' は登録文書のURIを指定します。`name' は属性名を指定します。戻り値は該当の属性値か、無ければ `NULL' です。戻り値の領域は `malloc' で生成されているので、不要になったら `free' で破棄してください。</dd>
737 </dl>
738
739 <p>URIに対応する文書のID番号を取得するには、関数 `est_node_uri_to_id' を用います。</p>
740
741 <dl>
742 <dt><kbd>int est_node_uri_to_id(ESTNODE *<var>node</var>, const char *<var>uri</var>);</kbd></dt>
743 <dd>`node' はノード接続オブジェクトを指定します。`uri' は登録文書のURIを指定します。戻り値は文書のID番号であるか、エラーなら-1です。</dd>
744 </dl>
745
746 <p>ノードの名前を取得するには、関数 `est_node_name' を用います。</p>
747
748 <dl>
749 <dt><kbd>const char *est_node_name(ESTNODE *<var>node</var>);</kbd></dt>
750 <dd>`node' はノード接続オブジェクトを指定します。戻り値はデータベースの名前か、エラーなら `NULL' です。戻り値の文字列の寿命はデータベースオブジェクトのそれと同期します。</dd>
751 </dl>
752
753 <p>ノードのラベルを取得するには、関数 `est_node_label' を用います。</p>
754
755 <dl>
756 <dt><kbd>const char *est_node_label(ESTNODE *<var>node</var>);</kbd></dt>
757 <dd>`node' はノード接続オブジェクトを指定します。戻り値はデータベースのラベルか、エラーなら `NULL' です。戻り値の文字列の寿命はデータベースオブジェクトのそれと同期します。</dd>
758 </dl>
759
760 <p>ノードに登録された文書の数を取得するには、関数 `est_node_doc_num' を用います。</p>
761
762 <dl>
763 <dt><kbd>int est_node_doc_num(ESTNODE *<var>node</var>);</kbd></dt>
764 <dd>`node' はノード接続オブジェクトを指定します。戻り値はデータベースに登録された文書の数か、エラーなら-1です。</dd>
765 </dl>
766
767 <p>ノードに登録された異なり語の数を取得するには、関数 `est_node_word_num' を用います。</p>
768
769 <dl>
770 <dt><kbd>int est_node_word_num(ESTNODE *<var>node</var>);</kbd></dt>
771 <dd>`node' はノード接続オブジェクトを指定します。戻り値はデータベースに登録された異なり語の数か、エラーなら-1です。</dd>
772 </dl>
773
774 <p>ノードのデータベースのサイズを取得するには、関数 `est_node_size' を用います。</p>
775
776 <dl>
777 <dt><kbd>double est_node_size(ESTNODE *<var>node</var>);</kbd></dt>
778 <dd>`node' はノード接続オブジェクトを指定します。戻り値はノードのデータベースのサイズか、エラーなら-1.0です。</dd>
779 </dl>
780
781 <p>検索条件に該当する文書の一覧を取得するには、関数 `est_node_search' を用います。</p>
782
783 <dl>
784 <dt><kbd>ESTNODERES *est_node_search(ESTNODE *<var>node</var>, ESTCOND *<var>cond</var>, int <var>depth</var>);</kbd></dt>
785 <dd>`node' はノード接続オブジェクトを指定します。`cond' は検索条件オブジェクトを指定します。`depth' はメタ検索の深度を指定します。戻り値はノード結果オブジェクトか、エラーなら `NULL' です。戻り値のオブジェクトは不要になったら `est_noderes_delete' で破棄してください。</dd>
786 </dl>
787
788 <p>ノードのユーザアカウントを管理するには、関数 `est_node_set_user' を用います。</p>
789
790 <dl>
791 <dt><kbd>int est_node_set_user(ESTNODE *<var>node</var>, const char *<var>name</var>, int <var>mode</var>);</kbd></dt>
792 <dd>`node' はノード接続オブジェクトを指定します。`name' はユーザ名を指定します。`mode' は操作モードを指定します。0ならアカウントを削除し、1ならアカウントを管理者にし、2なら通常ユーザにします。戻り値は成功なら真、エラーなら偽です。</dd>
793 </dl>
794
795 <p>ノードのリンクを管理するには、関数 `est_node_set_link' を用います。</p>
796
797 <dl>
798 <dt><kbd>int est_node_set_link(ESTNODE *<var>node</var>, const char *<var>url</var>, const char *<var>label</var>, int <var>credit</var>);</kbd></dt>
799 <dd>`node' はノード接続オブジェクトを指定します。`url' はリンク対象のノードのURLを指定します。`label' はリンクのラベルを指定します。`credit' はリンクの信頼度を指定します。負数の場合は該当のリンクを削除します。戻り値は成功なら真、エラーなら偽です。</dd>
800 </dl>
801
802 <h3>ノードからの検索結果を扱うAPI</h3>
803
804 <p>構造体型 `ESTNODERES' は、ノードからの検索結果を抽象化したものです。結果には、該当文書の情報のリストとヒント情報が含まれます。`ESTNODERES' の実体が直接参照されることはなく、必ずポインタを介して間接参照されます。このポインタおよびその参照先を総じてノード結果オブジェクトと呼びます。ノード結果オブジェクトは関数 `est_node_search' によって生成され、`est_noderes_delete' によって破棄されます。生成されたノード結果オブジェクトは必ず破棄してください。</p>
805
806 <p>構造体型 `ESTRESDOC' は、ノードからの検索結果の各文書の情報を抽象化したものです。文書情報には、複数の属性と一つのスニペットが含まれます。`ESTRESDOC' の実体が直接参照されることはなく、必ずポインタを介して間接参照されます。このポインタおよびその参照先を総じて結果文書オブジェクトと呼びます。結果文書オブジェクトは関数 `est_noderes_get_doc' によって参照できますが、実体はノード結果オブジェクトの内部で管理されるため、破棄する必要はありません。</p>
807
808 <p>ノード結果オブジェクトと結果文書オブジェクトの典型的なライフサイクルを以下に示します。</p>
809
810 <pre>ESTNODERES *nres;
811 CBMAP *hints;
812 ESTRESDOC *rdoc;
813 int i;
814
815 /* ノード結果オブジェクトを生成する */
816 nres = est_node_search(node, cond, 1);
817
818 /* ヒントを取り出す */
819 hints = est_noderes_hints(nres);
820
821 /* ここでヒントを表示する */
822
823 /* 該当文書のリストを走査する */
824 for(i = 0; i &lt; est_noderes_doc_num(nres); i++){
825
826 /* 結果文書オブジェクトを取り出す */
827 rdoc = est_noderes_get_doc(nres, i);
828
829 /* ここで文書情報を表示する */
830
831 }
832
833 /* ノード結果オブジェクトを破棄する */
834 est_noderes_delete(nres);
835 </pre>
836
837 <p>ノード結果オブジェクトを破棄するには、関数 `est_noderes_delete' を用います。</p>
838
839 <dl>
840 <dt><kbd>void est_noderes_delete(ESTNODERES *<var>nres</var>);</kbd></dt>
841 <dd>`nres' はノード結果オブジェクトを指定します。</dd>
842 </dl>
843
844 <p>ノード結果オブジェクトからヒントのマップオブジェクトを取得するには、関数 `est_noderes_hints' を用いる。</p>
845
846 <dl>
847 <dt><kbd>CBMAP *est_noderes_hints(ESTNODERES *<var>nres</var>);</kbd></dt>
848 <dd>`nres' はノード結果オブジェクトを指定します。戻り値はヒントのマップオブジェクトです。キーには "VERSION"、"NODE"、"HIT"、"HINT#n"、"DOCNUM"、"WORDNUM"、"TIME"、"LINK#n"、"VIEW" があります。戻り値のオブジェクトの寿命はノード結果オブジェクトのそれと同期します。</dd>
849 </dl>
850
851 <p>ノード結果オブジェクトに含まれる文書情報の数を取得するには、関数 `est_noderes_doc_num' を用います。</p>
852
853 <dl>
854 <dt><kbd>int est_noderes_doc_num(ESTNODERES *<var>nres</var>);</kbd></dt>
855 <dd>`nres' はノード結果オブジェクトを指定します。戻り値はノード結果オブジェクトに含まれる文書情報の数です。</dd>
856 </dl>
857
858 <p>ノード結果オブジェクトから個々の結果文書オブジェクトを取得するには、関数 `est_noderes_get_doc' を用います。</p>
859
860 <dl>
861 <dt><kbd>ESTRESDOC *est_noderes_get_doc(ESTNODERES *<var>nres</var>, int <var>index</var>);</kbd></dt>
862 <dd>`nres' はノード結果オブジェクトを指定します。`index' は取り出す要素のインデックスを指定します。戻り値は文書オブジェクトか、`index' が要素数と等しいか大きければ `NULL' です。戻り値のオブジェクトの寿命はノード結果オブジェクトのそれと同期します。</dd>
863 </dl>
864
865 <p>結果文書オブジェクトからURIを取得するには、関数 `est_resdoc_uri' を用います。</p>
866
867 <dl>
868 <dt><kbd>const char *est_resdoc_uri(ESTRESDOC *<var>rdoc</var>);</kbd></dt>
869 <dd>`rdoc' は結果文書オブジェクトを指定します。戻り値は結果文書オブジェクトのURIです。戻り値の文字列の寿命は結果文書オブジェクトのそれと同期します。</dd>
870 </dl>
871
872 <p>結果文書オブジェクトの属性名のリストを取得するには、関数 `est_resdoc_attr_names' を用います。</p>
873
874 <dl>
875 <dt><kbd>CBLIST *est_resdoc_attr_names(ESTRESDOC *<var>rdoc</var>);</kbd></dt>
876 <dd>`rdoc' は結果文書オブジェクトを指定します。戻り値は結果文書オブジェクトの属性名のリストです。戻り値のオブジェクトは `cblistopen' で生成されているので、不要になったら `cblistclose' で破棄してください。</dd>
877 </dl>
878
879 <p>結果文書オブジェクトの属性の値を取得するには、関数 `est_resdoc_attr' を用います。</p>
880
881 <dl>
882 <dt><kbd>const char *est_resdoc_attr(ESTRESDOC *<var>rdoc</var>, const char *<var>name</var>);</kbd></dt>
883 <dd>`rdoc' は結果文書オブジェクトを指定します。`name' は属性名を指定します。戻り値は属性値ですが、該当する属性がない場合は `NULL' が返されます。戻り値の文字列の寿命は文書オブジェクトのそれと同期します。</dd>
884 </dl>
885
886 <p>結果文書オブジェクトのスニペットを取得するには、関数 `est_resdoc_snippet' を用います。</p>
887
888 <dl>
889 <dt><kbd>const char *est_resdoc_snippet(ESTRESDOC *<var>rdoc</var>);</kbd></dt>
890 <dd>`rdoc' は結果文書オブジェクトを指定します。戻り値は結果文書オブジェクトのスニペットの文字列です。その形式はタブ区切り文字列(TSV)です。その各行は表示すべき文字列です。ほとんどの行は単一のフィールドしか持ちませんが、いくつかは二つのフィールドを持ちます。もし第2フィールドが存在したならば、第1フィールドはハイライトして表示すべき文字列で、第2フィールドはその正規化された文字列です。戻り値の文字列の寿命は結果文書オブジェクトのそれと同期します。</dd>
891 </dl>
892
893 <h3>並列性</h3>
894
895 <p>ノード接続オブジェクト、ノード結果オブジェクト、結果文書オブジェクトのいずれも、スレッド間で共有してはなりません。マルチスレッドを用いる場合は、各スレッドで別々のオブジェクトを使うようにしてください。その条件さえ守れば、ノードAPIの各関数はマルチスレッドセーフなものとして扱えます。</p>
896
897 <hr />
898
899 <h2 id="estcall">クライアント用コマンド</h2>
900
901 <p>ここでは、ノード管理用コマンドestcallの詳細な仕様を説明します。検索もできるので、estcallをスクリプト言語から呼び出せばそれなりのアプリケーションが簡単に作れます。</p>
902
903 <h3>書式</h3>
904
905 <p>estcallは多くのサブコマンドの集合体です。サブコマンドの名前は第1引数で指定されます。その他の引数はサブコマンドの種類に応じて解釈されます。<var>nurl</var>という引数は操作対象のノードのURLです。-proxyオプションはプロクシのホスト名とポート番号を指定します。-toutはタイムアウトの時間を秒単位で指定します。-authは認証のユーザ名とパスワードを指定します。</p>
906
907 <dl>
908 <dt><kbd>estcall put [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] <var>nurl</var> [<var>file</var>]</kbd></dt>
909 <dd>文書ドラフト形式のファイルを登録します。</dd>
910 <dd><var>file</var>は対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。</dd>
911 </dl>
912
913 <dl>
914 <dt><kbd>estcall out [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] <var>nurl</var> <var>expr</var></kbd></dt>
915 <dd>特定の文書の情報をインデックスから削除します。</dd>
916 <dd><var>expr</var>は対象のID番号かURIを指定します。</dd>
917 </dl>
918
919 <dl>
920 <dt><kbd>estcall get [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] <var>nurl</var> <var>expr</var> [<var>attr</var>]</kbd></dt>
921 <dd>特定の文書の情報を文書ドラフト形式で出力します。</dd>
922 <dd><var>expr</var>は対象のID番号かURIを指定します。</dd>
923 <dd><var>attr</var>を付けると、その属性の値のみを出力します。</dd>
924 </dl>
925
926 <dl>
927 <dt><kbd>estcall uriid [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] <var>nurl</var> <var>uri</var></kbd></dt>
928 <dd>指定したURIの文書のID番号を出力します。</dd>
929 <dd><var>uri</var>は対象のURIを指定します。</dd>
930 </dl>
931
932 <dl>
933 <dt><kbd>estcall inform [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] <var>nurl</var></kbd></dt>
934 <dd>ノードの名前とラベルと登録文書数と登録語数を出力します。</dd>
935 </dl>
936
937 <dl>
938 <dt><kbd>estcall search [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] [-vx] [-attr <var>expr</var>] [-ord <var>expr</var>] [-max <var>num</var>] [-dpt <var>num</var>] <var>nurl</var> [<var>phrase</var>]</kbd></dt>
939 <dd>ノードに登録された文書を検索します。</dd>
940 <dd><var>phrase</var>は全文検索の検索式を指定します。</dd>
941 <dd>-vxを付けると、XML形式にして結果を出力します。</dd>
942 <dd>-attrは絞り込みの属性条件を指定します。複数指定可能です。</dd>
943 <dd>-ordはソート条件を指定します。デフォルトはスコアの降順です。</dd>
944 <dd>-maxは最大表示件数を指定します。負数にすると無制限になります。デフォルトは10件です。</dd>
945 <dd>-dptはメタ検索の深度を指定します。デフォルトは0です。</dd>
946 </dl>
947
948 <dl>
949 <dt><kbd>estcall setuser [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] <var>nurl</var> <var>name</var> <var>mode</var></kbd></dt>
950 <dd>ユーザ権限を設定します。</dd>
951 <dd><var>name</var>はユーザ名を指定します。</dd>
952 <dd><var>mode</var>が1ならそのユーザを管理者にし、2ならそのユーザを通常ユーザにし、0ならユーザ権限を削除します。</dd>
953 </dl>
954
955 <dl>
956 <dt><kbd>estcall setlink [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] <var>nurl</var> <var>url</var> <var>label</var> <var>credit</var></kbd></dt>
957 <dd>リンクを設定します。</dd>
958 <dd><var>url</var>はリンク先のノードのURLを指定します。</dd>
959 <dd><var>label</var>はラベルを指定します。</dd>
960 <dd><var>credit</var>は信頼度を指定します。値が負数の場合はそのリンクを削除します。</dd>
961 </dl>
962
963 <dl>
964 <dt><kbd>estcall raw [-proxy <var>host</var>:<var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] [-np] [-eh <var>expr</var>] <var>url</var> [<var>file</var>]</kbd></dt>
965 <dd>HTTPリクエストを直接制御してレスポンスを出力します。</dd>
966 <dd><var>url</var>は操作対象のURLを指定します。</dd>
967 <dd><var>file</var>が指定された場合はその内容をPOSTメソッドで送信します。指定されなかった場合はGETメソッドを用います。"-" を指定すると標準入力を読み込みます。</dd>
968 <dd>-npを付けると、レスポンスヘッダも含めて出力します。</dd>
969 <dd>-ehは追加するHTTPヘッダを指定します。デフォルトではHostとConnectionとUser-AgentContent-Lengthが付加されます。</dd>
970 </dl>
971
972 <p>全てのサブコマンドは、処理が正常に終了した場合には0を、そうでない場合は1を終了ステータスにします。</p>
973
974 <h3>応用例:ノードマスタの操作</h3>
975
976 <p>ノードマスタ自体の操作はAPIにはありませんので、rawサブコマンドを用いてください。例えば、ノードマスタをシャットダウンするには、以下のようなコマンドを実行します。</p>
977
978 <pre>estcall raw -auth admin admin \
979 'http://localhost:1978/master?action=shutdown'
980 </pre>
981
982 <p>ユーザを追加するには、以下のようなコマンドを実行します。</p>
983
984 <pre>estcall raw -auth admin admin \
985 'http://localhost:1978/master?action=useradd&amp;name=mikio&amp;passwd=iloveyou'
986 </pre>
987
988 <p>POSTメソッドを使うには、以下のようにします。</p>
989
990 <pre>echo -n 'action=useradd&amp;name=mikio&amp;passwd=iloveyou' |
991 estcall raw -auth admin admin \
992 -eh 'Content-Type: application/x-www-form-urlencoded' \
993 'http://localhost:1978/master' -
994 </pre>
995
996 <hr />
997
998 <h2 id="tips">助言</h2>
999
1000 <p>ここでは、Hyper EstraierのP2P機構を活用するためのコツをいくつか紹介します。</p>
1001
1002 <h3>パラメータの詳細</h3>
1003
1004 <p>メタ検索の深度は0が起点です。深度が0なら自前のインデックスのみを対象とし、1ならリンク先のノードも対象とし、2ならその先も対象とし、3ならさらにその先も対象とします。それ以上の値も指定できます。クライアントが指定した深度がノードマスタの設定ファイルで指定した深度より大きい場合は、ノードマスタで指定した方に抑えられます。</p>
1005
1006 <p>リンクの信頼度は検索結果の各文書の順位を決定する際に利用されます。各ノードから収集した結果をマージする際には、各文書について、各ノードにおける順位を表示件数から引いた値に信頼度を掛けた値をスコアとして算出します。例えば、信頼度15000のノードに対して10件の文書を問い合わせた結果の4位の文書のスコアは「(10 - 4) * 15000」で90000になります。このスコアが高い順ものから提示されます。自前のインデックスの信頼度は10000で固定です。したがって、他のノードへのリンクの信頼度は、その結果を自前のインデックスの結果より上位にしたい場合は10000より大きくし、下位にしたい場合は10000より小さくするとよいでしょう。</p>
1007
1008 <h3>認証機構の詳細</h3>
1009
1010 <p>認証機構のモードは3種類あり、設定ファイルで指定されます。デフォルトは2です。以下の表では、各種の操作に対して匿名を許可する場合は「○」、認証を行う場合は「×」を示します。ノードサーバの管理操作とは、put_doc、out_doc、_set_user、_set_linkのことです。ノードサーバに対するそれ以外の操作は通常操作です。</p>
1011
1012 <table summary="authorization mode">
1013 <tr>
1014 <th abbr="mode"></th>
1015 <th abbr="1">1(none)</th>
1016 <th abbr="2">2(admin)</th>
1017 <th abbr="3">3(all)</th>
1018 </tr>
1019 <tr>
1020 <td>ノードマスタの操作</td>
1021 <td>×</td>
1022 <td>×</td>
1023 <td>×</td>
1024 </tr>
1025 <tr>
1026 <td>ノードサーバの管理操作</td>
1027 <td></td>
1028 <td>×</td>
1029 <td>×</td>
1030 </tr>
1031 <tr>
1032 <td>ノードサーバの通常操作</td>
1033 <td></td>
1034 <td></td>
1035 <td>×</td>
1036 </tr>
1037 </table>
1038
1039 <p>認証機構があっても平文をネットワーク上に流すのではセキュリティとしては不十分です。特にHTTPの基本認証のセキュリティは低く、邪悪な人達には全く無力と言っても過言ではありません。したがって、重要なデータを扱う際には、通信を暗号化することをお薦めします。ただし、Hyper Estraier自体は暗号通信の機能を提供しませんので、Apache等をリバースプロクシとして利用してください。同時接続数が多い場合は市販のSSLアクセラレータを利用するとよいでしょう。</p>
1040
1041 <p>このような認証機構が気に入らない場合は、フロントエンドのクライアントを実装して、そこでアカウント管理と認証を行ってください。フロントエンドがバックエンドであるノードマスタやノードサーバにアクセスする際には常にスーパーユーザを用いるとよいでしょう。Apacheをフロントエンドにすれば、mod_auth_ldapを使ってLDAPによる認証を行ったり、mod_auth_radiusを使ってRADIUSによる認証を行ったりできます。Locationディレクティブなどを駆使すれば各メソッドのアクセス権限を詳細に設定することもできます。</p>
1042
1043 <h3>通常のWeb機能</h3>
1044
1045 <p>ノードマスタは通常のWebサーバとしての機能も備えています。この機能は検索対象文書の実体を公開する場合に便利でしょう。例えば、「/home/www/public_html」以下を公開したい場合は、設定ファイルに以下のように書きます。</p>
1046
1047 <pre>docroot: /home/www/public_html
1048 indexfile: index.html
1049 </pre>
1050
1051 <h3>負荷テスト用コマンド</h3>
1052
1053 <p>各種のWebアプリケーションに対する負荷テストのためのユーティリティとして、estloadコマンドが提供されます。以下の書式を持ちます。</p>
1054
1055 <dl>
1056 <dt><kbd>estload [-t <var>num</var>] [-l <var>num</var>] [-i <var>num</var>] [-p] [-q] [<var>file</var>|<var>url</var>]</kbd></dt>
1057 <dd><var>file</var>を指定した場合、そのファイルの各行に含まれるURLのリクエストを発行します。<var>url</var>を指定した場合、そのURLのリクエストを発行します。何も指定しなかった場合、標準入力の各行に含まれるURLのリクエストを発行します。</dd>
1058 <dd>-tは並行して動かすスレッドの数を指定します。デフォルトは1です。</dd>
1059 <dd>-lはリストを繰り返す回数を指定します。デフォルトは1です。</dd>
1060 <dd>-iはリクエストを発行してからスリープする時間をミリ秒単位で回数を指定します。デフォルトは0です。</dd>
1061 <dd>-pを指定すると、レスポンスを表示します。</dd>
1062 <dd>-qを指定すると、進捗状態を表示しません。</dd>
1063 </dl>
1064
1065 <h3>初期導入の効率化</h3>
1066
1067 <p>大規模なサイトの立ち上げを素早く行いたい場合、estcmdを利用するかアプリケーションを作成するかして、コアAPIのレベルでインデックスを作った方がよいでしょう。そうして作ったインデックスは、ノードディレクトリに置くことでノードサーバとして利用することができます。例えば、/home/mikio以下の文書を登録した、名前が「mikio」でラベルが「Mikio Hirabayashi」のノードサーバを設置するには、以下のようにします。</p>
1068
1069 <pre>estmaster init casket
1070 estcmd gather -sd -il ja casket/_node/mikio /home/mikio
1071 estcmd meta casket/_node/mikio label "Mikio Hirabayashi"
1072 </pre>
1073
1074 <p>ユーザやリンクの設定は、ノードマスタを起動させた上で、ノードAPIやestcallコマンドを使って行ってください。なお、estcallにはestcmd gatherのようなギャザラ用のサブコマンドは用意されていません。findやestcmd draftなどを組み合わせれば同等のことは可能です。</p>
1075
1076 <hr />
1077
1078 </body>
1079
1080 </html>
1081
1082 <!-- END OF FILE -->

  ViewVC Help
Powered by ViewVC 1.1.26