/[hyperestraier]/upstream/0.5.3/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 /upstream/0.5.3/doc/nguide-ja.html

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10 - (show annotations)
Wed Aug 3 15:25:48 2005 UTC (18 years, 9 months ago) by dpavlin
File MIME type: text/html
File size: 82072 byte(s)
import of upstream 0.5.3

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: Mon, 01 Aug 2005 00:50:38 +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(C言語)の使い方についても説明します。ノードAPIには<a href="japidoc/">Java版</a><a href="rbapidoc/">Ruby版</a>もあります。</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」にアクセスしてみてください。表示された画面で、「phrase」の欄に検索語を入れてから、「search」ボタンを押せば検索できます。「depth」の数を増やせばメタ検索もできます。左側に表示されたリンクを選択すると、そのノードを起点にして再検索が行われます。</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 trustednode:
286 denyuntrusted: 0
287 cachesize: 64
288 specialcache:
289 snipwwidth: 480
290 sniphwidth: 96
291 snipawidth: 96
292 uilprefix: file:///home/mikio/public_html/
293 uigprefix: http://localhost/
294 uigsuffix:
295 uidirindex: index.html
296 uireplace: //localhost/{{!}}//127.0.0.1/
297 uireplace: //127.0.0.1:80/{{!}}//127.0.0.1/
298 uiextattr: @author|Author
299 uiextattr: @mdate|Modification Date
300 uismplphrase: 1
301 </pre>
302
303 <p>それぞれの変数の機能を以下に示します。</p>
304
305 <ul>
306 <li><kbd>hostname</kbd> : サーバのホスト名を指定します。</li>
307 <li><kbd>portnum</kbd> : サーバのポート番号を指定します。</li>
308 <li><kbd>runmode</kbd> : 運用モードを指定します。1は通常モード、2は読み込み専用モードです。</li>
309 <li><kbd>authmode</kbd> : 認証モードを指定します。1は認証を一切しないモード、2は管理機能のみで認証を行うモード、3は全ての操作で認証を行うモードです。</li>
310 <li><kbd>maxconn</kbd> : 最大同時接続数を指定します。</li>
311 <li><kbd>sessiontimeout</kbd> : セッションのタイムアウトを秒単位で指定します。未実装です。</li>
312 <li><kbd>searchtimeout</kbd> : 検索処理のタイムアウトを秒単位で指定します。</li>
313 <li><kbd>searchdepth</kbd> : メタ検索の最大深度を指定します。</li>
314 <li><kbd>proxyhost</kbd> : プロクシサーバのホスト名を指定します。</li>
315 <li><kbd>proxyport</kbd> : プロクシサーバのポート番号を指定します。</li>
316 <li><kbd>loglevel</kbd> : ログのレベルを指定します。1ならデバッグ、2なら通常、3なら警告、4ならエラー、5なら無しです。</li>
317 <li><kbd>docroot</kbd> : 通常のWebサーバとして公開するディレクトリのフルパスを指定します。</li>
318 <li><kbd>indexfile</kbd> : 通常のWebサーバとして公開する際のディレクトリのインデックスファイルの名前を指定します。不要なら空文字列にします。</li>
319 <li><kbd>trustednode</kbd> : 認証を省略するノード(クライアント)のIPアドレスを10進数ドット付き表記で指定します。複数回指定可能です。</li>
320 <li><kbd>denyuntrusted</kbd> : 正数なら上記のノード以外からのアクセスを拒絶します。</li>
321 <li><kbd>cachesize</kbd> : インデックス用キャッシュのサイズをメガバイト単位で指定します。</li>
322 <li><kbd>specialcache</kbd> : スペシャルキャッシュの属性名を指示します。</li>
323 <li><kbd>snipwwidth</kbd> : 検索結果の紹介文の全体の幅を指示します。</li>
324 <li><kbd>sniphwidth</kbd> : 検索結果の紹介文を作る際に文書の冒頭から取得する幅を指示します。</li>
325 <li><kbd>snipawidth</kbd> : 検索結果の紹介文を作る際に検索語の周辺から取得する幅を指示します。</li>
326 <li><kbd>uilprefix</kbd> : 登録文書群のローカルURIの接頭辞を指示します。</li>
327 <li><kbd>uigprefix</kbd> : 登録文書群の公開URIに付加する接頭辞を指示します。</li>
328 <li><kbd>uigsuffix</kbd> : 登録文書群の公開URIに付加する接尾辞を指示します。</li>
329 <li><kbd>uidirindex</kbd> : ディレクトリのインデックスファイルの名前を指示します。</li>
330 <li><kbd>uireplace</kbd> : URIの変換前後の文字列を「{{!}}」で区切って指定します。複数回指定できます。</li>
331 <li><kbd>uiextattr</kbd> : 表示する属性の名前とラベルを「|」で区切って指示します。複数回指定できます。</li>
332 <li><kbd>uismplphrase</kbd> : 正数ならUIの検索条件式を簡便法にします。</li>
333 </ul>
334
335 <h3>ユーザアカウントファイル</h3>
336
337 <p>ユーザアカウントファイルは、ユーザ名、暗号化されたパスワード、フラグ、フルネーム、雑多な情報をタブ区切りで並べた行を並べたものです。文字コードはUTF-8です。デフォルトでは以下のような内容になっています。</p>
338
339 <pre>admin 21232f297a57a5a743894a0e4a801fc3 s Carolus Magnus Administrator
340 </pre>
341
342 <p>パスワードはMD5のハッシュ値で表現されます。フラグには、管理者であることを示す「s」とアクセス禁止者であることを示す「b」を用いることができます。フラグとフルネームと雑多な情報は省略可能です。</p>
343
344 <h3>内蔵ユーザインターフェイス</h3>
345
346 <p>Webブラウザで、ノードマスタの相対URL「/masterui」にアクセスすると、管理用のインターフェイスを使うことができます。管理用インターフェイスを使うには、スーパーユーザのアカウントでログインする必要があります。</p>
347
348 <p>Webブラウザで、ノードサーバのURLの後ろに「/searchui」をつけたURLにアクセスすると、検索用のインターフェイスを使うことができます。</p>
349
350 <hr />
351
352 <h2 id="protocol">プロトコル</h2>
353
354 <p>ノード間およびクライアント・ノード間の通信はHTTPベースのプロトコルに基づいて行われます。ここでは、その具体的な仕様について見て行きます。</p>
355
356 <h3>概要</h3>
357
358 <p>ノードマスタおよびノードサーバはHTTP/1.0を実装しています。現状では、HTTP/1.1特有の機能であるキープアライブ接続やチャンクエンコーディングや各種のネゴシエーションには対応していません。</p>
359
360 <p>HTTPのメソッドはGETでもPOSTでも構いませんが、情報を取得するだけの場合はGET、ノードマスタやノードサーバに更新が発生する場合はPOSTを使うことが推奨されます。パラメータの文字コードはUTF-8ですが、URLに含められない文字にはURLエンコード(application/x-www-form-urlencoded)を施す必要があります。GETメソッドで送れるデータのサイズは8000バイトまでです。ユーザ名とパスワードの受け渡しはHTTPのBasic認証機構を使って行われます。</p>
361
362 <p>処理が成功した場合は原則的に200または202のステータスコードが返ります。エラーの場合は、以下のステータスコードが返ります。</p>
363
364 <ul>
365 <li>400 : パラメータが不正です。</li>
366 <li>401 : 認証情報がないか、間違っています。</li>
367 <li>403 : 現在のアカウントにはアクセス権限がありません。</li>
368 <li>404 : 接続先のパスが存在しません。</li>
369 <li>500 : サーバに原因があるエラーが発生しました。</li>
370 </ul>
371
372 <p>検索等の操作ではメッセージボディに結果のデータが含まれます。データ形式はUTF-8のテキストですが、タブや改行で構造化されている場合もあります。操作の種類によって結果の解釈方法は変わります。</p>
373
374 <h3>ノードマスタの操作</h3>
375
376 <p>ノードマスタに対する操作は「/master」というパスに接続することで行います。例えばホスト名が「skyhigh.estraier.go.jp」でポートが「8888」の場合は、「http://skyhigh.estraier.go.jp:8888/master」に接続することになります。ノードマスタの操作はスーパーユーザのみが行えます。ノードマスタの操作はいくつかのサブコマンドからなりますが、サブコマンドの名前は「action」パラメータで指定します。その他のパラメータはサブコマンドによって変わります。パラメータの順番は任意です。</p>
377
378 <dl>
379 <dt><kbd>/master?action=shutdown</kbd></dt>
380 <dd>ノードマスタをシャットダウンします。</dd>
381 <dd>パラメータはありません。</dd>
382 <dd>成功すれば202のステータスコードが返信されます。</dd>
383 </dl>
384
385 <dl>
386 <dt><kbd>/master?action=userlist</kbd></dt>
387 <dd>ユーザアカウントのリストを取得します。</dd>
388 <dd>パラメータはありません。</dd>
389 <dd>成功すれば200のステータスコードとともにTSV形式のリストが返信されます。各行が各ユーザの情報を表し、ユーザ名、暗号化されたパスワード、フラグ、フルネーム、その他の情報をタブ区切りのフィールドとして表現します。</dd>
390 </dl>
391
392 <dl>
393 <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>
394 <dd>ユーザアカウントを追加します。</dd>
395 <dd><var>name</var>は新規のユーザ名を指定します。必須です。ユーザ名に利用できる文字はUS-ASCIIの英数字とハイフンとアンダーバーのみです。既存のユーザ名と重複していた場合はエラーになります。</dd>
396 <dd><var>passwd</var>はパスワードを指定します。必須です。</dd>
397 <dd><var>flags</var>はフラグを指定します。省略可能です。</dd>
398 <dd><var>fname</var>はフルネームを指定します。省略可能です。</dd>
399 <dd><var>misc</var>は雑多な情報を指定します。省略可能です。</dd>
400 <dd>成功すれば200のステータスコードが返信されます。</dd>
401 <dd>パスワードを送信することになるため、パラメータはPOSTメソッドで送信すべきです。</dd>
402 </dl>
403
404 <dl>
405 <dt><kbd>/master?action=userdel&amp;name=<var>str</var></kbd></dt>
406 <dd>ユーザアカウントを削除します。</dd>
407 <dd><var>name</var>はユーザ名を指定します。必須です。</dd>
408 <dd>成功すれば200のステータスコードが返信されます。</dd>
409 </dl>
410
411 <dl>
412 <dt><kbd>/master?action=nodelist</kbd></dt>
413 <dd>ノードサーバのリストを取得します。</dd>
414 <dd>パラメータはありません。</dd>
415 <dd>成功すれば200のステータスコードとともにTSV形式のリストが返信されます。各行が各ノードの情報を表し、ノード名、ラベル、登録文書数、登録語数、サイズをタブ区切りのフィールドとして表現します。</dd>
416 </dl>
417
418 <dl>
419 <dt><kbd>/master?action=nodeadd&amp;name=<var>str</var>&amp;label=<var>str</var></kbd></dt>
420 <dd>ノードサーバを追加します。</dd>
421 <dd><var>name</var>は新規のノード名を指定します。必須です。ノード名に利用できる文字はUS-ASCIIの英数字とハイフンとアンダーバーのみです。既存のノード名と重複していた場合はエラーになります。</dd>
422 <dd><var>label</var>はラベルを指定します。省略可能です。省略した場合はノード名と同じラベルが付けられます。</dd>
423 <dd>成功すれば200のステータスコードが返信されます。</dd>
424 </dl>
425
426 <dl>
427 <dt><kbd>/master?action=nodedel&amp;name=<var>str</var></kbd></dt>
428 <dd>ノードサーバを削除します。</dd>
429 <dd><var>name</var>はノード名を指定します。必須です。</dd>
430 <dd>成功すれば200のステータスコードが返信されます。</dd>
431 </dl>
432
433 <h3>ノードサーバの操作</h3>
434
435 <p>各ノードサーバに対する操作は「/node/」の後にノード名をつけたパスに接続することで行います。例えばホスト名が「skyhigh.estraier.go.jp」でポートが「8888」でノード名が「foo」の場合は、「http://skyhigh.estraier.go.jp:8888/node/foo」に接続することになります。ノードマスタの操作はいくつかのサブコマンドからなりますが、サブコマンドの名前はノード名の後に「/」を挟んで指定します。パラメータはサブコマンドによって変わります。パラメータの順番は任意です。ノードマスタの操作は検索系と更新系の二つに大別できますが、前者はどのユーザでも実行でき、後者はそのノードの管理者のみが実行できます。</p>
436
437 <dl>
438 <dt><kbd>/node/<var>name</var>/inform</kbd></dt>
439 <dd>ノードの情報を取得します。</dd>
440 <dd>パラメータはありません。</dd>
441 <dd>成功すれば200のステータスコードとともにTSV形式のデータが返信されます。第1行目は、ノード名、ラベル、登録文書数、登録語数、サイズをタブ区切りのフィールドとして表現したものです。空行を挟んで、次の空行までの各行は管理者のユーザ名のリストです。空行を挟んで、次の空行までの各行は一般ユーザのユーザ名のリストです。空行を挟んで、以降はリンク情報のリストです。リンク情報の各行はURLとラベルと信頼度をタブ区切りのフィールドで表現したものです。</dd>
442 </dl>
443
444 <dl>
445 <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>
446 <dd>検索を実行します。</dd>
447 <dd><var>phrase</var>は検索フレーズを指定します。省略可能です。書式はコアAPIのものと同じです。</dd>
448 <dd><var>attr</var>は属性条件を指定します。省略可能です。<var>attr1</var>から<var>attr9</var>を使って複数の属性条件を指定することも可能です。書式はコアAPIのものと同じです。</dd>
449 <dd><var>order</var>はソート条件を指定します。省略可能です。書式はコアAPIのものと同じです。</dd>
450 <dd><var>max</var>は取得件数を指定します。省略可能です。デフォルトは10です。</dd>
451 <dd><var>options</var>はオプションを指定します。省略可能です。値はコアAPIのものと同じです。</dd>
452 <dd><var>depth</var>はメタ検索の深度を指定します。省略可能です。デフォルトは0です。</dd>
453 <dd>成功すれば200のステータスコードとともに検索結果のデータが返信されます。詳細は後述します。</dd>
454 </dl>
455
456 <dl>
457 <dt><kbd>/node/<var>name</var>/get_doc?id=<var>num</var>&amp;uri=<var>str</var></kbd></dt>
458 <dd>文書の情報を取得します。</dd>
459 <dd><var>id</var>は対象文書のID番号を指定します。省略可能です。</dd>
460 <dd><var>uri</var>は対象文書のURIを指定します。省略可能です。</dd>
461 <dd>成功すれば200のステータスコードとともに文書ドラフト形式のデータが返信されます。</dd>
462 </dl>
463
464 <dl>
465 <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>
466 <dd>文書の属性値を取得します。</dd>
467 <dd><var>id</var>は対象文書のID番号を指定します。省略可能です。</dd>
468 <dd><var>uri</var>は対象文書のURIを指定します。省略可能です。</dd>
469 <dd><var>attr</var>は属性名を指定します。必須です。</dd>
470 <dd>成功すれば200のステータスコードとともに属性値のデータが返信されます。</dd>
471 </dl>
472
473 <dl>
474 <dt><kbd>/node/<var>name</var>/uri_to_id?uri=<var>str</var></kbd></dt>
475 <dd>URIに対応する文書のID番号を取得します。</dd>
476 <dd><var>uri</var>は対象文書のURIを指定します。必須です。</dd>
477 <dd>成功すれば200のステータスコードとともに該当文書のID番号が返信されます。</dd>
478 </dl>
479
480 <dl>
481 <dt><kbd>/node/<var>name</var>/put_doc?draft=<var>str</var></kbd></dt>
482 <dd>文書を登録します。管理者のみが利用できます。</dd>
483 <dd><var>draft</var>は対象文書の内容を文書ドラフト形式で指定します。必須です。</dd>
484 <dd>成功すれば200のステータスコードが返信されます。</dd>
485 </dl>
486
487 <dl>
488 <dt><kbd>/node/<var>name</var>/out_doc?id=<var>num</var>&amp;uri=<var>str</var></kbd></dt>
489 <dd>文書を削除します。管理者のみが利用できます。</dd>
490 <dd><var>id</var>は対象文書のID番号を指定します。省略可能です。</dd>
491 <dd><var>uri</var>は対象文書のURIを指定します。省略可能です。</dd>
492 <dd>成功すれば200のステータスコードが返信されます。</dd>
493 </dl>
494
495 <dl>
496 <dt><kbd>/node/<var>name</var>/_set_user?name=<var>str</var>&amp;mode=<var>num</var></kbd></dt>
497 <dd>ユーザのアクセス権限を設定します。管理者のみが利用できます。</dd>
498 <dd><var>name</var>はユーザ名を指定します。必須です。</dd>
499 <dd><var>mode</var>は操作内容を指定します。必須です。0なら指定したユーザのアクセス権限を剥奪します。1なら指定したユーザを管理者として登録します。2なら指定したユーザを一般ユーザとして登録します。</dd>
500 <dd>成功すれば200のステータスコードが返信されます。</dd>
501 </dl>
502
503 <dl>
504 <dt><kbd>/node/<var>name</var>/_set_link?url=<var>str</var>&amp;label=<var>str</var>&amp;credit=<var>num</var></kbd></dt>
505 <dd>他のノードへのリンクを設定します。管理者のみが利用できます。</dd>
506 <dd><var>url</var>はリンク先のノードサーバのURLを指定します。必須です。既存のリンクと重複していた場合はラベルと信頼度が再設定されます。</dd>
507 <dd><var>label</var>はリンク先のノードサーバのラベルを指定します。必須です。</dd>
508 <dd><var>credit</var>はリンクの信頼度を指定します。省略可能です。省略した場合はリンクが削除されます。</dd>
509 <dd>成功すれば200のステータスコードが返信されます。</dd>
510 </dl>
511
512 <p>ノードマスタのスーパーユーザは各ノードの管理権限を持ちますが、各ノードの管理者はノードマスタのスーパーユーザとは限らないということに注意してください。また、各ノードの一般ユーザは、認証モードを3(all)にした場合にのみ意味を持ちます。</p>
513
514 <h3>検索結果の書式</h3>
515
516 <p>searchコマンドの結果のエンティティボディは、MIMEのマルチパートに似た形式をとります。以下に例を示します。</p>
517
518 <pre>--------[2387AD2E34554FFF]--------
519 VERSION 0.9
520 NODE http://localhost:1978/node/sample1
521 HIT 2
522 HINT#1 give 2
523 DOCNUM 2
524 WORDNUM 31
525 TIME 0.001
526 LINK#0 http://localhost:1978/node/sample1 Sample1 10000 2 31 2731304 2
527 LINK#1 http://localhost:1978/node/sample2 Sample2 4000 3 125 8524522 1
528 VIEW SNIPPET
529
530 --------[2387AD2E34554FFF]--------
531 #nodelabel=Sample Node One
532 #nodeurl=http://localhost:1978/node/sample1
533 @id=1
534 @uri=http://localhost/foo.html
535
536 You may my glories and my state dispose, But not my griefs; still am I king of those. (
537 Give give
538 it u
539
540 p, Yo!
541 Give give
542 it up, Yo!)
543
544 --------[2387AD2E34554FFF]--------
545 #nodelabel=Sample Node One
546 #nodeurl=http://localhost:1978/node/sample1
547 @id=2
548 @uri=http://localhost/bar.html
549
550 The faster I go, the behinder I get. (
551 Give give
552 it up, Yo!
553 Give give
554 it up, Yo!)
555
556 --------[2387AD2E34554FFF]--------:END
557 </pre>
558
559 <p>改行コードは単一のLFです。第1行目は区切り文字列の定義です。ここで定義された文字列の行で、パートが区切られます。最後の区切り文字列の末尾には「:END」という文字列がつきます。最初のパートはメタ部です。それ以降のパートは文書部です。</p>
560
561 <p>メタ部は、TSV形式をとります。各行の意味は第1フィールドの文字列で識別できます。以下の種類があります。</p>
562
563 <ul>
564 <li><kbd>VERSION</kbd> : プロトコルのバージョンを示します。</li>
565 <li><kbd>NODE</kbd> : ノードのURLを示します。</li>
566 <li><kbd>HIT</kbd> : 該当文書数の総計を示します。</li>
567 <li><kbd>HINT#<var>n</var></kbd> : 各検索語の該当数を示します。第2フィールドが語で、第3フィールドが該当数です。</li>
568 <li><kbd>DOCNUM</kbd> : 登録文書数の総計を示します。</li>
569 <li><kbd>WORDNUM</kbd> : 登録語数の総計を示します。</li>
570 <li><kbd>TIME</kbd> : 処理にかかった時間をミリ秒単位で示します。</li>
571 <li><kbd>LINK#<var>n</var></kbd> : 各ノードの情報を示します。第2フィールドはURL、第3フィールドはラベル、第4フィールドは信頼度、第5フィールドは登録文書数、第6フィールドは登録語数、第8フィールドはデータベースのサイズ、第8フィールドは該当文書数です。LINK#0はそのノード自身の情報を示します。</li>
572 <li><kbd>VIEW</kbd> : 文書パートの形式を示します。現状ではSNIPPETのみが定義されています。</li>
573 </ul>
574
575 <p>文書部は、該当文書の属性情報とスニペットを示します。最初の空行までが属性情報で、それ以降が紹介文です。属性情報の形式は文書ドラフトと同じです。紹介文の形式はTSVです。その各行は表示すべき文字列です。ほとんどの行は単一のフィールドしか持ちませんが、いくつかは二つのフィールドを持ちます。もし第2フィールドが存在したならば、第1フィールドはハイライトして表示すべき文字列で、第2フィールドはその正規化された文字列です。</p>
576
577 <p>searchコマンドやget_docコマンドの操作を行った際に返される文書情報には、以下の疑似属性が付加されます。</p>
578
579 <ul>
580 <li><kbd>#nodeurl</kbd> : その文書が登録されているノードのURL。</li>
581 <li><kbd>#nodelabel</kbd> : その文書が登録されているノードのラベル。</li>
582 </ul>
583
584 <h3>文書登録の特殊形式</h3>
585
586 <p>put_docコマンドでは大きなサイズのパラメータを送ることが多いですが、それをURLエンコードすると効率が悪くなります。POSTメソッドのContent-Typeヘッダの値を「text/x-estraier-draft」にすると、エンティティボディとして文書ドラフトそのものを送ることができます。例えば、以下のようなリクエストを送信します。</p>
587
588 <pre>POST /node/foo/put_doc HTTP/1.0
589 Content-Type: text/x-estraier-draft
590 Content-Length: 138
591
592 @uri=http://gogo.estraier.go.jp/sample.html
593 @title=Twinkle Twinkle Little Star
594
595 Twinkle, twinkle, little star,
596 How I wonder what you are.
597 </pre>
598
599 <hr />
600
601 <h2 id="nodeapi">ノードAPI</h2>
602
603 <p>ノードサーバを操作する際にHTTPを駆使するのが面倒な場合はノードAPIを使うと便利です。ここではその詳細について説明します。</p>
604
605 <h3>概要</h3>
606
607 <p>ノードAPIを使えば、TCP/IPやHTTPについての低レベルな処理を気にすることなく、ノードサーバと通信を行うことができます。コアAPIと比べると通信の分のオーバーヘッドがかかりますが、リモートホストから実行できたり、リーダやライタの区別を気にせずに並列処理ができるといった利点は重要です。</p>
608
609 <p>ノードAPIを使うアプリケーションのソースコードでは、estraier.hとestnode.hとcabin.hとstdlib.hをインクルードしてください。 </p>
610
611 <pre>#include &lt;estraier.h&gt;
612 #include &lt;estnode.h&gt;
613 #include &lt;cabin.h&gt;
614 #include &lt;stdlib.h&gt;
615 </pre>
616
617 <p>アプリケーションをビルドする際には、以下ようなコマンドを実行してください。コアAPIのビルド方法と全く同じです。</p>
618
619 <pre>gcc `estconfig --cflags` -o foobar foobar.c `estconfig --ldflags` `estconfig --libs`
620 </pre>
621
622 <p>ノードAPIを利用する際には、コアAPIで定義されている機能も利用することになりますので、<a href="pguide-ja.html">プログラミングガイド</a>をまだお読みでない場合は先にそちらに目を通しておいてください。</p>
623
624 <h3>初期化のためのAPI</h3>
625
626 <p>ノードAPIのネットワーク機能を使う前提として、プログラムの冒頭でネットワーク環境を初期化してください。また、プログラムが終了する際にはネットワーク環境を破棄してください。</p>
627
628 <p>ネットワーク環境を初期化するには、関数 `est_init_net_env' を用います。</p>
629
630 <dl>
631 <dt><kbd>int est_init_net_env(void);</kbd></dt>
632 <dd>戻り値は成功なら真、エラーなら偽です。同一プログラム内でこの関数を複数回実行しても構いませんが、同じ回数だけ `est_free_net_env' も実行してください。</dd>
633 </dl>
634
635 <p>ネットワーク環境を破棄するには、関数 `est_free_net_env' を用います。</p>
636
637 <dl>
638 <dt><kbd>void est_free_net_env(void);</kbd></dt>
639 <dd>パラメータや戻り値はありません。</dd>
640 </dl>
641
642 <h3>ノードを扱うAPI</h3>
643
644 <p>構造体型 `ESTNODE' は、ノードとの接続を抽象化したものです。各ノードはURLで識別されます。`ESTNODE' の実体が直接参照されることはなく、必ずポインタを介して間接参照されます。このポインタおよびその参照先を総じてノード接続オブジェクトと呼びます。ノード接続オブジェクトは関数 `est_node_new' によって生成され、`est_node_delete' によって破棄されます。生成されたノード接続オブジェクトは必ず破棄してください。</p>
645
646 <p>ノード接続オブジェクトの典型的なライフサイクルを以下に示します。</p>
647
648 <pre>ESTNODE *node;
649
650 /* 生成する */
651 node = est_node_new("http://estraier.gov:1978/node/foo");
652
653 /* プロクシとタイムアウトと認証情報を設定する */
654 est_node_set_proxy(node, "proxy.qdbm.go.jp", 8080);
655 est_node_set_timeout(node, 5);
656 est_node_set_auth(node, "mikio", "oikim");
657
658 /* ここで文書を登録したり、検索を行ったりする */
659
660 /* 破棄する */
661 est_node_delete(node);
662 </pre>
663
664 <p>ノード接続オブジェクトを生成するには、関数 `est_node_new' を用います。</p>
665
666 <dl>
667 <dt><kbd>ESTNODE *est_node_new(const char *<var>url</var>);</kbd></dt>
668 <dd>`url' はノードのURLを指定します。戻り値はノード接続オブジェクトです。</dd>
669 </dl>
670
671 <p>ノード接続オブジェクトを破棄するには、関数 `est_node_delete' を用います。</p>
672
673 <dl>
674 <dt><kbd>void est_node_delete(ESTNODE *<var>node</var>);</kbd></dt>
675 <dd>`node' はノード接続オブジェクトを指定します。</dd>
676 </dl>
677
678 <p>ノード接続オブジェクトにプロクシの情報を設定するには、関数 `est_node_set_proxy' を用います。</p>
679
680 <dl>
681 <dt><kbd>void est_node_set_proxy(ESTNODE *<var>node</var>, const char *<var>host</var>, int <var>port</var>);</kbd></dt>
682 <dd>`node' はノード接続オブジェクトを指定します。`host' はプロクシサーバのホスト名を指定します。`port' はプロクシサーバのポート番号を指定します。</dd>
683 </dl>
684
685 <p>ノード接続オブジェクトにタイムアウトの情報を設定するには、関数 `est_node_set_timeout' を用います。</p>
686
687 <dl>
688 <dt><kbd>void est_node_set_timeout(ESTNODE *<var>node</var>, int <var>sec</var>);</kbd></dt>
689 <dd>`node' はノード接続オブジェクトを指定します。`sec' は接続のタイムアウト時間を秒単位で指定します。</dd>
690 </dl>
691
692 <p>ノード接続オブジェクトに認証情報を設定するには、関数 `est_node_set_auth' を用います。</p>
693
694 <dl>
695 <dt><kbd>void est_node_set_auth(ESTNODE *<var>node</var>, const char *<var>name</var>, const char *<var>passwd</var>);</kbd></dt>
696 <dd>`node' はノード接続オブジェクトを指定します。`name' は認証情報のユーザ名を指定します。`passwd' は認証情報のパスワードを指定します。</dd>
697 </dl>
698
699 <p>ノード接続で直前に起きたステータスコードを取得するには、関数 `est_node_status' を用います。</p>
700
701 <dl>
702 <dt><kbd>int est_node_status(ESTNODE *<var>node</var>);</kbd></dt>
703 <dd>`node' はノード接続オブジェクトを指定します。戻り値はノード接続で直前に起きたステータスコードです。-1は接続に失敗したことを意味します。</dd>
704 </dl>
705
706 <p>ノードに文書を追加するには、関数 `est_node_put_doc' を用いる。</p>
707
708 <dl>
709 <dt><kbd>int est_node_put_doc(ESTNODE *<var>node</var>, ESTDOC *<var>doc</var>);</kbd></dt>
710 <dd>`node' はノード接続オブジェクトを指定します。`doc' は文書オブジェクトを指定します。文書オブジェクトはURI属性を持っていなければなりません。戻り値は成功なら真、エラーなら偽です。指定された文書オブジェクトのURI属性がノード内の既存の文書と一致する場合、既存の方は削除されます。</dd>
711 </dl>
712
713 <p>ノードから文書を削除するには、関数 `est_node_out_doc' を用います。</p>
714
715 <dl>
716 <dt><kbd>int est_node_out_doc(ESTNODE *<var>node</var>, int <var>id</var>);</kbd></dt>
717 <dd>`node' はノード接続オブジェクトを指定します。`id' は登録文書のID番号を指定します。戻り値は成功なら真、エラーなら偽です。</dd>
718 </dl>
719
720 <p>ノードからURIで指定した文書を削除するには、関数 `est_node_out_doc_by_uri' を用います。</p>
721
722 <dl>
723 <dt><kbd>int est_node_out_doc_by_uri(ESTNODE *<var>node</var>, const char *<var>uri</var>);</kbd></dt>
724 <dd>`node' はノード接続オブジェクトを指定します。`uri' は登録文書のURIを指定します。戻り値は成功なら真、エラーなら偽です。</dd>
725 </dl>
726
727 <p>ノードから文書を取得するには、関数 `est_node_get_doc' を用います。</p>
728
729 <dl>
730 <dt><kbd>ESTDOC *est_node_get_doc(ESTNODE *<var>node</var>, int <var>id</var>);</kbd></dt>
731 <dd>`node' はノード接続オブジェクトを指定します。`id' は登録文書のID番号を指定します。戻り値は文書オブジェクトか、エラーなら `NULL' です。戻り値のオブジェクトは `est_doc_new' で生成されているので、不要になったら `est_doc_close' で破棄してください。</dd>
732 </dl>
733
734 <p>ノードからURIで指定した文書を取得するには、関数 `est_node_get_doc_by_uri' を用います。</p>
735
736 <dl>
737 <dt><kbd>ESTDOC *est_node_get_doc_by_uri(ESTNODE *<var>node</var>, const char *<var>uri</var>);</kbd></dt>
738 <dd>`node' はノード接続オブジェクトを指定します。`uri' は登録文書のURIを指定します。戻り値は文書オブジェクトか、エラーなら `NULL' です。戻り値のオブジェクトは `est_doc_new' で生成されているので、不要になったら `est_doc_close' で破棄してください。</dd>
739 </dl>
740
741 <p>ノードから文書の属性値を取得するには、関数 `est_node_get_doc_attr' を用います。</p>
742
743 <dl>
744 <dt><kbd>char *est_node_get_doc_attr(ESTNODE *<var>node</var>, int <var>id</var>, const char *<var>name</var>);</kbd></dt>
745 <dd>`node' はノード接続オブジェクトを指定します。`id' は登録文書のID番号を指定します。`name' は属性名を指定します。戻り値は該当の属性値か、無ければ `NULL' です。戻り値の領域は `malloc' で生成されているので、不要になったら `free' で破棄してください。</dd>
746 </dl>
747
748 <p>ノードからURIで指定した文書の属性値を取得するには、関数 `est_node_get_doc_attr_by_uri' を用います。</p>
749
750 <dl>
751 <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>
752 <dd>`node' はノード接続オブジェクトを指定します。`uri' は登録文書のURIを指定します。`name' は属性名を指定します。戻り値は該当の属性値か、無ければ `NULL' です。戻り値の領域は `malloc' で生成されているので、不要になったら `free' で破棄してください。</dd>
753 </dl>
754
755 <p>URIに対応する文書のID番号を取得するには、関数 `est_node_uri_to_id' を用います。</p>
756
757 <dl>
758 <dt><kbd>int est_node_uri_to_id(ESTNODE *<var>node</var>, const char *<var>uri</var>);</kbd></dt>
759 <dd>`node' はノード接続オブジェクトを指定します。`uri' は登録文書のURIを指定します。戻り値は文書のID番号であるか、エラーなら-1です。</dd>
760 </dl>
761
762 <p>ノードの名前を取得するには、関数 `est_node_name' を用います。</p>
763
764 <dl>
765 <dt><kbd>const char *est_node_name(ESTNODE *<var>node</var>);</kbd></dt>
766 <dd>`node' はノード接続オブジェクトを指定します。戻り値はデータベースの名前か、エラーなら `NULL' です。戻り値の文字列の寿命はデータベースオブジェクトのそれと同期します。</dd>
767 </dl>
768
769 <p>ノードのラベルを取得するには、関数 `est_node_label' を用います。</p>
770
771 <dl>
772 <dt><kbd>const char *est_node_label(ESTNODE *<var>node</var>);</kbd></dt>
773 <dd>`node' はノード接続オブジェクトを指定します。戻り値はデータベースのラベルか、エラーなら `NULL' です。戻り値の文字列の寿命はデータベースオブジェクトのそれと同期します。</dd>
774 </dl>
775
776 <p>ノードに登録された文書の数を取得するには、関数 `est_node_doc_num' を用います。</p>
777
778 <dl>
779 <dt><kbd>int est_node_doc_num(ESTNODE *<var>node</var>);</kbd></dt>
780 <dd>`node' はノード接続オブジェクトを指定します。戻り値はデータベースに登録された文書の数か、エラーなら-1です。</dd>
781 </dl>
782
783 <p>ノードに登録された異なり語の数を取得するには、関数 `est_node_word_num' を用います。</p>
784
785 <dl>
786 <dt><kbd>int est_node_word_num(ESTNODE *<var>node</var>);</kbd></dt>
787 <dd>`node' はノード接続オブジェクトを指定します。戻り値はデータベースに登録された異なり語の数か、エラーなら-1です。</dd>
788 </dl>
789
790 <p>ノードのデータベースのサイズを取得するには、関数 `est_node_size' を用います。</p>
791
792 <dl>
793 <dt><kbd>double est_node_size(ESTNODE *<var>node</var>);</kbd></dt>
794 <dd>`node' はノード接続オブジェクトを指定します。戻り値はノードのデータベースのサイズか、エラーなら-1.0です。</dd>
795 </dl>
796
797 <p>検索条件に該当する文書の一覧を取得するには、関数 `est_node_search' を用います。</p>
798
799 <dl>
800 <dt><kbd>ESTNODERES *est_node_search(ESTNODE *<var>node</var>, ESTCOND *<var>cond</var>, int <var>depth</var>);</kbd></dt>
801 <dd>`node' はノード接続オブジェクトを指定します。`cond' は検索条件オブジェクトを指定します。`depth' はメタ検索の深度を指定します。戻り値はノード結果オブジェクトか、エラーなら `NULL' です。戻り値のオブジェクトは不要になったら `est_noderes_delete' で破棄してください。</dd>
802 </dl>
803
804 <p>ノードのユーザアカウントを管理するには、関数 `est_node_set_user' を用います。</p>
805
806 <dl>
807 <dt><kbd>int est_node_set_user(ESTNODE *<var>node</var>, const char *<var>name</var>, int <var>mode</var>);</kbd></dt>
808 <dd>`node' はノード接続オブジェクトを指定します。`name' はユーザ名を指定します。`mode' は操作モードを指定します。0ならアカウントを削除し、1ならアカウントを管理者にし、2なら通常ユーザにします。戻り値は成功なら真、エラーなら偽です。</dd>
809 </dl>
810
811 <p>ノードのリンクを管理するには、関数 `est_node_set_link' を用います。</p>
812
813 <dl>
814 <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>
815 <dd>`node' はノード接続オブジェクトを指定します。`url' はリンク対象のノードのURLを指定します。`label' はリンクのラベルを指定します。`credit' はリンクの信頼度を指定します。負数の場合は該当のリンクを削除します。戻り値は成功なら真、エラーなら偽です。</dd>
816 </dl>
817
818 <h3>ノードからの検索結果を扱うAPI</h3>
819
820 <p>構造体型 `ESTNODERES' は、ノードからの検索結果を抽象化したものです。結果には、該当文書の情報のリストとヒント情報が含まれます。`ESTNODERES' の実体が直接参照されることはなく、必ずポインタを介して間接参照されます。このポインタおよびその参照先を総じてノード結果オブジェクトと呼びます。ノード結果オブジェクトは関数 `est_node_search' によって生成され、`est_noderes_delete' によって破棄されます。生成されたノード結果オブジェクトは必ず破棄してください。</p>
821
822 <p>構造体型 `ESTRESDOC' は、ノードからの検索結果の各文書の情報を抽象化したものです。文書情報には、複数の属性と一つのスニペットが含まれます。`ESTRESDOC' の実体が直接参照されることはなく、必ずポインタを介して間接参照されます。このポインタおよびその参照先を総じて結果文書オブジェクトと呼びます。結果文書オブジェクトは関数 `est_noderes_get_doc' によって参照できますが、実体はノード結果オブジェクトの内部で管理されるため、破棄する必要はありません。</p>
823
824 <p>ノード結果オブジェクトと結果文書オブジェクトの典型的なライフサイクルを以下に示します。</p>
825
826 <pre>ESTNODERES *nres;
827 CBMAP *hints;
828 ESTRESDOC *rdoc;
829 int i;
830
831 /* ノード結果オブジェクトを生成する */
832 nres = est_node_search(node, cond, 1);
833
834 /* ヒントを取り出す */
835 hints = est_noderes_hints(nres);
836
837 /* ここでヒントを表示する */
838
839 /* 該当文書のリストを走査する */
840 for(i = 0; i &lt; est_noderes_doc_num(nres); i++){
841
842 /* 結果文書オブジェクトを取り出す */
843 rdoc = est_noderes_get_doc(nres, i);
844
845 /* ここで文書情報を表示する */
846
847 }
848
849 /* ノード結果オブジェクトを破棄する */
850 est_noderes_delete(nres);
851 </pre>
852
853 <p>ノード結果オブジェクトを破棄するには、関数 `est_noderes_delete' を用います。</p>
854
855 <dl>
856 <dt><kbd>void est_noderes_delete(ESTNODERES *<var>nres</var>);</kbd></dt>
857 <dd>`nres' はノード結果オブジェクトを指定します。</dd>
858 </dl>
859
860 <p>ノード結果オブジェクトからヒントのマップオブジェクトを取得するには、関数 `est_noderes_hints' を用いる。</p>
861
862 <dl>
863 <dt><kbd>CBMAP *est_noderes_hints(ESTNODERES *<var>nres</var>);</kbd></dt>
864 <dd>`nres' はノード結果オブジェクトを指定します。戻り値はヒントのマップオブジェクトです。キーには "VERSION"、"NODE"、"HIT"、"HINT#n"、"DOCNUM"、"WORDNUM"、"TIME"、"LINK#n"、"VIEW" があります。戻り値のオブジェクトの寿命はノード結果オブジェクトのそれと同期します。</dd>
865 </dl>
866
867 <p>ノード結果オブジェクトに含まれる文書情報の数を取得するには、関数 `est_noderes_doc_num' を用います。</p>
868
869 <dl>
870 <dt><kbd>int est_noderes_doc_num(ESTNODERES *<var>nres</var>);</kbd></dt>
871 <dd>`nres' はノード結果オブジェクトを指定します。戻り値はノード結果オブジェクトに含まれる文書情報の数です。</dd>
872 </dl>
873
874 <p>ノード結果オブジェクトから個々の結果文書オブジェクトを取得するには、関数 `est_noderes_get_doc' を用います。</p>
875
876 <dl>
877 <dt><kbd>ESTRESDOC *est_noderes_get_doc(ESTNODERES *<var>nres</var>, int <var>index</var>);</kbd></dt>
878 <dd>`nres' はノード結果オブジェクトを指定します。`index' は取り出す要素のインデックスを指定します。戻り値は文書オブジェクトか、`index' が要素数と等しいか大きければ `NULL' です。戻り値のオブジェクトの寿命はノード結果オブジェクトのそれと同期します。</dd>
879 </dl>
880
881 <p>結果文書オブジェクトからURIを取得するには、関数 `est_resdoc_uri' を用います。</p>
882
883 <dl>
884 <dt><kbd>const char *est_resdoc_uri(ESTRESDOC *<var>rdoc</var>);</kbd></dt>
885 <dd>`rdoc' は結果文書オブジェクトを指定します。戻り値は結果文書オブジェクトのURIです。戻り値の文字列の寿命は結果文書オブジェクトのそれと同期します。</dd>
886 </dl>
887
888 <p>結果文書オブジェクトの属性名のリストを取得するには、関数 `est_resdoc_attr_names' を用います。</p>
889
890 <dl>
891 <dt><kbd>CBLIST *est_resdoc_attr_names(ESTRESDOC *<var>rdoc</var>);</kbd></dt>
892 <dd>`rdoc' は結果文書オブジェクトを指定します。戻り値は結果文書オブジェクトの属性名のリストです。戻り値のオブジェクトは `cblistopen' で生成されているので、不要になったら `cblistclose' で破棄してください。</dd>
893 </dl>
894
895 <p>結果文書オブジェクトの属性の値を取得するには、関数 `est_resdoc_attr' を用います。</p>
896
897 <dl>
898 <dt><kbd>const char *est_resdoc_attr(ESTRESDOC *<var>rdoc</var>, const char *<var>name</var>);</kbd></dt>
899 <dd>`rdoc' は結果文書オブジェクトを指定します。`name' は属性名を指定します。戻り値は属性値ですが、該当する属性がない場合は `NULL' が返されます。戻り値の文字列の寿命は文書オブジェクトのそれと同期します。</dd>
900 </dl>
901
902 <p>結果文書オブジェクトのスニペットを取得するには、関数 `est_resdoc_snippet' を用います。</p>
903
904 <dl>
905 <dt><kbd>const char *est_resdoc_snippet(ESTRESDOC *<var>rdoc</var>);</kbd></dt>
906 <dd>`rdoc' は結果文書オブジェクトを指定します。戻り値は結果文書オブジェクトのスニペットの文字列です。その形式はタブ区切り文字列(TSV)です。その各行は表示すべき文字列です。ほとんどの行は単一のフィールドしか持ちませんが、いくつかは二つのフィールドを持ちます。もし第2フィールドが存在したならば、第1フィールドはハイライトして表示すべき文字列で、第2フィールドはその正規化された文字列です。戻り値の文字列の寿命は結果文書オブジェクトのそれと同期します。</dd>
907 </dl>
908
909 <h3>並列性</h3>
910
911 <p>ノード接続オブジェクト、ノード結果オブジェクト、結果文書オブジェクトのいずれも、スレッド間で共有してはなりません。マルチスレッドを用いる場合は、各スレッドで別々のオブジェクトを使うようにしてください。その条件さえ守れば、ノードAPIの各関数はマルチスレッドセーフなものとして扱えます。</p>
912
913 <h3>ギャザラのサンプル</h3>
914
915 <p>最も単純なギャザラの実装を以下に示します。コアAPIのギャザラとの違いは、ネットワーク環境の初期化が必要なことと、データベースオブジェクトの代わりにノード接続オブジェクトを使うことです。</p>
916
917 <pre>#include &lt;estraier.h&gt;
918 #include &lt;estnode.h&gt;
919 #include &lt;cabin.h&gt;
920 #include &lt;stdlib.h&gt;
921 #include &lt;stdio.h&gt;
922
923 int main(int argc, char **argv){
924 ESTNODE *node;
925 ESTDOC *doc;
926 /* ネットワーク環境を初期化する */
927 if(!est_init_net_env()){
928 fprintf(stderr, "error: network is unavailable\n");
929 return 1;
930 }
931 /* ノード接続オブジェクトを生成して設定する */
932 node = est_node_new("http://localhost:1978/node/test1");
933 est_node_set_auth(node, "admin", "admin");
934 /* 文書オブジェクトを生成する */
935 doc = est_doc_new();
936 /* 文書オブジェクトに属性を追加する */
937 est_doc_add_attr(doc, "@uri", "http://estraier.gov/example.txt");
938 est_doc_add_attr(doc, "@title", "Over the Rainbow");
939 /* 文書オブジェクトに本文を追加する */
940 est_doc_add_text(doc, "Somewhere over the rainbow. Way up high.");
941 est_doc_add_text(doc, "There's a land that I heard of once in a lullaby.");
942 /* 文書オブジェクトをノードに登録する */
943 if(!est_node_put_doc(node, doc))
944 fprintf(stderr, "error: %d\n", est_node_status(node));
945 /* 文書オブジェクトを破棄する */
946 est_doc_delete(doc);
947 /* ノードオブジェクトを破棄する */
948 est_node_delete(node);
949 /* ネットワーク環境を破棄する */
950 est_free_net_env();
951 return 0;
952 }
953 </pre>
954
955 <h3>サーチャのサンプル</h3>
956
957 <p>最も単純なサーチャの実装を以下に示します。コアAPIでは検索結果から文書オブジェクト(ESTDOC)を取得していましたが、ここでは結果文書オブジェクト(ESTRESDOC)を取得していることに注意してください。</p>
958
959 <pre>#include &lt;estraier.h&gt;
960 #include &lt;estnode.h&gt;
961 #include &lt;cabin.h&gt;
962 #include &lt;stdlib.h&gt;
963 #include &lt;stdio.h&gt;
964
965 int main(int argc, char **argv){
966 ESTNODE *node;
967 ESTCOND *cond;
968 ESTNODERES *nres;
969 ESTRESDOC *rdoc;
970 int i;
971 const char *value;
972 /* ネットワーク環境を初期化する */
973 if(!est_init_net_env()){
974 fprintf(stderr, "error: network is unavailable\n");
975 return 1;
976 }
977 /* ノード接続オブジェクトを生成する */
978 node = est_node_new("http://localhost:1978/node/test1");
979 /* 検索条件オブジェクトを生成する */
980 cond = est_cond_new();
981 /* 検索条件オブジェクトに検索式を設定する */
982 est_cond_set_phrase(cond, "rainbow AND lullaby");
983 /* ノード結果オブジェクトを取得する */
984 nres = est_node_search(node, cond, 0);
985 if(nres){
986 /* 各文書を取得して表示する */
987 for(i = 0; i &lt; est_noderes_doc_num(nres); i++){
988 /* 結果文書オブジェクトを取得する */
989 rdoc = est_noderes_get_doc(nres, i);
990 /* 属性を表示する */
991 if((value = est_resdoc_attr(rdoc, "@uri")) != NULL)
992 printf("URI: %s\n", value);
993 if((value = est_resdoc_attr(rdoc, "@title")) != NULL)
994 printf("Title: %s\n", value);
995 /* スニペットを表示する */
996 printf("%s", est_resdoc_snippet(rdoc));
997 }
998 /* ノード結果オブジェクトを破棄する */
999 est_noderes_delete(nres);
1000 } else {
1001 fprintf(stderr, "error: %d\n", est_node_status(node));
1002 }
1003 /* destroy the search condition object */
1004 est_cond_delete(cond);
1005 /* ノードオブジェクトを破棄する */
1006 est_node_delete(node);
1007 /* ネットワーク環境を破棄する */
1008 est_free_net_env();
1009 return 0;
1010 }
1011 </pre>
1012
1013 <hr />
1014
1015 <h2 id="estcall">クライアント用コマンド</h2>
1016
1017 <p>ここでは、ノード管理用コマンドestcallの詳細な仕様を説明します。検索もできるので、estcallをスクリプト言語から呼び出せばそれなりのアプリケーションが簡単に作れます。</p>
1018
1019 <h3>書式</h3>
1020
1021 <p>estcallは多くのサブコマンドの集合体です。サブコマンドの名前は第1引数で指定されます。その他の引数はサブコマンドの種類に応じて解釈されます。<var>nurl</var>という引数は操作対象のノードのURLです。-proxyオプションはプロクシのホスト名とポート番号を指定します。-toutはタイムアウトの時間を秒単位で指定します。-authは認証のユーザ名とパスワードを指定します。</p>
1022
1023 <dl>
1024 <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>
1025 <dd>文書ドラフト形式のファイルを登録します。</dd>
1026 <dd><var>file</var>は対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。</dd>
1027 </dl>
1028
1029 <dl>
1030 <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>
1031 <dd>特定の文書の情報をインデックスから削除します。</dd>
1032 <dd><var>expr</var>は対象のID番号かURIを指定します。</dd>
1033 </dl>
1034
1035 <dl>
1036 <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>
1037 <dd>特定の文書の情報を文書ドラフト形式で出力します。</dd>
1038 <dd><var>expr</var>は対象のID番号かURIを指定します。</dd>
1039 <dd><var>attr</var>を付けると、その属性の値のみを出力します。</dd>
1040 </dl>
1041
1042 <dl>
1043 <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>
1044 <dd>指定したURIの文書のID番号を出力します。</dd>
1045 <dd><var>uri</var>は対象のURIを指定します。</dd>
1046 </dl>
1047
1048 <dl>
1049 <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>
1050 <dd>ノードの名前とラベルと登録文書数と登録語数を出力します。</dd>
1051 </dl>
1052
1053 <dl>
1054 <dt><kbd>estcall search [-proxy <var>host</var> <var>port</var>] [-tout <var>num</var>] [-auth <var>user</var> <var>pass</var>] [-vx] [-sf] [-attr <var>expr</var>] [-ord <var>expr</var>] [-max <var>num</var>] [-dpt <var>num</var>] <var>nurl</var> [<var>phrase</var>]</kbd></dt>
1055 <dd>ノードに登録された文書を検索します。</dd>
1056 <dd><var>phrase</var>は全文検索の検索式を指定します。</dd>
1057 <dd>-vxを付けると、XML形式にして結果を出力します。</dd>
1058 <dd>-sfを付けると、検索式を簡便形式として扱います。</dd>
1059 <dd>-attrは絞り込みの属性条件を指定します。複数指定可能です。</dd>
1060 <dd>-ordはソート条件を指定します。デフォルトはスコアの降順です。</dd>
1061 <dd>-maxは最大表示件数を指定します。負数にすると無制限になります。デフォルトは10件です。</dd>
1062 <dd>-dptはメタ検索の深度を指定します。デフォルトは0です。</dd>
1063 </dl>
1064
1065 <dl>
1066 <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>
1067 <dd>ユーザ権限を設定します。</dd>
1068 <dd><var>name</var>はユーザ名を指定します。</dd>
1069 <dd><var>mode</var>が1ならそのユーザを管理者にし、2ならそのユーザを通常ユーザにし、0ならユーザ権限を削除します。</dd>
1070 </dl>
1071
1072 <dl>
1073 <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>
1074 <dd>リンクを設定します。</dd>
1075 <dd><var>url</var>はリンク先のノードのURLを指定します。</dd>
1076 <dd><var>label</var>はラベルを指定します。</dd>
1077 <dd><var>credit</var>は信頼度を指定します。値が負数の場合はそのリンクを削除します。</dd>
1078 </dl>
1079
1080 <dl>
1081 <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>
1082 <dd>HTTPリクエストを直接制御してレスポンスを出力します。</dd>
1083 <dd><var>url</var>は操作対象のURLを指定します。</dd>
1084 <dd><var>file</var>が指定された場合はその内容をPOSTメソッドで送信します。指定されなかった場合はGETメソッドを用います。"-" を指定すると標準入力を読み込みます。</dd>
1085 <dd>-npを付けると、レスポンスヘッダも含めて出力します。</dd>
1086 <dd>-ehは追加するHTTPヘッダを指定します。デフォルトではHostとConnectionとUser-AgentContent-Lengthが付加されます。</dd>
1087 </dl>
1088
1089 <p>全てのサブコマンドは、処理が正常に終了した場合には0を、そうでない場合は1を終了ステータスにします。</p>
1090
1091 <h3>応用例:ノードマスタの操作</h3>
1092
1093 <p>ノードマスタ自体の操作はAPIにはありませんので、rawサブコマンドを用いてください。例えば、ノードマスタをシャットダウンするには、以下のようなコマンドを実行します。</p>
1094
1095 <pre>estcall raw -auth admin admin \
1096 'http://localhost:1978/master?action=shutdown'
1097 </pre>
1098
1099 <p>ユーザを追加するには、以下のようなコマンドを実行します。</p>
1100
1101 <pre>estcall raw -auth admin admin \
1102 'http://localhost:1978/master?action=useradd&amp;name=mikio&amp;passwd=iloveyou'
1103 </pre>
1104
1105 <p>POSTメソッドを使うには、以下のようにします。</p>
1106
1107 <pre>echo -n 'action=useradd&amp;name=mikio&amp;passwd=iloveyou' |
1108 estcall raw -auth admin admin \
1109 -eh 'Content-Type: application/x-www-form-urlencoded' \
1110 'http://localhost:1978/master' -
1111 </pre>
1112
1113 <hr />
1114
1115 <h2 id="tips">助言</h2>
1116
1117 <p>ここでは、Hyper EstraierのP2P機構を活用するためのコツをいくつか紹介します。</p>
1118
1119 <h3>パラメータの詳細</h3>
1120
1121 <p>メタ検索の深度は0が起点です。深度が0なら自前のインデックスのみを対象とし、1ならリンク先のノードも対象とし、2ならその先も対象とし、3ならさらにその先も対象とします。それ以上の値も指定できます。クライアントが指定した深度がノードマスタの設定ファイルで指定した深度より大きい場合は、ノードマスタで指定した方に抑えられます。</p>
1122
1123 <p>リンクの信頼度は検索結果の各文書の順位を決定する際に利用されます。各ノードから収集した結果をマージする際には、各文書について、各ノードにおける順位を表示件数から引いた値に信頼度を掛けた値をスコアとして算出します。例えば、信頼度15000のノードに対して10件の文書を問い合わせた結果の4位の文書のスコアは「(10 - 4) * 15000」で90000になります。このスコアが高い順ものから提示されます。自前のインデックスの信頼度は10000で固定です。したがって、他のノードへのリンクの信頼度は、その結果を自前のインデックスの結果より上位にしたい場合は10000より大きくし、下位にしたい場合は10000より小さくするとよいでしょう。</p>
1124
1125 <h3>認証機構の詳細</h3>
1126
1127 <p>認証機構のモードは3種類あり、設定ファイルで指定されます。デフォルトは2です。以下の表では、各種の操作に対して匿名を許可する場合は「○」、認証を行う場合は「×」を示します。ノードサーバの管理操作とは、put_doc、out_doc、_set_user、_set_linkのことです。ノードサーバに対するそれ以外の操作は通常操作です。</p>
1128
1129 <table summary="authorization mode">
1130 <tr>
1131 <th abbr="mode"></th>
1132 <th abbr="1">1(none)</th>
1133 <th abbr="2">2(admin)</th>
1134 <th abbr="3">3(all)</th>
1135 </tr>
1136 <tr>
1137 <td>ノードマスタの操作</td>
1138 <td>×</td>
1139 <td>×</td>
1140 <td>×</td>
1141 </tr>
1142 <tr>
1143 <td>ノードサーバの管理操作</td>
1144 <td></td>
1145 <td>×</td>
1146 <td>×</td>
1147 </tr>
1148 <tr>
1149 <td>ノードサーバの通常操作</td>
1150 <td></td>
1151 <td></td>
1152 <td>×</td>
1153 </tr>
1154 </table>
1155
1156 <p>認証機構があっても平文をネットワーク上に流すのではセキュリティとしては不十分です。特にHTTPの基本認証のセキュリティは低く、邪悪な人達には全く無力と言っても過言ではありません。したがって、重要なデータを扱う際には、通信を暗号化することをお薦めします。ただし、Hyper Estraier自体は暗号通信の機能を提供しませんので、Apache等をリバースプロクシとして利用してください。同時接続数が多い場合は市販のSSLアクセラレータを利用するとよいでしょう。</p>
1157
1158 <p>このような認証機構が気に入らない場合は、フロントエンドのクライアントを実装して、そこでアカウント管理と認証を行ってください。フロントエンドがバックエンドであるノードマスタやノードサーバにアクセスする際には常にスーパーユーザを用いるとよいでしょう。Apacheをフロントエンドにすれば、mod_auth_ldapを使ってLDAPによる認証を行ったり、mod_auth_radiusを使ってRADIUSによる認証を行ったりできます。Locationディレクティブなどを駆使すれば各メソッドのアクセス権限を詳細に設定することもできます。</p>
1159
1160 <h3>通常のWeb機能</h3>
1161
1162 <p>ノードマスタは通常のWebサーバとしての機能も備えています。この機能は検索対象文書の実体を公開する場合に便利でしょう。例えば、「/home/www/public_html」以下を公開したい場合は、設定ファイルに以下のように書きます。</p>
1163
1164 <pre>docroot: /home/www/public_html
1165 indexfile: index.html
1166 </pre>
1167
1168 <h3>負荷テスト用コマンド</h3>
1169
1170 <p>各種のWebアプリケーションに対する負荷テストのためのユーティリティとして、estloadコマンドが提供されます。以下の書式を持ちます。</p>
1171
1172 <dl>
1173 <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>
1174 <dd><var>file</var>を指定した場合、そのファイルの各行に含まれるURLのリクエストを発行します。<var>url</var>を指定した場合、そのURLのリクエストを発行します。何も指定しなかった場合、標準入力の各行に含まれるURLのリクエストを発行します。</dd>
1175 <dd>-tは並行して動かすスレッドの数を指定します。デフォルトは1です。</dd>
1176 <dd>-lはリストを繰り返す回数を指定します。デフォルトは1です。</dd>
1177 <dd>-iはリクエストを発行してからスリープする時間をミリ秒単位で指定します。デフォルトは0です。</dd>
1178 <dd>-pを指定すると、レスポンスを表示します。</dd>
1179 <dd>-qを指定すると、進捗状態を表示しません。</dd>
1180 </dl>
1181
1182 <h3>初期導入の効率化</h3>
1183
1184 <p>大規模なサイトの立ち上げを素早く行いたい場合、estcmdを利用するかアプリケーションを作成するかして、コアAPIのレベルでインデックスを作った方がよいでしょう。そうして作ったインデックスは、ノードディレクトリに置くことでノードサーバとして利用することができます。例えば、/home/mikio以下の文書を登録した、名前が「mikio」でラベルが「Mikio Hirabayashi」のノードサーバを設置するには、以下のようにします。</p>
1185
1186 <pre>estmaster init casket
1187 estcmd gather -sd -il ja casket/_node/mikio /home/mikio
1188 estcmd meta casket/_node/mikio label "Mikio Hirabayashi"
1189 </pre>
1190
1191 <p>ユーザやリンクの設定は、ノードマスタを起動させた上で、ノードAPIやestcallコマンドを使って行ってください。なお、estcallにはestcmd gatherのようなギャザラ用のサブコマンドは用意されていません。findやestcmd draftなどを組み合わせれば同等のことは可能です。</p>
1192
1193 <hr />
1194
1195 </body>
1196
1197 </html>
1198
1199 <!-- END OF FILE -->

  ViewVC Help
Powered by ViewVC 1.1.26