~ubuntu-branches/ubuntu/trusty/hyperestraier/trusty

« back to all changes in this revision

Viewing changes to doc/pguide-ja.html

  • Committer: Bazaar Package Importer
  • Author(s): Steve Langasek
  • Date: 2006-11-14 05:28:32 UTC
  • mfrom: (2.1.4 feisty)
  • Revision ID: james.westby@ubuntu.com-20061114052832-0lzqzcefn8mt4yqe
Tags: 1.4.9-1.1
* Non-maintainer upload.
* High-urgency upload for RC bugfix.
* Set HOME=$(CURDIR)/junkhome when building, otherwise the package build
  will incorrectly look for headers there -- and fail when the directory
  exists and is unreadable, as happens sometimes on sudo-using
  autobuilders!

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
<meta http-equiv="Content-Style-Type" content="text/css" />
11
11
<meta name="author" content="Mikio Hirabayashi" />
12
12
<meta name="keywords" content="Hyper Estraier, Estraier, full-text search, API" />
13
 
<meta name="description" content="API specifications of Hyper Estraier" />
 
13
<meta name="description" content="Programming Guide of Hyper Estraier" />
14
14
<link rel="contents" href="./" />
15
15
<link rel="alternate" href="pguide-en.html" hreflang="en" title="the English version" />
16
16
<link rel="stylesheet" href="common.css" />
23
23
 
24
24
<h1>プログラミングガイド</h1>
25
25
 
26
 
<div class="note">Copyright (C) 2004-2005 Mikio Hirabayashi</div>
27
 
<div class="note">Last Update: Tue, 01 Nov 2005 04:27:26 +0900</div>
28
 
<div class="navi">[<a href="pguide-en.html" hreflang="en">English</a>] [<a href="index.ja.html">HOME</a>]</div>
 
26
<div class="note">Copyright (C) 2004-2006 Mikio Hirabayashi</div>
 
27
<div class="note">Last Update: Mon, 11 Sep 2006 21:41:45 +0900</div>
 
28
<div class="navi">[<a href="pguide-en.html" hreflang="en">English</a>/<span class="void">Japanese</span>] [<a href="index.ja.html">HOME</a>]</div>
29
29
 
30
30
<hr />
31
31
 
48
48
 
49
49
<h2 id="introduction">はじめに</h2>
50
50
 
51
 
<p>この文書では、Hyper EstraierのAPIの詳細な使い方を説明します。<a href="uguide-ja.html">ユーザガイド</a>をまだお読みでない場合は先にそちらに目を通しておいてください。</p>
 
51
<p>このガイドでは、Hyper EstraierのAPIの詳細な使い方を説明します。<a href="uguide-ja.html">ユーザガイド</a>をまだお読みでない場合は先にそちらに目を通しておいてください。</p>
52
52
 
53
53
<p>全文検索システムの機能要件は様々ですが、代表的なものを挙げてみましょう。</p>
54
54
 
73
73
 
74
74
<p>スケーラビリティ(大規模な文書群を扱う能力)が高いことは、Hyper Estraierの特徴の一つです。スケーラビリティを向上するための工夫はコアAPIの内部でやってくれるので、アプリケーション作者は文書規模のことをそれほど気にしないで済みます。</p>
75
75
 
76
 
<p>この文書ではC言語版のコアAPIについて説明しますが、コアAPIを<a href="javanativeapi/">Java</a>や<a href="rubynativeapi/">Ruby</a>から呼び出すためのバインディングもあります。また、Hyper EstraierはP2Pアーキテクチャに基づく「<strong>ノードAPI</strong>」も提供しています。ノードAPIについては<a href="nguide-ja.html">P2Pガイド</a>をご覧ください。</p>
 
76
<p>このガイドではC言語版のコアAPIについて説明しますが、コアAPIを<a href="javanativeapi/">Java</a>や<a href="rubynativeapi/">Ruby</a>や<a href="perlnativeapi/">Perl</a>から呼び出すためのバインディングもあります。また、Hyper EstraierはP2Pアーキテクチャに基づく「<strong>ノードAPI</strong>」も提供しています。ノードAPIについては<a href="nguide-ja.html">P2Pガイド</a>をご覧ください。</p>
77
77
 
78
78
<hr />
79
79
 
123
123
 
124
124
<p>システム構成の典型例を以下に図示します。これはあくまで概念的なもので、実際のアプリケーションではサーチャとギャザラを一つのモジュールで実現してもいいですし、リポジトリにギャザラやサーチャを組み込んでもいいでしょう。</p>
125
125
 
126
 
<div class="illust"><img src="coreframe.png" width="720" height="550" alt="[framework]" /></div>
 
126
<div class="illust"><img src="coreframe.png" width="720" height="450" alt="[framework]" /></div>
127
127
 
128
128
<hr />
129
129
 
261
261
<dd>`doc' は文書オブジェクトを指定します。`text' は隠しテキストの一文を指定します。</dd>
262
262
</dl>
263
263
 
 
264
<p>文書オブジェクトにキーワードを添付するには、関数 `est_doc_set_keywords' を用います。</p>
 
265
 
 
266
<dl>
 
267
<dt><kbd>void est_doc_set_keywords(ESTDOC *<var>doc</var>, CBMAP *<var>kwords</var>);</kbd></dt>
 
268
<dd>`doc' は文書オブジェクトを指定します。`kwords' はキーワードのマップオブジェクトを指定します。マップのキーはキーワードの文字列で、値はそのスコアの10進数表現です。マップオブジェクトは内部的にコピーされます。</dd>
 
269
</dl>
 
270
 
 
271
<p>文書オブジェクトに代替スコアを設定するには、関数 `est_doc_set_score' を用います。</p>
 
272
 
 
273
<dl>
 
274
<dt><kbd>void est_doc_set_score(ESTDOC *<var>doc</var>, int <var>score</var>);</kbd></dt>
 
275
<dd>`doc' は文書オブジェクトを指定します。`score' は代替スコアを指定します。負数の場合は代替スコアの既存の設定が無効化されます。</dd>
 
276
</dl>
 
277
 
264
278
<p>文書オブジェクトのID番号を取得するには、関数 `est_doc_id' を用います。</p>
265
279
 
266
280
<dl>
296
310
<dd>`doc' は文書オブジェクトを指定します。戻り値は本文を連結した文字列のデータです。戻り値の領域は `malloc' で生成されているので、不要になったら `free' で破棄してください。</dd>
297
311
</dl>
298
312
 
 
313
<p>文書オブジェクトに添付されたキーワードを取得するには、関数 `est_doc_keywords' を用います。</p>
 
314
 
 
315
<dl>
 
316
<dt><kbd>CBMAP *est_doc_keywords(ESTDOC *<var>doc</var>);</kbd></dt>
 
317
<dd>`doc' は文書オブジェクトを指定します。戻り値はキーワードのマップオブジェクトです。マップのキーはキーワードの文字列で、値はそのスコアの10進数表現です。戻り値のオブジェクトの寿命は文書オブジェクトのそれと同期します。</dd>
 
318
</dl>
 
319
 
299
320
<p>文書オブジェクトから文書ドラフトを生成するには、関数 `est_doc_dump_draft' を用います。</p>
300
321
 
301
322
<dl>
385
406
<dd>`cond' は検索条件オブジェクトを指定します。`max' は取得文書数の最大数を指定します。デフォルトでは、取得文書数は無制限です。</dd>
386
407
</dl>
387
408
 
 
409
<p>検索条件オブジェクトに検索結果からスキップする文書数を設定するには、関数 `est_cond_set_skip' を用います。</p>
 
410
 
 
411
<dl>
 
412
<dt><kbd>void est_cond_set_skip(ESTCOND *<var>cond</var>, int <var>skip</var>);</kbd></dt>
 
413
<dd>`cond' は検索条件オブジェクトを指定します。`skip' は検索結果からスキップする文書数を指定します。</dd>
 
414
</dl>
 
415
 
388
416
<p>検索条件オブジェクトに検索オプションを設定するには、関数 `est_cond_set_options' を用います。</p>
389
417
 
390
418
<dl>
391
419
<dt><kbd>void est_cond_set_options(ESTCOND *<var>cond</var>, int <var>options</var>);</kbd></dt>
392
 
<dd>`cond' は検索条件オブジェクトを指定します。`options' はオプションを指定します。`ESTCONDSURE' だと全てのN-gramキーを検索します。`ESTCONDUSUAL' はデフォルトですが、N-gramのキーを1個置きで検査します。`ESTCONDFAST' だとN-gramのキーを2個置き、`ESTCONDAGITO' だと3個置きで検査します。`ESTCONDNOIDF' だとTF-IDF法による重みづけを省略します。`ESTCONDSIMPLE' だと検索フレーズを簡便法のものとして扱います。`ESTCONDETCH' だとキーワードベクトルを結果に添付します(ノードAPI専用)。`ESTCONDSCFB' だとスコアをフィードバックします(デバッグ専用)。それぞれのオプションはビット和で同時に指定できます。N-gramのキーの検査が省略されればされるほど、検索速度は向上しますが、検索精度は低下します。</dd>
393
 
</dl>
394
 
 
395
 
<p>類似隠蔽における下限類似度を設定するには、関数 `est_cond_set_eclipse' を用います。</p>
 
420
<dd>`cond' は検索条件オブジェクトを指定します。`options' はオプションを指定します。`ESTCONDSURE' だと全てのN-gramキーを検索します。`ESTCONDUSUAL' はデフォルトですが、N-gramのキーを1個置きで検査します。`ESTCONDFAST' だとN-gramのキーを2個置き、`ESTCONDAGITO' だと3個置きで検査します。`ESTCONDNOIDF' だとTF-IDF法による重みづけを省略します。`ESTCONDSIMPLE' だと検索フレーズを簡便書式のものとして扱います。`ESTCONDROUGH' だと検索フレーズを粗略書式のものとして扱います。`ESTCONDUNION' だと検索フレーズを論理和書式(OR結合)のものとして扱います。`ESTCONDISECT' だと検索フレーズを論理積書式(AND結合)のものとして扱います。`ESTCONDSCFB' だとスコアをフィードバックします(デバッグ専用)。それぞれのオプションはビット和で同時に指定できます。N-gramのキーの検査が省略されればされるほど、検索速度は向上しますが、検索精度は低下します。</dd>
 
421
</dl>
 
422
 
 
423
<p>検索条件オブジェクトに補助インデックスの結果を採用する許可を設定するには、関数 `est_cond_set_auxiliary' を用います。</p>
 
424
 
 
425
<dl>
 
426
<dt><kbd>void est_cond_set_auxiliary(ESTCOND *<var>cond</var>, int <var>min</var>);</kbd></dt>
 
427
<dd>`cond' は検索条件オブジェクトを指定します。`min' は補助インデックスが返す結果を採用するための下限該当件数を指定します。0を越えない値を指定すると、補助インデックスは使われません。デフォルトは32件です。</dd>
 
428
</dl>
 
429
 
 
430
<p>検索条件オブジェクトに類似隠蔽における下限類似度を設定するには、関数 `est_cond_set_eclipse' を用います。</p>
396
431
 
397
432
<dl>
398
433
<dt><kbd>void est_cond_set_eclipse(ESTCOND *<var>cond</var>, double <var>limit</var>);</kbd></dt>
399
 
<dd>`cond' は検索条件オブジェクトを指定します。`limit' は隠蔽される文書の下限の類似度を0.0から1.0までの値で指定します。</dd>
 
434
<dd>`cond' は検索条件オブジェクトを指定します。`limit' は隠蔽される文書の下限の類似度を0.0から1.0までの値で指定しますが、`ESTECLSIMURL' を加算するとURLを重み付けに使うようになります。`ESTECLSERV' を指定すると類似度を無視して同じサーバの文書を隠蔽します。`ESTECLDIR' を指定すると類似度を無視して同じディレクトリの文書を隠蔽します。`ESTECLSERV' を指定すると類似度を無視して同じファイルの文書を隠蔽します。</dd>
 
435
</dl>
 
436
 
 
437
<p>検索条件オブジェクトに属性重複除去フィルタを設定するには、関数 `est_cond_set_distinct' を用います。</p>
 
438
 
 
439
<dl>
 
440
<dt><kbd>void est_cond_set_distinct(ESTCOND *<var>cond</var>, const char *<var>name</var>);</kbd></dt>
 
441
<dd>`cond' は検索条件オブジェクトを指定します。`name' は値が重複してはならない属性の名前を指定します。このフィルタが設定された場合、検索結果の候補の中で重複する属性値を持つものは除外されます。</dd>
 
442
</dl>
 
443
 
 
444
<p>検索条件オブジェクトにメタ検索の対象のマスクを設定するには、関数 `est_cond_set_mask' を用います。</p>
 
445
 
 
446
<dl>
 
447
<dt><kbd>void est_cond_set_mask(ESTCOND *<var>cond</var>, int <var>mask</var>);</kbd></dt>
 
448
<dd>`cond' は検索条件オブジェクトを指定します。`mask' は検索対象のマスクを指定します。1は1番目の対象、2は2番目の対象、4は3番目の対象といった2の累乗の値の合計で検索を抑止する対象を指定します。</dd>
400
449
</dl>
401
450
 
402
451
<hr />
460
509
 
461
510
<dl>
462
511
<dt><kbd>ESTDB *est_db_open(const char *<var>name</var>, int <var>omode</var>, int *<var>ecp</var>);</kbd></dt>
463
 
<dd>`name' はデータベースのディレクトリ名を指定します。`omode' はオープンモードを指定します。`ESTDBWRITER' ならライタ(書き込みモード)で、`ESTDBREADER' ならリーダ(読み込みモード)です。ライタの場合、ビット和で次のものを指定できます。`ESTDBCREAT' ならデータベースが存在しない場合に新規に作成することを指示し、`ESTDBTRUNC' ならデータベースが既存だった場合にも新規に作りなおすことを指示します。リーダでもライタでも `ESTDBNOLCK' または `ESTDBLCKNB' をビット和で指定することができますが、前者はファイルロックをかけないでデータベースを開くことを指示し、後者はブロックせずにロックをかけることを指示します。その場合は排他制御の責任はアプリケーションが負います。`ESTDBCREAT' に `ESTDBPERFNG' をビット和で加えてデータベースを作成すると、文書の欧文も完全なN-gram法で処理されるようになります。`ecp' はエラーコードを格納する変数へのポインタを指定します。戻り値はデータベースオブジェクトか、エラーの場合は `NULL' です。</dd>
 
512
<dd>`name' はデータベースのディレクトリ名を指定します。`omode' はオープンモードを指定します。`ESTDBWRITER' ならライタ(書き込みモード)で、`ESTDBREADER' ならリーダ(読み込みモード)です。ライタの場合、ビット和で次のものを指定できます。`ESTDBCREAT' ならデータベースが存在しない場合に新規に作成することを指示し、`ESTDBTRUNC' ならデータベースが既存だった場合にも新規に作りなおすことを指示します。リーダでもライタでも `ESTDBNOLCK' または `ESTDBLCKNB' をビット和で指定することができますが、前者はファイルロックをかけないでデータベースを開くことを指示し、後者はブロックせずにロックをかけることを指示します。その場合は排他制御の責任はアプリケーションが負います。`ESTDBCREAT' に `ESTDBPERFNG' をビット和で加えてデータベースを作成すると、文書の欧文も完全なN-gram法で処理されるようになります。`ESTDBCREAT' に `ESTDBSMALL' をビット和で加えてデータベースを作成すると50000件未満の文書を登録することを想定してインデックスがチューニングされ、`ESTDBLARGE' をビット和で加えてデータベースを作成すると300000件以上の文書を登録することを想定してインデックスがチューニングされ、`ESTDBHUGE' をビット和で加えてデータベースを作成すると1000000件以上の文書を登録することを想定してインデックスがチューニングされ、`ESTDBHUGE2' をビット和で加えてデータベースを作成すると5000000件以上の文書を登録することを想定してインデックスがチューニングされ、`ESTDBHUGE3' をビット和で加えてデータベースを作成すると10000000件以上の文書を登録することを想定してインデックスがチューニングされ、`ESTDBSCVOID' をビット和で加えてデータベースを作成するとスコア情報を破棄するようになり、`ESTDBSCINT' をビット和で加えてデータベースを作成するとスコア情報を32ビットの数値として記録するようになり、`ESTDBSCASIS' をビット和で加えてデータベースを作成するとスコア情報をそのまま保存した上で検索時に調整されないようにマークします。`ecp' はエラーコードを格納する変数へのポインタを指定します。戻り値はデータベースオブジェクトか、エラーの場合は `NULL' です。</dd>
464
513
</dl>
465
514
 
466
515
<p>データベースを閉じてデータベースオブジェクトを破棄するには、関数 `est_db_close' を用います。</p>
484
533
<dd>`db' はデータベースオブジェクトを指定します。戻り値はデータベースに致命的エラーがあれば真、そうでなければ偽です。</dd>
485
534
</dl>
486
535
 
 
536
<p>データベースに属性の絞り込み用またはソート用のインデックスを加えるには、関数 `est_db_add_attr_index' を用いる。</p>
 
537
 
 
538
<dl>
 
539
<dt><kbd>int est_db_add_attr_index(ESTDB *<var>db</var>, const char *<var>name</var>, int <var>type</var>);</kbd></dt>
 
540
<dd>`db' はライタとして接続したデータベースオブジェクトを指定します。`name' は対象となる属性の名前を指定します。`type' はインデックスのデータ型を指定します。`ESTIDXATTRSEQ' なら多目的のシーケンシャルアクセス用になり、`ESTIDXATTRSTR' なら文字列の絞り込み用になり、`ESTIDXATTRNUM' なら数値型の絞り込み用になります。戻り値は成功なら真、エラーなら偽です。この関数はどの文書を登録するよりも前に呼ぶ必要があります。</dd>
 
541
</dl>
 
542
 
487
543
<p>データベースのキャッシュ内の索引語をフラッシュするには、関数 `est_db_flush' を用います。</p>
488
544
 
489
545
<dl>
490
546
<dt><kbd>int est_db_flush(ESTDB *<var>db</var>, int <var>max</var>);</kbd></dt>
491
 
<dd>`db' はライタとして接続したデータベースオブジェクトを指定します。`max' はフラッシュする語の最大数を指定しますが、0以下ならば全ての索引語がフラッシュされます。戻り値はデータベースに致命的エラーがあれば真、そうでなければ偽です。</dd>
 
547
<dd>`db' はライタとして接続したデータベースオブジェクトを指定します。`max' はフラッシュする語の最大数を指定しますが、0以下ならば全ての索引語がフラッシュされます。戻り値は成功なら真、エラーなら偽です。</dd>
492
548
</dl>
493
549
 
494
550
<p>データベースの更新内容を同期させるには、関数 `est_db_sync' を用います。</p>
505
561
<dd>`db' はライタとして接続したデータベースオブジェクトを指定します。`options' はオプションを指定します。`ESTOPTNOPURGE' は削除された文書の情報を消去する処理を省略することを指示し、`ESTOPTNODBOPT' はデータベースファイルの最適化を省略することを指示します。オプションはビット和で同時に指定できます。戻り値は成功なら真、エラーなら偽です。</dd>
506
562
</dl>
507
563
 
 
564
<p>別のデータベースをマージするには、関数 `est_db_merge' を用います。</p>
 
565
 
 
566
<dl>
 
567
<dt><kbd>int est_db_merge(ESTDB *<var>db</var>, const char *<var>name</var>, int <var>options</var>);</kbd></dt>
 
568
<dd>`db' はライタとして接続したデータベースオブジェクトを指定します。`name' は別のデータベースのディレクトリ名を指定します。`options' はオプションを指定します。`ESTODCLEAN' は削除された文書の領域を整理することを指示します。戻り値は成功なら真、エラーなら偽です。双方のデータベースを作成した際のオプションは完全に同一である必要があります。取り込んだ文書のURLが既存の文書のURLと同じ場合は、既存の文書は削除されます。</dd>
 
569
</dl>
 
570
 
508
571
<p>データベースに文書を追加するには、関数 `est_db_put_doc' を用います。</p>
509
572
 
510
573
<dl>
511
574
<dt><kbd>int est_db_put_doc(ESTDB *<var>db</var>, ESTDOC *<var>doc</var>, int <var>options</var>);</kbd></dt>
512
 
<dd>`db' はライタとして接続したデータベースオブジェクトを指定します。`doc' は文書オブジェクトを指定します。文書オブジェクトはURI属性を持っていなければなりません。`options' はオプションを指定します。`ESTPDCLEAN' は上書きされた文書の領域を整理することを指示します。戻り値は成功なら真、エラーなら偽です。指定された文書オブジェクトのURI属性がデータベース内の既存の文書と一致する場合、既存の方は削除されます。</dd>
 
575
<dd>`db' はライタとして接続したデータベースオブジェクトを指定します。`doc' は文書オブジェクトを指定します。文書オブジェクトはURI属性を持っていなければなりません。`options' はオプションを指定します。`ESTPDCLEAN' は上書きされた文書の領域を整理することを指示し、`ESTPDWEIGHT' はインデクシングの際に重み付け属性を静的に適用することを指示します。戻り値は成功なら真、エラーなら偽です。指定された文書オブジェクトのURI属性がデータベース内の既存の文書と一致する場合、既存の方は削除されます。</dd>
513
576
</dl>
514
577
 
515
578
<p>データベースから文書を削除するには、関数 `est_db_out_doc' を用います。</p>
530
593
 
531
594
<dl>
532
595
<dt><kbd>ESTDOC *est_db_get_doc(ESTDB *<var>db</var>, int <var>id</var>, int <var>options</var>);</kbd></dt>
533
 
<dd>`db' はデータベースオブジェクトを指定します。`id' は登録文書のID番号を指定します。`options' はオプションを指定します。`ESTGDNOATTR' は属性を取得しないことを指示し、`ESTGDNOTEXT' は本文を取得しないことを指示します。オプションはビット和で同時に指定できます。戻り値は文書オブジェクトか、エラーなら `NULL' です。戻り値のオブジェクトは `est_doc_new' で生成されているので、不要になったら `est_doc_close' で破棄してください。</dd>
 
596
<dd>`db' はデータベースオブジェクトを指定します。`id' は登録文書のID番号を指定します。`options' はオプションを指定します。`ESTGDNOATTR' は属性を取得しないことを指示し、`ESTGDNOTEXT' は本文を取得しないことを指示し、`ESTGDNOKWD' はキーワードを取得しないことを指示します。オプションはビット和で同時に指定できます。戻り値は文書オブジェクトか、エラーなら `NULL' です。戻り値のオブジェクトは `est_doc_new' で生成されているので、不要になったら `est_doc_delete' で破棄してください。</dd>
534
597
</dl>
535
598
 
536
599
<p>データベースから文書の属性を取得するには、関数 `est_db_get_doc_attr' を用います。</p>
582
645
<dd>`db' はデータベースオブジェクトを指定します。`cond' は検索条件オブジェクトを指定します。`nump' は戻り値の配列の要素数を格納する変数へのポインタです。`hints' は各検索語に該当する文書数を格納するマップオブジェクトを指定しますが、`NULL' なら無視されます。否定条件の中の語の該当数は負数になります。マップ内の空文字列のキーには全体の該当数が関連づけられます。戻り値は該当した文書のIDを格納した配列です。この関数は決してエラーになりません。もし該当する文書がない場合にも、空の配列が返されます。戻り値の領域は `malloc' で生成されているので、不要になったら `free' で破棄してください。</dd>
583
646
</dl>
584
647
 
 
648
<p>複数のデータベースを検索して検索条件に該当する文書の一覧を取得するには、関数 `est_db_search_meta' を用います。</p>
 
649
 
 
650
<dl>
 
651
<dt><kbd>int *est_db_search_meta(ESTDB **<var>dbs</var>, int <var>dbnum</var>, ESTCOND *<var>cond</var>, int *<var>nump</var>, CBMAP *<var>hints</var>);</kbd></dt>
 
652
<dd>`dbs' はデータベースオブジェクトを要素とした配列を指定します。`dbnum' はその配列の要素数を指定します。`cond' は検索条件オブジェクトを指定します。`nump' は戻り値の配列の要素数を格納する変数へのポインタです。`hints' は各検索語に該当する文書数を格納するマップオブジェクトを指定しますが、`NULL' なら無視されます。否定条件の中の語の該当数は負数になります。マップ内の空文字列のキーには全体の該当数が関連づけられます。戻り値は該当した文書を格納したデータベースのインデックスと文書IDを交互に要素とする配列です。この関数は決してエラーになりません。もし該当する文書がない場合にも、空の配列が返されます。戻り値の領域は `malloc' で生成されているので、不要になったら `free' で破棄してください。</dd>
 
653
</dl>
 
654
 
585
655
<p>文書が検索条件のフレーズに完全に一致するか調べるには、関数 `est_db_scan_doc' を用います。</p>
586
656
 
587
657
<dl>
593
663
 
594
664
<dl>
595
665
<dt><kbd>void est_db_set_cache_size(ESTDB *<var>db</var>, size_t <var>size</var>, int <var>anum</var>, int <var>tnum</var>, int <var>rnum</var>);</kbd></dt>
596
 
<dd>`db' はデータベースオブジェクトを指定します。`size' はインデックス用のキャッシュメモリの最大サイズを指定します。デフォルトは64MBです。0を越えない値を指定すると、現状の設定を変更しません。`anum' は文書の属性用のキャッシュのレコード数を指定します。デフォルトは8192個です。0を越えない値を指定すると、現状の設定を変更しません。`tnum' は文書のテキスト用のキャッシュのレコード数を指定します。デフォルトは1024個です。0を越えない値を指定すると、現状の設定を変更しません。`rnum' は出現結果用のキャッシュのレコード数を指定します。デフォルトは256個です。0を越えない値を指定すると、現状の設定を変更しません。</dd>
 
666
<dd>`db' はデータベースオブジェクトを指定します。`size' はインデックス用のキャッシュメモリの最大サイズを指定します。デフォルトは64MBです。負数を指定すると、現状の設定を変更しません。`anum' は文書の属性用のキャッシュのレコード数を指定します。デフォルトは8192個です。負数を指定すると、現状の設定を変更しません。`tnum' は文書のテキスト用のキャッシュのレコード数を指定します。デフォルトは1024個です。負数を指定すると、現状の設定を変更しません。`rnum' は出現結果用のキャッシュのレコード数を指定します。デフォルトは256個です。負数を指定すると、現状の設定を変更しません。</dd>
597
667
</dl>
598
668
 
599
669
<hr />
738
808
 
739
809
<p>検索条件オブジェクトを渡して<code>est_db_search</code>関数を呼ぶことで、条件に該当する文書のIDの配列を得ることができます。配列の要素数は第3引数のポインタが指す変数に格納されます。第4引数は今は気にしないでください。</p>
740
810
 
741
 
<p>検索結果が得られたら、あとはそれに含まれる個々の文書を取り出してから表示します。<code>est_db_get_doc</code>はIDに対応した文書オブジェクトを取り出す関数です。既に削除した文書がヒットすることもあるので、その場合には<code>NULL</code>が返されます。<code>NULL</code>の場合は単に無視して次の周回に進みます。<code>est_doc_get_attr</code>は属性を取得する関数です。<code>est_doc_get_texts</code>は本文のリストを取得する関数です。この関数の戻り値、QDBMのcabin.hが提供するリストオブジェクトです。<code>cblistnum</code>関数で要素の数を得たり、<code>cblistval</code>関数で特定の番号の要素を取り出すことができます。この例では、取り出した属性や本文の値をそのまま画面に出力しています。</p>
 
811
<p>検索結果が得られたら、あとはそれに含まれる個々の文書を取り出してから表示します。<code>est_db_get_doc</code>はIDに対応した文書オブジェクトを取り出す関数です。既に削除した文書がヒットすることもあるので、その場合には<code>NULL</code>が返されます。<code>NULL</code>の場合は単に無視して次の周回に進みます。<code>est_doc_get_attr</code>は属性を取得する関数です。<code>est_doc_get_texts</code>は本文のリストを取得する関数です。この関数の戻り値は、QDBMのcabin.hが提供するリストオブジェクトです。<code>cblistnum</code>関数で要素の数を得たり、<code>cblistval</code>関数で特定の番号の要素を取り出すことができます。この例では、取り出した属性や本文の値をそのまま画面に出力しています。</p>
742
812
 
743
813
<hr />
744
814
 
745
815
<h2 id="paralleling">並列性</h2>
746
816
 
747
 
<p>Hyper Estraierのデータベースは、ファイルロックによって保護されます。読み込みモードで接続された場合は共有ロックがかかり、書き込みモードで接続された場合は排他ロックがかかります。したがって、読み込みモード同士であれば複数のプロセスが同じデータベースを同時に開くことができますが、書き込みモードで接続できるのは一つのデータベースに対して一つのプロセスだけです。</p>
748
 
 
749
 
<p>読み込みモードの場合、複数のプロセスが同一のデータベースを開くだけでなく、読み込みモードでデータベースを開いたプロセスを<code>fork</code>させることもできます。また、複数のスレッドが単一のデータベースに対するコネクション(データベースオブジェクト)をそれぞれ生成して利用することもできます。なお、コアAPIの各関数はリエントラントですが、コネクションはマルチスレッドセーフではありませんので、スレッド毎にコネクションを割り当てるか、mutexで各コネクションを保護するかしてください。</p>
750
 
 
751
 
<p>マルチプロセスであってもマルチスレッドであっても、書き込みモードのコネクションは単一のデータベースに対しては同時に一つしか生成できません。複数生成するとデータベースが壊れます。したがって、マルチスレッドで更新を行う場合は、スレッド間でコネクションを共有するとともに、グローバルなmutexでコネクションを保護する必要があります。</p>
 
817
<p>Hyper Estraierのデータベースは、ファイルロックによって保護されます。読み込みモードで接続された場合は共有ロックがかかり、書き込みモードで接続された場合は排他ロックがかかります。したがって、読み込みモード同士であれば複数のプロセスが同じデータベースを同時に開くことができますが、書き込みモードで接続できるのは一つのデータベースに対して一つのプロセスだけです。読み込みモードの場合、複数のプロセスが同一のデータベースを開くだけでなく、読み込みモードでデータベースを開いたプロセスを<code>fork</code>させることもできます。</p>
 
818
 
 
819
<p>書き込みモードであっても読み込みモードであっても、同一プロセス内で同一のデータベースに対する複数のコネクションを生成することはできません。マルチスレッドのプログラムにおいて複数のスレッドでデータベースを処理したい場合は、スレッド間でコネクションを共有するようにしてください。なお、コアAPIの各関数はリエントラントですが、コネクションはマルチスレッドセーフではありませんので、mutexで各コネクションを保護するようにしてください。</p>
752
820
 
753
821
<p>コネクションを自分で保護するのが面倒な場合は、Hyper EstraierのスレッドAPIを使うとよいでしょう。コアAPIのデータベース管理機能をマルチスレッドセーフにしたものです。スレッドAPIはコアAPIと全く同じ機能を提供しますが、以下の点が異なります。なお、データベース関連以外の機能(ESTDOCとESTCOND)はコアAPIとスレッドAPIで共通です。</p>
754
822
 
780
848
 
781
849
<h3>裏API</h3>
782
850
 
783
 
<p>実は、この文書で紹介した以外にも関数がたくさん提供されています。それらはちょっと使い方が難しい、いわばハッカー用のAPIです。興味を持たれた方は、<code>estraier.h</code>を覗いてみてください。</p>
 
851
<p>実は、このガイドで紹介した以外にも関数がたくさん提供されています。それらはちょっと使い方が難しい、いわばハッカー用のAPIです。興味を持たれた方は、<code>estraier.h</code>を覗いてみてください。</p>
784
852
 
785
853
<h3>ミニライブラリ</h3>
786
854
 
790
858
 
791
859
<p>C言語以外のプログラミング言語からHyper Estraierを使うためのバインディングを作るプロジェクトも進行中です。あなたが新たな言語のバインディングを作ってくれるのも歓迎します。その際には、<code>estraier.idl</code>ファイルに記述してあるインターフェイスを参考にしてください。各種のバインディングのインターフェイスはなるべく似ている方が覚えやすいですよね。</p>
792
860
 
 
861
<p>現状ではHyper EstraierのソースパッケージにはJavaとRubyとPerlの言語バインディングが収録されていますが、それらはC言語のスレッドAPIをベースとして実装されています。したがって、並列性の性質はスレッドAPIと同様になります。</p>
 
862
 
793
863
<hr />
794
864
 
795
865
</body>