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&name=<var>str</var>&passwd=<var>str</var>&flags=<var>str</var>&fname=<var>str</var>&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&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&name=<var>str</var>&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&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>&attr=<var>str</var>&order=<var>str</var>&max=<var>num</var>&options=<var>num</var>&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>&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>&uri=<var>str</var>&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>&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>&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>&label=<var>str</var>&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 <estraier.h> |
612 |
#include <estnode.h> |
613 |
#include <cabin.h> |
614 |
#include <stdlib.h> |
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 < 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 <estraier.h> |
918 |
#include <estnode.h> |
919 |
#include <cabin.h> |
920 |
#include <stdlib.h> |
921 |
#include <stdio.h> |
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 <estraier.h> |
960 |
#include <estnode.h> |
961 |
#include <cabin.h> |
962 |
#include <stdlib.h> |
963 |
#include <stdio.h> |
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 < 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&name=mikio&passwd=iloveyou' |
1103 |
</pre> |
1104 |
|
1105 |
<p>POSTメソッドを使うには、以下のようにします。</p> |
1106 |
|
1107 |
<pre>echo -n 'action=useradd&name=mikio&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 --> |