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" /> |
13 |
<meta name="description" content="User's Guide of Hyper Estraier" /> |
14 |
<link rel="contents" href="./" /> |
15 |
<link rel="alternate" href="uguide-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>User's Guide of Hyper Estraier Version 1 (Japanese)</title> |
20 |
</head> |
21 |
|
22 |
<body> |
23 |
|
24 |
<h1>ユーザガイド</h1> |
25 |
|
26 |
<div class="note">Copyright (C) 2004-2005 Mikio Hirabayashi</div> |
27 |
<div class="note">Last Update: Tue, 07 Jun 2005 06:17:00 +0900</div> |
28 |
<div class="navi">[<a href="uguide-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="#attributes">文書の属性</a></li> |
37 |
<li><a href="#formats">ファイル形式</a></li> |
38 |
<li><a href="#searchcond">検索条件式</a></li> |
39 |
<li><a href="#wordextraction">検索語の抽出</a></li> |
40 |
<li><a href="#estcmd">管理用コマンド</a></li> |
41 |
<li><a href="#estseek">検索用CGIスクリプト</a></li> |
42 |
<li><a href="#tips">助言</a></li> |
43 |
<li><a href="#faq">よく聞かれる質問</a></li> |
44 |
</ol> |
45 |
|
46 |
<hr /> |
47 |
|
48 |
<h2 id="introduction">はじめに</h2> |
49 |
|
50 |
<p>この文書では、Hyper Estraierのアプリケーションの詳細な使い方を説明します。<a href="intro-ja.html">イントロダクション</a>をまだお読みでない場合は、先にそちらに目を通しておいてください。</p> |
51 |
|
52 |
<p>Hyper Estraierは、いわゆるインデックス型の検索システムです。検索を行う前に、対象文書の情報を登録したインデックスを準備しておく必要があります。その手間がかかるかわりに、とても高速に検索を行うことができます。Hyper Estraierはインデックスを管理するコマンド「estcmd」とインデックスを使って検索を行うCGIスクリプト「estseek.cgi」からなります。つまり、コマンドラインでインデックスの管理作業を行い、Webブラウザで検索を行うことになります。</p> |
53 |
|
54 |
<p>estcmdは様々な形式の文書を扱うことができ、またインデックスに対する多様な管理操作を行うことができます。この文書では、文書の扱われ方やインデックスの管理方法について詳細に説明します。</p> |
55 |
|
56 |
<p>Hyper Estraierは様々な検索方法をサポートします。複数の検索語を組み合わせたり、文書の属性を使って検索したりすることができます。また、estseek.cgiの設定により、表示方法をカスタマイズすることができます。この文書ではそれらの方法についても説明します。</p> |
57 |
|
58 |
<hr /> |
59 |
|
60 |
<h2 id="attributes">文書の属性</h2> |
61 |
|
62 |
<p>Hyper Estraierが扱う文書には、本文の情報だけでなく、タイトルなどの属性情報をつけることができます。属性は様々な応用ができます。属性を使った検索もできますし、更新日時の属性は差分更新の判断にも使われます。</p> |
63 |
|
64 |
<h3>属性名</h3> |
65 |
|
66 |
<p>属性には名前がつけられます。属性名は自由につけることができるのですが、Hyper Estraierが標準的に使う属性はシステム属性として予め定義されています。システム属性の名前には「@」が先頭につきます。システム属性は以下のものがあります。</p> |
67 |
|
68 |
<ul> |
69 |
<li><kbd>@id</kbd> : 文書をインデックスに登録した際に自動的に振られます。</li> |
70 |
<li><kbd>@uri</kbd> : 文書の参照方法を示します。全ての文書に必須です。</li> |
71 |
<li><kbd>@cdate</kbd> : 文書の作成日時を示します。</li> |
72 |
<li><kbd>@mdate</kbd> : 文書の最終更新日時を示します。差分更新に使われます。</li> |
73 |
<li><kbd>@title</kbd> : 文書のタイトルです。検索結果で見出しとして扱われます。</li> |
74 |
<li><kbd>@author</kbd> : 文書の著者です。</li> |
75 |
<li><kbd>@type</kbd> : 文書のメディアタイプです。</li> |
76 |
<li><kbd>@lang</kbd> : 文書の言語です。</li> |
77 |
<li><kbd>@size</kbd> : 文書のサイズです。</li> |
78 |
</ul> |
79 |
|
80 |
<p>システム属性以外の属性はユーザ定義属性と呼ばれます。後述の文書ドラフト形式を使うと、任意のシステム属性とユーザ定義属性をつけることができます。HTMLのmeta要素やMIMEのヘッダもユーザ属性として扱われます。</p> |
81 |
|
82 |
<h3>属性の型</h3> |
83 |
|
84 |
<p>属性には2種類の型があります。文字列型と数値型です。文字列型は、任意の文字列です。文字列型の値には、完全一致、前方一致、後方一致、部分一致の判定ができます。数値型は、数値または日付の情報を表したものです。数値型は文字列を数値に直した上で、大小の判定が行われます。数値型の値は形式によって扱われ方が違います。日付として解釈される場合、UNIX紀元(1970年1月1日0時0分0秒)からの経過秒数が判定に使われます。</p> |
85 |
|
86 |
<ul> |
87 |
<li>全てが数字 → 10進数として解釈される。</li> |
88 |
<li>先頭が0x → 16進数として解釈される。</li> |
89 |
<li>W3CDTF(例:1978-02-11T18:05:32+09:00) → 日付として解釈される。</li> |
90 |
<li>RFC822(例:Sat, 11 Feb 1978 18:05:32 +0900) → 日付として解釈される。</li> |
91 |
<li>YYYY/MM/DD形式(1978/02/11 18:05:32) → 日付として解釈される。</li> |
92 |
<li>上記以外 → -1として解釈される。</li> |
93 |
</ul> |
94 |
|
95 |
<p>属性がどの型であるかは登録時には決定されません。検索時に属性をどちらの型として解釈するが指定されます。属性の長さに制限はありません。</p> |
96 |
|
97 |
<p>文書の属性や本文に指定する文字列はUTF-8で表現されている必要があります。テキストファイルやHTMLなどでそれ以外の文字コードを使っている場合は、UTF-8に変換してください。なお、estcmdは文字コードを自動判定して変換処理を行います。</p> |
98 |
|
99 |
<p>システム属性でもユーザ属性でも、実際にどのような値を入れるかはユーザやアプリケーションに任されます。指定する側と解釈する側で合意が取れていれば問題ないわけですが、RFCなどで関連する規定がある場合はそれに従うのがよいでしょう。例えば、「@type」にはRFC2045のメディアタイプの書式を用い、「@lang」にはISO639の言語コード(「ja」「en」など)を用いるとよいでしょう。ユーザ属性の仕様を決める際にはDublin Coreの規格を参考にするといいかもしれません。</p> |
100 |
|
101 |
<h3>URI属性</h3> |
102 |
|
103 |
<p>URI(Uniform Resource Identifier)は、文書を識別するための文字列です。HTTPやFTPやLDAPのURL(Uniform Resource Locator)はURIの一種です。インデックスに登録する全ての文書にはURI属性がついている必要があります。</p> |
104 |
|
105 |
<p>外部(インターネット)に公開されるURIは、世界中のどのユーザからも一意に識別できる必要があります。したがって、ローカルホストでしか通用しない「file://」のURLは外部に公開すべきではありません。estseek.cgiは「file://」のURLを「http://」や「ftp://」などに置換する機能を備えていますので、それを活用してください。</p> |
106 |
|
107 |
<p>URIはファイルを識別するだけのものではありません。書籍のISBNなどのURN(Uniform Resource Name)もURIの一種です。また、URIのスキーマは独自に定義することもできます。例えば、XYZ社の社員名簿の全文検索システムであれば、社員番号を含めた「xyz:empno:12345」のようなURI属性を生成するのもよいでしょう。</p> |
108 |
|
109 |
<p>URIに日本語などのマルチバイト文字をそのまま使ってはいけません。その場合、一般にURLエンコードと呼ばれるエスケープ処理が必要となります。URIの仕様についてはRFC2396を参照してください。</p> |
110 |
|
111 |
<p>estcmdは、「file://」で始まるローカルファイルシステムのURLをURI属性として自動的につけてくれます。ただし、対象文書がURI属性を独自に定義している場合はそちらを優先します。ローカルファイルシステムのURLは「_lpath」という属性としても記録されます。ローカルファイルシステムのファイル名をUTF-8に正規化した文字列は「_lfile」という属性として記録されます。</p> |
112 |
|
113 |
<hr /> |
114 |
|
115 |
<h2 id="formats">ファイル形式</h2> |
116 |
|
117 |
<p>estcmdが扱う4種類のファイル形式のそれぞれがどのように扱われるかを説明します。その他の形式を扱うためのフィルタについては後述します。</p> |
118 |
|
119 |
<h3>プレーンテキスト</h3> |
120 |
|
121 |
<p>特に構造のない文字列です。デフォルトでは、ファイル名の接尾辞が「.txt」「.text」「.asc」の場合にプレーンテキストとして扱われます。</p> |
122 |
|
123 |
<ul> |
124 |
<li>文字コードは自動判定されます。</li> |
125 |
<li>@type属性として「text/plain」が記録されます。</li> |
126 |
<li>@size属性としてファイルサイズが記録されます。</li> |
127 |
</ul> |
128 |
|
129 |
<h3>HTML</h3> |
130 |
|
131 |
<p>言わずもがな、Webで使われるハイパーテキストです。デフォルトでは、ファイル名の接尾辞が「.html」「.htm」「.xhtml」「.xht」の場合にHTMLとして扱われます。</p> |
132 |
|
133 |
<ul> |
134 |
<li>文字コードは自動判定されますが、meta要素で文字コードが指定された場合はそちらが優先されます。</li> |
135 |
<li>title要素があれば、その内容が@title属性として記録されます。</li> |
136 |
<li>meta要素のname属性でauthorが指定されていれば、そのcontent要素の値が@author属性として記録されます。</li> |
137 |
<li>@type属性として「text/html」が記録されます。</li> |
138 |
<li>@size属性としてファイルサイズが記録されます。</li> |
139 |
<li>meta要素のname属性またはhttp-equiv属性が指定されていれば、その属性値を小文字に変換した名前のユーザ属性として、content要素の値を記録します。</li> |
140 |
<li>@title属性の値は隠しテキストとして扱われます。</li> |
141 |
</ul> |
142 |
|
143 |
<p>隠しテキストについては後述します。</p> |
144 |
|
145 |
<h3>MIME(電子メール)</h3> |
146 |
|
147 |
<p>RFC822に基づくメッセージ交換のためのデータ形式です。デフォルトでは、ファイル名の接尾辞が「.eml」「.mime」「.mht」「.mhtml」の場合にMIMEとして扱われます。</p> |
148 |
|
149 |
<ul> |
150 |
<li>文字コードは自動判定されますが、Content-Typeヘッダで文字コードが指定された場合はそちらが優先されます。</li> |
151 |
<li>Subjectヘッダがあれば、その内容が@title属性として記録されます。</li> |
152 |
<li>Fromヘッダがあれば、その内容が@author属性として記録されます。</li> |
153 |
<li>Dateヘッダがあれば、その内容が@cdate属性および@mdate属性として記録されます。</li> |
154 |
<li>@type属性として「message/rfc822」が記録されます。</li> |
155 |
<li>@size属性としてファイルサイズが記録されます。</li> |
156 |
<li>全てのヘッダの値は、ヘッダ名を小文字に変換した名前のユーザ属性として指定されます。</li> |
157 |
<li>@title属性の値は隠しテキストとして扱われます。</li> |
158 |
</ul> |
159 |
|
160 |
<p>マルチパートの各パートの中身が「text/plain」か「text/html」か「message/rfc822」の場合には、その内容を本文として扱います。これによって、Webアーカイブ(MHTML)も適切に扱うことができます。ヘッダの値がMIMEエンコードされていた場合はそれをデコードして扱います。エンティティがBase64やquoted-printableでエンコードされていた場合はそれをデコードして扱います。</p> |
161 |
|
162 |
<h3>文書ドラフト</h3> |
163 |
|
164 |
<p>Hyper Estraier独自のデータ形式です。文書ドラフトを中間フォーマットとして使うことで、様々な形式の文書を統合的に扱うことができます。デフォルトでは、ファイル名の接尾辞が「.est」の場合に文書ドラフトとして扱われます。</p> |
165 |
|
166 |
<p>文書ドラフトの形式はRFC822に似ていますが、細かい違いがあります。ヘッダの区切り文字は「:」でなく「=」です。また、「=」の後に空白を置く必要はありません。例えば、MIDIの歌詞データを登録する際には、以下のようなデータになるでしょう。</p> |
167 |
|
168 |
<pre>@uri=http://www.music-estraier.com/mididb/w/wa/wakamonotachi.kar |
169 |
@title=若者たち |
170 |
@author=佐藤勝,藤田敏雄 |
171 |
@cdate=2004-11-01T23:11:18+09:00 |
172 |
@mdate=2005-03-21T08:07:45+09:00 |
173 |
category=chorus,j-pop |
174 |
|
175 |
君の行く道は 果てしなく遠い |
176 |
だのになぜ 歯をくいしばり |
177 |
君は行くのか そんなにしてまで |
178 |
若者たち |
179 |
佐藤勝,藤田敏雄 |
180 |
</pre> |
181 |
|
182 |
<p>文書ドラフトは以下の仕様を満たす必要があります。</p> |
183 |
|
184 |
<ul> |
185 |
<li>正常なUTF-8エンコードのテキストから構成されます。</li> |
186 |
<li>改行形式はUNIX形式(LF)かMS-DOS形式(CR+LF)のどちらかです。</li> |
187 |
<li>属性部とテキスト部からなり、両者は最初に出現した空行で区切られます。</li> |
188 |
<li>属性部において、各行は属性の指定として扱われます。属性名と値は最初に出現した「=」で区切られます。</li> |
189 |
<li>テキスト部において、各行は本文の文字列として扱われます。行頭がタブ文字で始まっている場合、その行は隠しテキストとして扱われます。</li> |
190 |
</ul> |
191 |
|
192 |
<p>隠しテキストは、通常の本文と同様に検索語が抽出されますが、検索結果の紹介文では表示されないことが特徴です。タイトルや著者に含まれる語も全文検索の対象にしたい場合には、タイトルや著者と同じ文字列を隠しテキストとしても指定するとよいでしょう。</p> |
193 |
|
194 |
<p>文書ドラフトの最大の特徴は、URI属性を指定できることです。つまり、文書ドラフト自体のURIではなく、別のファイルのURIをインデックスに記録することができるのです。WebからHTMLデータを収集して文書ドラフト形式で保存するプログラムを作れば、簡易的なWeb検索エンジンを簡単に実現することができます。文書ドラフトを保存するオーバーヘッドをかけたくない場合は、いよいよAPIを使うことになります。</p> |
195 |
|
196 |
<hr /> |
197 |
|
198 |
<h2 id="searchcond">検索条件式</h2> |
199 |
|
200 |
<p>検索条件には、全文検索条件と属性検索条件の2種類があります。両方を同時に指定することもでき、その場合は両方を満たした文書が該当とみなされます。さらに、全文検索の条件式には、通常書式と簡便書式の2種類があります。用途に応じて使い分けてください。</p> |
201 |
|
202 |
<h3>全文検索条件の通常書式</h3> |
203 |
|
204 |
<p>全文検索条件は、指定した語句が本文に含まれる文書を検索するためのものです。例えば、「コンピュータ」という文字列を含む文書を探したいなら、検索式に「コンピュータ」とそのまま指定してください。</p> |
205 |
|
206 |
<p>複数の検索語を空白で区切ってならべることもできます。例えば、「United Nations」と指定すると、「United」の直後に「Nations」が来る文書を検索します。</p> |
207 |
|
208 |
<p>検索語を「<kbd>AND</kbd>」で挟んで並べると、AND検索ができます。例えば、「インターネット AND セキュリティ」と指定すると、「インターネット」と「セキュリティ」の両方を含む文書を検索します。</p> |
209 |
|
210 |
<p>検索語を「<kbd>ANDNOT</kbd>」で挟んで並べると、NOT検索ができます。例えば、「スキー ANDNOT スノボー」と指定すると、「スキー」を含むが「スノボー」は含まない文書を検索します。ANDNOT検索は、探したい語が他の語の一部に含まれてうまく検索できない場合にも便利です。「ファイル」で検索すると「プロファイル」がヒットして鬱陶しい場合には、「ファイル ANDNOT プロファイル」とするとよいでしょう。</p> |
211 |
|
212 |
<p>検索語を「<kbd>OR</kbd>」で挟んで並べると、OR検索ができます。例えば、「レモン OR ライム」と指定すると、「レモン」と「ライム」の片方または両方を含む文書を検索します。OR検索は、類義語や表記の揺れに対応した検索をするのに便利です。「woman OR women」などとして英単語の活用を吸収したり、「龍馬 OR 竜馬」などとして漢字表記の揺れを吸収したりするとよいでしょう。</p> |
213 |
|
214 |
<p>「OR」は「AND」や「ANDNOT」よりも優先順位が高いことに注意してください。例えば、「F1 OR F-1 OR Formula One AND 優勝 OR チャンピオン」と入力した場合、「F1」か「F-1」か「Formula One」のどれかを含んで、かつ「優勝」か「チャンピオン」のどちらかを含む文書を探します。</p> |
215 |
|
216 |
<p>Hyper Estraierは、日本語だけでなく、英語、ドイツ語、フランス語、中国語など、大抵の言語を扱うことができます。英字の大文字と小文字の違いは無視されます。「Japan」「japan」「JAPAN」「jaPaN」は全て同じです。ダイアクリティカルマーク付きのラテン文字や、ギリシア文字、キリル文字でも同様です。</p> |
217 |
|
218 |
<p>「AND」「ANDNOT」「OR」は演算子ですので、大文字で書かなければなりません。また、前後に空白が必要です。「AND」という文字列を含む文書を探したい場合は、「and」と指定してください。「ANDNOT」や「OR」でも同様です。</p> |
219 |
|
220 |
<p>全ての文書に該当するワイルドカードとして、「[UVSET]」という定数があります。これを使うと、純粋なNOT検索ができます。例えば、「[UVSET] ANDNOT ファイル」とすると、「ファイル」を含まない全ての文書を検索します。ただし、この処理は遅いです。</p> |
221 |
|
222 |
<h3>全文検索条件の簡便書式</h3> |
223 |
|
224 |
<p>Googleなどの検索エンジンでは、空白で区切ることでAND条件を指定できます。そのような挙動の方が望ましい場合は、簡便書式を使うことができます。簡便書式を使うかどうかは、アプリケーションのコマンドラインのオプションや設定ファイルで指定します。estseek.cgiのデフォルトの設定では、簡便書式が使われるようになっています。</p> |
225 |
|
226 |
<p>簡便書式では、空白または「<kbd>&</kbd>」で区切るとAND条件になります。例えば、「インターネット セキュリティ」と入力すると、「インターネット」と「セキュリティ」の両方を含む文書を検索します。</p> |
227 |
|
228 |
<p>複数の検索語を「<kbd>""</kbd>」で括ると、フレーズ検索ができます。例えば、「"United Nations"」と入力すると、「United」の直後に「Nations」が出現する文書を検索します。</p> |
229 |
|
230 |
<p>「<kbd>!</kbd>」を使うとNOT検索ができます。例えば、「スキー ! スノボー」と入力すると、「スキー」を含むが「スノボー」を含まない文書を検索します。</p> |
231 |
|
232 |
<p>「<kbd>|</kbd>」を使うとOR検索ができます。例えば、「レモン | ライム」と入力すると、「レモン」か「ライム」の片方または両方を含む文書を検索します。</p> |
233 |
|
234 |
<p>「|」の優先順位が「&」や「!」より高いのは通常書式と同じです。</p> |
235 |
|
236 |
<h3>属性検索条件</h3> |
237 |
|
238 |
<p>属性検索条件は、各文書が持つ属性に対して演算子を適用して、該当する文書を検索するためのものです。属性条件式は属性名と演算子と値を空白で区切って並べたものです。例えば、「@title STRINC 重要」と指定すると、タイトルに「重要」という文字列を含む文書だけに絞り込みます。「STRINC」は演算子です。属性検索用の演算子には以下のものがあります。</p> |
239 |
|
240 |
<ul> |
241 |
<li><kbd>STREQ</kbd> : 指定した文字列と一致する。</li> |
242 |
<li><kbd>STRNE</kbd> : 指定した文字列と一致しない。</li> |
243 |
<li><kbd>STRINC</kbd> : 指定した文字列を含む。</li> |
244 |
<li><kbd>STRBW</kbd> : 指定した文字列で始まる。</li> |
245 |
<li><kbd>STREW</kbd> : 指定した文字列で終わる。</li> |
246 |
<li><kbd>NUMEQ</kbd> : 数値や日付が指定したものと等しい。</li> |
247 |
<li><kbd>NUMNE</kbd> : 数値や日付が指定したものと等しくない。</li> |
248 |
<li><kbd>NUMGT</kbd> : 数値や日付が指定したものより大きい。</li> |
249 |
<li><kbd>NUMGE</kbd> : 数値や日付が指定したものと同じかより大きい。</li> |
250 |
<li><kbd>NUMLT</kbd> : 数値や日付が指定したものより小さい。</li> |
251 |
<li><kbd>NUMLE</kbd> : 数値や日付が指定したものと同じかより小さい。</li> |
252 |
</ul> |
253 |
|
254 |
<p>演算子の前に「<kbd>!</kbd>」を置いて「!STREQ」などとすると、条件に当てはまらないものに絞り込みます。例えば、「@title !STRBW ※未承諾広告」などとします。文字列の演算子の前に「<kbd>I</kbd>」を置いて「ISTREQ」などとすると、文字列の大文字と小文字の違いを無視します。「!」と「I」を両方指定する場合、「!ISTREQ」などとします。演算子を省略して属性名のみを指定した場合、値は問わずに、その属性を備える文書を該当とみなします。</p> |
255 |
|
256 |
<p>属性条件は複数指定することができます。その場合、指定された全ての条件を満たす文書が該当とみなされます。なお、属性検索を行うと候補の全ての文書の情報を参照するため、検索速度が多少遅くなります。</p> |
257 |
|
258 |
<h3>順序指定</h3> |
259 |
|
260 |
<p>順序指定式によって、結果の表示順序を指定することもできます。順序指定式は属性名と演算子を空白で区切って並べたものです。例えば、「@size NUMA」と指定すると、サイズが小さい文書から並べられます。「NUMA」は演算子です。順序指定用の演算子には以下のものがあります。演算子を省略した場合は、「STRA」が指定されたとみなします。</p> |
261 |
|
262 |
<ul> |
263 |
<li><kbd>STRA</kbd> : 文字列(辞書順)の昇順。</li> |
264 |
<li><kbd>STRD</kbd> : 文字列(辞書順)の降順。</li> |
265 |
<li><kbd>NUMA</kbd> : 数値または日付の昇順。</li> |
266 |
<li><kbd>NUMD</kbd> : 数値または日付の降順。</li> |
267 |
</ul> |
268 |
|
269 |
<p>順序指定を行わなかった場合は、スコアの降順になります。スコアとは、各文書に指定した検索語がどのくらい含まれるかという指標です。AND検索やOR検索で複数の語が指定された場合、TF-IDF法に基づいてスコアの調整が行われます。「the」や「する」といった頻出語よりも、「hippopotamus」や「咀嚼」といった特徴的な語句に高いスコアをつけるということです。また、検索語が同数程度含まれるならば、総語数の多い文書よりも総語数の少ない文書の方がスコアが高くなります。</p> |
270 |
|
271 |
<p>順序指定式は一つしか指定できません。なお、順序指定を行うと候補の全ての文書の情報を参照するため、検索速度が多少遅くなります。</p> |
272 |
|
273 |
<h3>類似検索</h3> |
274 |
|
275 |
<p>ある文書に似た文書を探す、類似検索もサポートされます。関連文書検索とも呼ばれることもあります。類似検索の利用方法はアプリケーションによって様々ですが、典型的には、検索結果に示される文書のひとつをユーザが指定して、それに似た文書を再検索するために使われます。類似検索の結果は関連度の降順に並べられます。関連度はベクトル空間モデルという考え方に基づいて算出されます。文書からキーワードを取り出してベクトルとして表現し、ベクトル同士のなす角の余弦を関連度とするものです。ちょっと難しい言い方になりましたが、要するに、語彙が似通った文書は類似度が高くなるということです。キーワードとしては、文書内の頻度にTF-IDF法で重みづけを行った結果が上位の語句が選択されます。</p> |
276 |
|
277 |
<p>類似検索の条件式をユーザが入力する必要はありませんが、アプリケーションに類似検索機能をつけるためには書式を知っておく必要があります。検索フレーズが「[SIMILAR]」という演算子で始まっている場合に類似検索が行われます。「[SIMILAR]」の後ろには、種文書(類似判定の元となる文書)のベクトルの要素を列挙します。各要素は「WITH」演算子で始まり、スコアの数値とキーワードの文字列を空白で区切って指定します。例えば、300の「日本」と250の「japan」と100の「東京」を含む文書を仮想の種文書とする場合は、「[SIMILAR] WITH 300 日本 WITH 250 japan WITH 100 東京」と指定します。</p> |
278 |
|
279 |
<p>関連文書検索と順序指定式を同時に指定した場合、関連度が0.5以上の文書に絞り込んだ上で、順序指定式に基づいて並べられます。なお、関連文書検索の検索速度はとても遅いです。</p> |
280 |
|
281 |
<hr /> |
282 |
|
283 |
<h2 id="wordextraction">検索語の抽出</h2> |
284 |
|
285 |
<p>文書の本文や検索フレーズの文字列から検索語を抽出する際には、いくつかのルールがあります。ここでは、そのルールついて詳しく説明します。</p> |
286 |
|
287 |
<h3>2-gram方式</h3> |
288 |
|
289 |
<p>英語やその他のヨーロッパの言語にのように空白で語が区切れる場合、空白で区切った文字列を検索語として登録します。「It is fine today.」という文字列からは、「it」「is」「fine」「today」「.」の5個の検索語が抽出されます。</p> |
290 |
|
291 |
<p>日本語をはじめとする、語を空白で区切れない言語の場合は、N-gramという手法で検索語が抽出されます。連続する2文字を語として、1文字ずつずらしながら語を抽出する手法です。2文字を語とするので2-gramと呼ばれることもあります。例えば「本日は晴天なり。」という文字列からは、「本日」「日は」「は晴」「晴天」「天な」「なり」「り。」の7個の検索語が抽出されます。</p> |
292 |
|
293 |
<p>2-gram方式だと1文字の検索語はどの検索キーにも一致しないことになりますが、それでも検索は可能です。1文字の検索語が指定された場合、その文字を含む全てのキーのOR検索が内部的に行われます。ただし、調べるキーの数が多いので、検索速度は少し遅くなります。</p> |
294 |
|
295 |
<h3>検査の省略による高速化</h3> |
296 |
|
297 |
<p>「ホンマグロ」という検索語が指定された場合「ホン」「ンマ」「マグ」「グロ」を含み、かつそれぞれが隣り合っている部分がある文書を該当とみなせばよいことになります。しかし、デフォルトでは全ての語をの検査をせず、「ホン」と「マグ」だけを調べます。「ホン」の1つ飛ばした隣に「マグ」があるならば、「ンマ」を調べる必要はないからです。また、各検索語は後ろになにが来るかという情報を持っているので、「マグ」を調べると「グロ」の存在もわかります。このような工夫をしてなるべく検査を省略した方が、応答時間が短くなって快適です。</p> |
298 |
|
299 |
<p>ただし、スコアの計算は、調べた検索語が各該当文書の中で出現する数を基準に行うので、全ての語を調べた方が精度が高まることが多いです。つまり、速度と精度のトレードオフの関係になります。どちらを優先するかはアプリケーションのコマンドラインオプションや設定ファイルで指定します。estseek.cgiのデフォルトの設定では1個飛ばしで検査するようになっています。</p> |
300 |
|
301 |
<h3>精度の制限による高速化</h3> |
302 |
|
303 |
<p>Hyper Estraierでは、N-gramの連接判定の精度を落とすことによって処理速度を上げる工夫がなされています。検索やインデックス更新の処理が高速な反面、まれに検索語が含まれない文書が該当とみなされることがあります。検索語の後ろ2語まで(日本語なら3文字分)の連接判定しかしませんので、「シミュレーション」で検索した場合、「シミュレ」「ミュレー」「ュレーシ」「レーショ」「ーション」の全てを含む文書は、たとえ「シミュレーション」がなくても該当してしまいます。また、連接判定にはハッシュ関数を用いますので、まれ(251分の1の確率)に精度が3語分を下回ることがあります。ただし、スニペットを作る際には完全な連接判定が行われますので、スニペットの中に検索語のハイライトが含まれない文書は検索ゴミであることが容易にわかります。</p> |
304 |
|
305 |
<h3>分かち書き方式との比較</h3> |
306 |
|
307 |
<p>N-gram方式と対比されるアプローチとして、分かち書き方式があります。Hyper Estraierの前身である<a href="http://estraier.sourceforge.net/">Estraier</a>では分かち書き方式を採用していました。N-gram方式は再現率がほぼ完璧である(検索漏れがない)という利点がありますが、分かち書き方式に比べて精度が低い(検索ゴミが多い)という欠点があります。検索システムの用途や文書の内容によってどちらが適するかは変わってきます。興味を持たれた方は、Hyper EstraierとEstraierの使い勝手を比べてみてください。</p> |
308 |
|
309 |
<hr /> |
310 |
|
311 |
<h2 id="estcmd">管理用コマンド</h2> |
312 |
|
313 |
<p>ここでは、インデックス管理用コマンドestcmdの詳細な仕様を説明します。検索もできるので、estcmdをスクリプト言語から呼び出せばそれなりのアプリケーションが簡単に作れます。</p> |
314 |
|
315 |
<h3>書式</h3> |
316 |
|
317 |
<p>estcmdは多くのサブコマンドの集合体です。サブコマンドの名前は第1引数で指定されます。その他の引数はサブコマンドの種類に応じて解釈されます。<var>db</var>という引数はインデックスのパスです。</p> |
318 |
|
319 |
<dl> |
320 |
<dt><kbd>estcmd put [-cl] <var>db</var> [<var>file</var>]</kbd></dt> |
321 |
<dd>文書ドラフト形式のファイルを登録します。</dd> |
322 |
<dd><var>file</var>は対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。</dd> |
323 |
<dd>-clを付けると、上書きされた文書の領域を整理します。</dd> |
324 |
</dl> |
325 |
|
326 |
<dl> |
327 |
<dt><kbd>estcmd out [-cl] <var>db</var> <var>expr</var></kbd></dt> |
328 |
<dd>特定の文書の情報をインデックスから削除します。</dd> |
329 |
<dd><var>expr</var>は対象のID番号かURIを指定します。</dd> |
330 |
<dd>-clを付けると、削除された文書の領域を整理します。</dd> |
331 |
</dl> |
332 |
|
333 |
<dl> |
334 |
<dt><kbd>estcmd get <var>db</var> <var>expr</var> [<var>attr</var>]</kbd></dt> |
335 |
<dd>特定の文書の情報を文書ドラフト形式で出力します。</dd> |
336 |
<dd><var>expr</var>は対象のID番号かURIを指定します。</dd> |
337 |
<dd><var>attr</var>を付けると、その属性の値のみを出力します。</dd> |
338 |
</dl> |
339 |
|
340 |
<dl> |
341 |
<dt><kbd>estcmd list <var>db</var></kbd></dt> |
342 |
<dd>インデックスに登録されている全ての文書のID番号を出力します。</dd> |
343 |
</dl> |
344 |
|
345 |
<dl> |
346 |
<dt><kbd>estcmd uriid <var>db</var> <var>uri</var></kbd></dt> |
347 |
<dd>指定したURIの文書のID番号を出力します。</dd> |
348 |
<dd><var>uri</var>は対象のURIを指定します。</dd> |
349 |
</dl> |
350 |
|
351 |
<dl> |
352 |
<dt><kbd>estcmd meta <var>db</var> [<var>name</var> [<var>value</var>]]</kbd></dt> |
353 |
<dd>データベースのメタデータを扱います。</dd> |
354 |
<dd><var>name</var>はメタデータの名前を指定します。省略した場合は名前の一覧を出力します。</dd> |
355 |
<dd><var>value</var>は記録するメタデータの値を指定します。省略した場合は現状の値を出力します。空文字列の場合は削除します。</dd> |
356 |
</dl> |
357 |
|
358 |
<dl> |
359 |
<dt><kbd>estcmd inform <var>db</var></kbd></dt> |
360 |
<dd>インデックスに登録された文書数と異なり語数を出力します。</dd> |
361 |
</dl> |
362 |
|
363 |
<dl> |
364 |
<dt><kbd>estcmd optimize [-onp] [-ond] <var>db</var></kbd></dt> |
365 |
<dd>インデックスを最適化して、不要な領域を削除します。</dd> |
366 |
<dd>-onpを付けると、削除されたドキュメントの領域を回収する処理を省略します。</dd> |
367 |
<dd>-ondを付けると、データベースファイルの最適化を省略します。</dd> |
368 |
</dl> |
369 |
|
370 |
<dl> |
371 |
<dt><kbd>estcmd search [-ic <var>enc</var>] [-vu|-va|-vf|-vs|-vh|-vx|-dd] [-gs|-gf|-ga] [-ni] [-sf] [-hs] [-attr <var>expr</var>] [-ord <var>expr</var>] [-max <var>num</var>] [-sim <var>id</var>] <var>db</var> [<var>phrase</var>]</kbd></dt> |
372 |
<dd>インデックスに登録された文書を検索します。</dd> |
373 |
<dd><var>phrase</var>は全文検索の検索式を指定します。</dd> |
374 |
<dd>-icは引数の文字コードを指定します。デフォルトはUTF-8です。</dd> |
375 |
<dd>-vuを付けると、ID番号とURIをタブ区切りにした形式で結果を出力します。</dd> |
376 |
<dd>-vaを付けると、属性情報を含めたマルチパート形式で結果を出力します。</dd> |
377 |
<dd>-vfを付けると、文書ドラフト形式を含めたマルチパート形式で結果を出力します。</dd> |
378 |
<dd>-vsを付けると、属性情報とスニペットを含めたマルチパート形式で結果を出力します。</dd> |
379 |
<dd>-vhを付けると、属性情報とスニペットを人間が読みやすい形式にして結果を出力します。</dd> |
380 |
<dd>-vxを付けると、属性情報とスニペットをXML形式にして結果を出力します。</dd> |
381 |
<dd>-ddを付けると、結果を文書ドラフト形式のファイルとして保存します。</dd> |
382 |
<dd>-gsを付けると、N-gramの全てのキーの存在を検査します。デフォルトは1個置きです。</dd> |
383 |
<dd>-gfを付けると、N-gramのキーを2個置きで検査します。</dd> |
384 |
<dd>-gaを付けると、N-gramのキーを3個置きで検査します。</dd> |
385 |
<dd>-niを付けると、TF-IDF法によるスコアの調整を行いません。</dd> |
386 |
<dd>-sfを付けると、検索式を簡便形式として扱います。</dd> |
387 |
<dd>-hsを付けると、該当文書のスコア情報をヒントとして出力します。</dd> |
388 |
<dd>-attrは絞り込みの属性条件を指定します。複数指定可能です。</dd> |
389 |
<dd>-ordはソート条件を指定します。デフォルトはスコアの降順です。</dd> |
390 |
<dd>-maxは最大表示件数を指定します。負数にすると無制限になります。デフォルトは10件です。</dd> |
391 |
<dd>-simは類似検索の種文書のID番号を指定します。</dd> |
392 |
</dl> |
393 |
|
394 |
<dl> |
395 |
<dt><kbd>estcmd gather [-cl] [-fe|-ft|-fh|-fm] [-fx <var>sufs</var> <var>cmd</var>] [-fz] [-fo] [-ic <var>enc</var>] [-il <var>lang</var>] [-pc <var>enc</var>] [-pf] [-apn] [-sd] [-cm] [-cs <var>num</var>] <var>db</var> [<var>file</var>|<var>dir</var>]</kbd></dt> |
396 |
<dd>ファイルシステムを探索して文書を登録します。</dd> |
397 |
<dd>第3引数としてファイル名を指定すると、そのファイルから処理対象のパスのリストを読み込みます。「-」を指定した場合、標準入力が読み込まれます。findコマンドの出力を読み込むと便利です。</dd> |
398 |
<dd>第3引数としてディレクトリ名を指定すると、そのディレクトリ以下の全てのファイルを処理対象にします。</dd> |
399 |
<dd>-clを付けると、上書きされた文書の領域を整理します。</dd> |
400 |
<dd>-feを付けると、処理対象の全てのファイルを文書ドラフトとして扱います。デフォルトでは、拡張子によって文書形式を判断し、サポート外のものは無視されます。</dd> |
401 |
<dd>-ftを付けると、処理対象の全てのファイルをプレーンテキストとして扱います。</dd> |
402 |
<dd>-fhを付けると、処理対象の全てのファイルをHTMLとして扱います。</dd> |
403 |
<dd>-fmを付けると、処理対象の全てのファイルをMIMEとして扱います。</dd> |
404 |
<dd>-fxは、ファイル名の接尾辞に関連づけた外部コマンドを指定します。カンマ区切りで複数の接尾辞を指定できます。コマンド名の前に「T@」をつけるとその出力がプレーンテキストとして解析され、「H@」をつけるとHTMLとして解析され、「M@」をつけるとMIMEとして解析され、いずれでもない場合は文書ドラフトとして解析されます。このオプションは複数回指定できます。</dd> |
405 |
<dd>-fzを付けると、-fxの条件に当てはまらないファイルを無視します。</dd> |
406 |
<dd>-foを付けると、処理対象のファイルを読み込みません。</dd> |
407 |
<dd>-icは対象文書の文字コードを指定します。デフォルトは自動判定です。</dd> |
408 |
<dd>-ilは文字コードの判定で優先される言語を指定します。デフォルトは英語です。</dd> |
409 |
<dd>-pcはファイルのパスの文字コードを指定します。デフォルトはISO-8859-1です。</dd> |
410 |
<dd>-pfを付けると、ファイル名の代わりにフルパスを属性として記録します。</dd> |
411 |
<dd>-apnをつけると、全ての言語をN-gram法で処理します。</dd> |
412 |
<dd>-sdを付けると、ファイルの作成日時と更新日時を文書の属性として追加します。</dd> |
413 |
<dd>-cmを付けると、文書の属性の更新日時がファイルの更新日時より古い場合にのみ登録を行います。</dd> |
414 |
<dd>-csは、キャッシュメモリのサイズをメガバイト単位で指定します。デフォルトは64MBです。</dd> |
415 |
</dl> |
416 |
|
417 |
<dl> |
418 |
<dt><kbd>estcmd purge [-cl] [-fc] <var>db</var> [<var>prefix</var>]</kbd></dt> |
419 |
<dd>インデックス内にあってファイルシステム上にない文書の情報を削除します。</dd> |
420 |
<dd><var>prefix</var>を指定すると、その文字列で始まるURIの文書のみを対象とします。</dd> |
421 |
<dd>-clを付けると、削除された文書の領域を整理します。</dd> |
422 |
<dd>-fcを付けると、ファイルがあるかないかにかかわらず文書情報を削除します。</dd> |
423 |
</dl> |
424 |
|
425 |
<dl> |
426 |
<dt><kbd>estcmd extkeys [-fc] [-ni] [-kn <var>num</var>] <var>db</var> [<var>prefix</var>]</kbd></dt> |
427 |
<dd>インデックス内の各文書のキーワードを抽出したデータベースを作成します。</dd> |
428 |
<dd><var>prefix</var>を指定すると、その文字列で始まるURIの文書のみを対象とします。</dd> |
429 |
<dd>-fcを付けると、既にキーワードが登録されている文書でもキーワードを作りなおします。</dd> |
430 |
<dd>-niを付けると、TF-IDF法によるスコアの調整を行いません。</dd> |
431 |
<dd>-knは、抽出するキーワードの数を指定します。</dd> |
432 |
</dl> |
433 |
|
434 |
<dl> |
435 |
<dt><kbd>estcmd draft [-ft|-fh|-fm] [-ic <var>enc</var>] [-il <var>lang</var>] [<var>file</var>]</kbd></dt> |
436 |
<dd>各種形式のファイルを文書ドラフト形式に変換して出力します。</dd> |
437 |
<dd><var>file</var>は対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。</dd> |
438 |
<dd>-ftを付けると、対象をプレーンテキストとして扱います。デフォルトは文書ドラフト形式です。</dd> |
439 |
<dd>-fhを付けると、対象をHTMLとして扱います。</dd> |
440 |
<dd>-fmを付けると、対象をMIMEとして扱います。</dd> |
441 |
<dd>-icは対象文書の文字コードを指定します。デフォルトは自動判定です。</dd> |
442 |
<dd>-ilは文字コードの判定で優先される言語を指定します。デフォルトは英語です。</dd> |
443 |
</dl> |
444 |
|
445 |
<dl> |
446 |
<dt><kbd>estcmd break [-ic <var>enc</var>] [-il <var>lang</var>] [-apn] [-wt] [<var>file</var>]</kbd></dt> |
447 |
<dd>プレーンテキストを検索語に分解します。</dd> |
448 |
<dd><var>file</var>は対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。「@」で始まる場合、「@」より後ろの文字列そのものを処理対象とします。</dd> |
449 |
<dd>-icは処理対象の文字コードを指定します。デフォルトはUTF-8です。</dd> |
450 |
<dd>-ilは文字コードの判定で優先される言語を指定します。デフォルトは英語です。</dd> |
451 |
<dd>-apnをつけると、全ての言語をN-gram法で処理します。</dd> |
452 |
<dd>-wtを付けると、「末尾の1-gram」も出力します。</dd> |
453 |
</dl> |
454 |
|
455 |
<dl> |
456 |
<dt><kbd>estcmd randput [-ren|-rla|-reu|-ror|-rjp|-rch] [-cs num] <var>db</var> <var>dnum</var></kbd></dt> |
457 |
<dd>無作為に生成した文書を登録するテストを行います。</dd> |
458 |
<dd>-renを付けると、英文風の文書のみを登録します。デフォルトは全種類を登録します。</dd> |
459 |
<dd>-rlaを付けると、独文、仏文、西文風の文書のみを登録します。</dd> |
460 |
<dd>-reuを付けると、希文、露文風の文書のみを登録します。</dd> |
461 |
<dd>-rorを付けると、アジア全域の文字を使った文書のみを登録します。</dd> |
462 |
<dd>-rjpを付けると、和文風の文書のみを登録します。</dd> |
463 |
<dd>-rchを付けると、UCS-2の全ての文字を使った文書のみを登録します。</dd> |
464 |
<dd>-csは、キャッシュメモリのサイズをメガバイト単位で指定します。デフォルトは64MBです。</dd> |
465 |
</dl> |
466 |
|
467 |
<dl> |
468 |
<dt><kbd>estcmd wicked <var>db</var> <var>dnum</var></kbd></dt> |
469 |
<dd>文書の登録、削除、検索、データベースの開閉、最適化などを無作為に繰り返すテストを行います。</dd> |
470 |
<dd><var>dnum</var>は処理の回数を指定します。</dd> |
471 |
</dl> |
472 |
|
473 |
<dl> |
474 |
<dt><kbd>estcmd regression <var>db</var></kbd></dt> |
475 |
<dd>回帰テストを行います。</dd> |
476 |
</dl> |
477 |
|
478 |
<dl> |
479 |
<dt><kbd>estcmd version</kbd></dt> |
480 |
<dd>バージョンと著作権の情報を出力します。</dd> |
481 |
</dl> |
482 |
|
483 |
<p>全てのサブコマンドは、処理が正常に終了した場合には0を、そうでない場合は1を終了ステータスにします。put、out、gather、purge、randput、wicked、regressionについては、実行中のプロセスに1(SIGHUP)、2(SIGINT)、3(SIGQUIT)、13(SIGPIPE)、15(SIGTERM)のどれかのシグナルを送ることにより、データベースを閉じて正常終了させることができます。</p> |
484 |
|
485 |
<p>gather等の「-ic」オプションでは、「UTF-8」「EUC-JP」「Shift_JIS」「ISO-2022-JP」「ISO-8859-1」などの、IETFに登録されている文字コード名を指定してください。実際には、iconvが認識する名前は全て使えます。また、「-il」オプションでは、「en」(英語)、「ja」(日本語)、「zh」(中国語)、「ko」(朝鮮語)のどれかを指定してください。</p> |
486 |
|
487 |
<p>gatherの「-fx」オプションで指定した外部コマンドは、第1引数に対象文書のパス、第2引数に出力先のパスが渡されて呼び出されます。すなわち、外部コマンドは第1引数のファイルを解析して文書ドラフトやプレーンテキストやHTMLやMIMEを生成し、第2引数のファイルに書き込むという機能を持つことが期待されます。なお、対象文書は一時ファイルとしてコピーされて渡されます。対象文書の元来のパスは環境変数ESTORIGFILEの値として渡されますが、決して元のファイルを変更してはいけません。ESTORIGFILEを使う場合はファイルを読み込む必要はありませんので、「-fo」オプションも同時につけるとよいでしょう。</p> |
488 |
|
489 |
<h3>応用例:メールボックスのインデクシング</h3> |
490 |
|
491 |
<p>mh形式(1メール=1ファイル)でメールボックスを管理するメーラ(Mew、Wanderlust、Sylpheedなど)をお使いなら、個々のメールを対象にした全文検索のインデックスを簡単に作ることができます。例えば、メールボックスが「/home/mikio/Mail」にあり、その中のbusinessフォルダかfriendsフォルダに振り分けられたメールを登録する場合、以下のコマンドを実行します。</p> |
492 |
|
493 |
<pre>find /home/mikio/Mail -type f | egrep 'inbox/(business|friends)/[0-9]+$' | |
494 |
estcmd gather -cl -fm -cm casket - |
495 |
</pre> |
496 |
|
497 |
<p>作成されたインデックスは、estseek.cgiを使って検索することができます。なお、-cmオプションをつけておくことで、差分更新ができます。MIMEにはDateヘッダがありますので、-sdオプションでファイルの更新時刻を持ってくる必要はありません。</p> |
498 |
|
499 |
<p>mh形式以外のメーラをお使いの場合は、mh形式になるようにメールをエクスポートしてください。Windowsで言うところのEML形式でも構いません。あるいは、APIを使って専用のアプリケーションを作成してください。</p> |
500 |
|
501 |
<h3>応用例:外部コマンドのフィルタ</h3> |
502 |
|
503 |
<p>外部コマンドをフィルタとして呼び出すこともできます。「/usr/local/share/hyperestraier/filter/」に各種のフィルタがインストールされているので、適宜ご利用ください。</p> |
504 |
|
505 |
<p>estfxmantotxtはUNIXのmanのマニュアルをプレーンテキスト形式に変換するフィルタです。以下のように利用して、manのファイルを対象にしたインデックスを作ることができます。</p> |
506 |
|
507 |
<pre>PATH=$PATH:/usr/local/share/hyperestraier/filter ; export PATH |
508 |
find /usr/share/man /usr/local/man -type f | |
509 |
egrep '.*/man[0-3]/.*\.[0-3](.gz)*$' | |
510 |
estcmd gather -cl -fx ".1,.2,.3,.1.gz,.2.gz,.3.gz" "T@estfxmantotxt" -fz -sd -cm casket - |
511 |
</pre> |
512 |
|
513 |
<p>estfxmsotohtmlはMS-Office(Word/Excel/PowerPoint)のファイルをHTML形式に変換するフィルタです。以下のように利用して、MS-Officeのファイルを対象にしたインデックスを作ることができます。なお、estfxmsotohtmlを動作させるには<a href="http://sourceforge.net/projects/wvware/">wvWare</a>(wv-1.0.3)と<a href="http://sourceforge.net/projects/chicago/">xlhtml</a>(ppthtmlも同梱)をインストールしておくことが必要です。</p> |
514 |
|
515 |
<pre>PATH=$PATH:/usr/local/share/hyperestraier/filter ; export PATH |
516 |
estcmd gather -cl -fx ".doc,.xls,.ppt" "H@estfxmsotohtml" -fz -ic UTF-8 -sd -cm casket . |
517 |
</pre> |
518 |
|
519 |
<p>estfxpdftohtmlはPDFのファイルをHTML形式に変換するフィルタです。以下のように利用して、PDFのファイルを対象にしたインデックスを作ることができます。なお、estfxpdftohtmlを動作させるにはpdftohtmlをインストールしておくことが必要です。</p> |
520 |
|
521 |
<pre>PATH=$PATH:/usr/local/share/hyperestraier/filter ; export PATH |
522 |
estcmd gather -cl -fx ".pdf" "H@estfxpdftohtml" -fz -ic UTF-8 -sd -cm casket . |
523 |
</pre> |
524 |
|
525 |
<p>各フィルタの中身を見ていただければ、とても簡単なシェルスクリプトであることがお分かりいただけると思います。シェルやPerlやRuby等で同様のプログラムを書けば様々なフィルタを簡単に作ることができます。ただし、外部コマンドのフィルタは呼び出しのオーバーヘッドが大きいので、大量の文書を扱うのには向いていません。本格的にやるならばAPIを使ってください。</p> |
526 |
|
527 |
<h3>応用例:コマンドラインからの検索</h3> |
528 |
|
529 |
<p>コマンドラインから検索する際には、端末の文字コードを考慮する必要があります。例えば端末の文字コードがEUC-JPの場合は、以下のようにするとよいでしょう。</p> |
530 |
|
531 |
<pre>estcmd search -ic EUC-JP -vh -max 8 casket 'こんにちは' | |
532 |
iconv -f UTF-8 -t EUC-JP -c | less |
533 |
</pre> |
534 |
|
535 |
<p>-icオプションで検索式の文字コードを指定して、iconvで出力の文字コードを変換しています。-vhオプションと-maxオプションは検索結果を見やすくするためにつけています。上述の検索語を可変にしたスクリプトを作っておくと便利かもしれません。</p> |
536 |
|
537 |
<h3>応用例:XML形式の検索結果</h3> |
538 |
|
539 |
<p>各種のスクリプト言語からHyper Estraierの検索結果を手軽に利用するためには、estcmdのXML出力機能を用いるとよいでしょう。XMLの詳しい書式についてはestresult.dtdをご覧ください。</p> |
540 |
|
541 |
<pre>estcmd search -vx -max 8 casket 'socket AND shutdown' |
542 |
</pre> |
543 |
|
544 |
<hr /> |
545 |
|
546 |
<h2 id="estseek">検索用CGIスクリプト</h2> |
547 |
|
548 |
<p>ここでは、検索用CGIスクリプトestseek.cgiの詳細な仕様を説明します。設定ファイルの書き方が中心になります。</p> |
549 |
|
550 |
<h3>構成</h3> |
551 |
|
552 |
<p>estseek.cgiが動作するには、設定ファイルとテンプレートファイルとトップページファイルが必要です。それぞれestseek.conf、estseek.tmpl、estseek.topというのが標準的な名前です。</p> |
553 |
|
554 |
<p>設定ファイルの名前はCGIスクリプトの接尾辞を.confに変えたものです。estseek.cgiをestsearch.cgiという名前に変えたとしたら、estsearch.confが読み込まれます。テンプレートファイルとトップページファイルの名前は設定ファイルの中で記述されますので、同一ディレクトリの中にいくつもの検索用ページを設置することができます。</p> |
555 |
|
556 |
<p>「estseek.cgi」は「/usr/local/libexec/estseek.cgi」としてインストールされていますので、それをコピーして利用してください。また、設定ファイルなどのサンプルが「/usr/local/share/hyperestraier/」の中にインストールされていますので、それをコピーして修正すると楽です。「/usr/local/share/hyperestraier/locale/ja/」の中には日本語化されたサンプルもあります。</p> |
557 |
|
558 |
<h3>設定ファイルの書式</h3> |
559 |
|
560 |
<p>設定ファイルは、変数名と値を「:」で区切った形式の行を並べたものです。デフォルトでは、設定ファイルは以下のような内容になっています。</p> |
561 |
|
562 |
<pre>indexname: casket |
563 |
tmplfile: estseek.tmpl |
564 |
topfile: estseek.top |
565 |
logfile: |
566 |
lprefix: file:///home/mikio/public_html/ |
567 |
gprefix: http://localhost/ |
568 |
gsuffix: |
569 |
dirindex: index.html |
570 |
replace: //localhost/{{!}}//127.0.0.1/ |
571 |
replace: //127.0.0.1:80/{{!}}//127.0.0.1/ |
572 |
perpage: 10,20,30,40,50,100 |
573 |
attrselect: false |
574 |
showscore: false |
575 |
extattr: author|Author |
576 |
extattr: from|From |
577 |
extattr: to|To |
578 |
extattr: cc|Cc |
579 |
extattr: date|Date |
580 |
snipwwidth: 480 |
581 |
sniphwidth: 96 |
582 |
snipawidth: 96 |
583 |
condgstep: 2 |
584 |
dotfidf: true |
585 |
smplphrase: true |
586 |
candetail: true |
587 |
smlrvnum: 0 |
588 |
spcache: |
589 |
</pre> |
590 |
|
591 |
<p>それぞれの変数の機能を以下に示します。</p> |
592 |
|
593 |
<ul> |
594 |
<li><kbd>indexname</kbd> : インデックスのパスを指示します。</li> |
595 |
<li><kbd>tmplfile</kbd> : テンプレートファイルのパスを指示します。</li> |
596 |
<li><kbd>topfile</kbd> : トップページファイルのパスを指示します。</li> |
597 |
<li><kbd>logfile</kbd> : ログファイルのパスを指示します。</li> |
598 |
<li><kbd>lprefix</kbd> : 登録文書群のローカルURIの接頭辞を指示します。</li> |
599 |
<li><kbd>gprefix</kbd> : 登録文書群の公開URIに付加する接頭辞を指示します。</li> |
600 |
<li><kbd>gsuffix</kbd> : 登録文書群の公開URIに付加する接尾辞を指示します。</li> |
601 |
<li><kbd>dirindex</kbd> : ディレクトリのインデックスファイルの名前を指示します。</li> |
602 |
<li><kbd>replace</kbd> : URIの変換前後の文字列を「{{!}}」で区切って指定します。</li> |
603 |
<li><kbd>perpage</kbd> : 検索結果の表示件数のリストを指示します。</li> |
604 |
<li><kbd>attrselect</kbd> : 属性条件の入力にセレクトボックスを使うかを指定します。trueかfalseです。</li> |
605 |
<li><kbd>showscore</kbd> : スコアを表示するかを指定します。trueかfalseです。</li> |
606 |
<li><kbd>extattr</kbd> : 表示する属性の名前とラベルを「|」で区切って指示します。</li> |
607 |
<li><kbd>snipwwidth</kbd> : 検索結果の紹介文の全体の幅を指示します。</li> |
608 |
<li><kbd>sniphwidth</kbd> : 検索結果の紹介文を作る際に文書の冒頭から取得する幅を指示します。</li> |
609 |
<li><kbd>snipawidth</kbd> : 検索結果の紹介文を作る際に検索語の周辺から取得する幅を指示します。</li> |
610 |
<li><kbd>condgstep</kbd> : N-gramの検査精度を指示します。1だと全ての語を調べ、2だと1個置き、3だと2個置き、4だと3個置きに調べます。</li> |
611 |
<li><kbd>dotfidf</kbd> : TF-IDF法を適用するかどうかを指示します。trueかfalseです。</li> |
612 |
<li><kbd>smplphrase</kbd> : 検索条件式を簡便法にするかどうかを指示します。trueかfalseです。</li> |
613 |
<li><kbd>candetail</kbd> : 詳細表示を有効にするかどうかを指示します。trueかfalseです。</li> |
614 |
<li><kbd>smlrvnum</kbd> : 類似検索のベクトルの次元数を指定します。0以下なら類似検索が無効になります。</li> |
615 |
<li><kbd>spcache</kbd> : スペシャルキャッシュの属性名を指示します。</li> |
616 |
</ul> |
617 |
|
618 |
<p>lprefixとgprefixの関係は少しわかりにくいかもしれません。簡単に言えば、検索結果の各文書のURIから、lprefixに前方一致する部分を削って、代わりにgprefixの文字列を付加するという機能です。lprefix、gprefix、gsuffix、dirindexの処理の例を以下に示します。</p> |
619 |
|
620 |
<ul> |
621 |
<li>lprefix: file:///home/www/public_html/</li> |
622 |
<li>gprefix: http://www.estraier.ad.jp/</li> |
623 |
<li>gsuffix: .html</li> |
624 |
<li>dirindex: index.html</li> |
625 |
</ul> |
626 |
|
627 |
<ol> |
628 |
<li>ファイルのパス → /home/www/public_html/hoge/index</li> |
629 |
<li>登録されるURI → file:///home/www/public_html/hoge/index</li> |
630 |
<li>lprefixとの前方一致部分を削除 → hoge/index</li> |
631 |
<li>gprefixを先頭に連結 → http://www.estraier.ad.jp/hoge/index</li> |
632 |
<li>gsuffixを末尾に連結 → http://www.estraier.ad.jp/hoge/index.html</li> |
633 |
<li>dirindexと一致するファイル名を削除 → http://www.estraier.ad.jp/hoge/</li> |
634 |
</ol> |
635 |
|
636 |
<p>replaceを指定すると、lprefix、gprefix、gsuffix、dirindexの処理を行った後に、さらに変換を行います。複数回指定できます。例えば、「.txt」を「.html」に変えたい場合は、以下のようにします。</p> |
637 |
|
638 |
<pre>.txt{{!}}.html |
639 |
</pre> |
640 |
|
641 |
<p>extattrは任意の属性を表示するのに使います。複数回指定できます。例えば、文書の更新日時を「Modified」というラベルをつけて表示したい場合は「extattr: @mtime|Modified」と書き、文書のサイズを「Size」というラベルをつけて表示したい場合は「extattr: @size|Size」と書きます。</p> |
642 |
|
643 |
<h3>テンプレートファイル</h3> |
644 |
|
645 |
<p>検索ページの見栄えを決めるためのファイルです。HTMLで、記述してある内容がそのまま表示されます。ただし、「<!--ESTFORM-->」の部分には検索フォームが挿入され、「<!--ESTRESULT-->」の部分には検索結果が挿入され、「<!--ESTINFO-->」の部分にはインデックスの情報が挿入されます。CSSやJavaScriptを駆使すれば、かなり自由にユーザインターフェイスをカスタマイズすることができます。</p> |
646 |
|
647 |
<h3>トップページファイル</h3> |
648 |
|
649 |
<p>検索用CGIスクリプトに最初にアクセスした際、あるいは検査条件を全く入力しないでアクセスした際に表示されるメッセージを記述したファイルです。記述してある内容が検索結果の位置にそのまま挿入されます。デフォルトでは検索機能の簡単な使い方が記述してありますが、システムのメンテナンス情報などを記載してもよいでしょう。</p> |
650 |
|
651 |
<h3>検索フォームの設置</h3> |
652 |
|
653 |
<p>Webサイトの検索機能として設置する場合、サイトのトップページに検索フォームを置きたくなるでしょう。その場合、以下のようなHTMLを書いてください。</p> |
654 |
|
655 |
<pre><form method="get" action="estseek.cgi"> |
656 |
<div> |
657 |
<input type="text" name="phrase" value="" size="32" /> |
658 |
<input type="submit" value="Search" /> |
659 |
<input type="hidden" name="enc" value="UTF-8" /> |
660 |
</div> |
661 |
</form> |
662 |
</pre> |
663 |
|
664 |
<p>「estseek.cgi」の部分は設置したestseek.cgiのURLにしてください。「UTF-8」の部分はそのページの文字コードにしてください。「EUC-JP」「Shift_JIS」「ISO-2022-JP」「ISO-8859-1」などが使えます。</p> |
665 |
|
666 |
<h3>裏技</h3> |
667 |
|
668 |
<p>属性条件の入力欄に「gstep=1」などとすると、N-gramの検査精度を一時的に変えられます。同様に「tfidf=false」などとすると、TF-IDFの有効無効を一時的に変えられます。</p> |
669 |
|
670 |
<p>検索結果の経過時間表示の右側に「*」マークがつくことがあります。これは、インデックス内に削除文書の情報がたくさんあることによって検索処理が非効率になったことを意味しています。頻繁にこれがでるようになったら、インデックスの最適化を行ってください。</p> |
671 |
|
672 |
<hr /> |
673 |
|
674 |
<h2 id="tips">助言</h2> |
675 |
|
676 |
<p>ここでは、アプリケーションとしてのHyper Estraierを活用するためのコツをいくつか紹介します。</p> |
677 |
|
678 |
<h3>大規模なインデックスの構築</h3> |
679 |
|
680 |
<p>文書を登録する処理では、インデックスの内部で持っているデータベースに膨大な量の書き込みを行います。データベースを参照するオーバーヘッドを抑えるために、Hyper Estraierは処理中のデータをメモリ上にキャッシュする仕組みを持っています。キャッシュが大きい方が登録処理は高速になりますが、スワップが起きるとかえって効率が落ちますので、実メモリの4割程度の大きさにするとよいようです。例えば1GBの実メモリを搭載しているマシンで作業をする場合、400MB程度が適切でしょう。</p> |
681 |
|
682 |
<p>estcmdの-csオプションを使うとキャッシュサイズの指定ができます。サイズはメガバイト単位で指定します。デフォルトは64MBです。キャッシュサイズを400MBに指定するには、以下のようにします。</p> |
683 |
|
684 |
<pre>estcmd gather -cl -il ja -sd -cm -cs 400 casket . |
685 |
</pre> |
686 |
|
687 |
<p>インデックスの最大サイズはおおよそ50GBです。また、対象文書がプレーンテキストの場合、インデックスのサイズは対象文書の容量の50%から200%程度になります。HTMLであれば25%から100%程度です。したがって、一つのインデックスに登録できる文書の総量の目安は、プレーンテキストなら50GB、HTMLなら100GBといったところです。なお、インデックスのサイズは、小さい文書が多数あるよりも、大きい文書が少数ある方が小さくなります。また、日本語の文書よりも英語の文書の方が小さくなります。</p> |
688 |
|
689 |
<h3>可用性の確保</h3> |
690 |
|
691 |
<p>インデックスを更新している最中にはロックがかかるので、そのインデックスを使った検索はその間はできなくなります。検索システムとしては、その間は停止時間ということになります。それを避けるためには、インデックスのコピーに対して更新を処理を行い、完了したらオリジナルと入れ換えるようにするとよいでしょう。また、インデックスの更新中に不意にシステムが停止するなどしてインデックスが壊れた場合も、複製に対する更新であれば問題がないので安心です。</p> |
692 |
|
693 |
<p>上述の処理を自動化するには、以下のようなスクリプトを書いておくとよいでしょう。冒頭のexit文は、複製が既に存在している場合(以前の更新に失敗するとそうなります)に処理を停止するようにしています。途中のexit文では、更新したインデックスが壊れた場合に処理を停止するようにしています。</p> |
694 |
|
695 |
<pre>test -e /home/www/casket-copy && exit |
696 |
cp -R /home/www/casket /home/www/casket-copy |
697 |
/usr/local/bin/estcmd gather -il ja -sd -cm /home/www/casket-copy /home/www/public_html |
698 |
/usr/local/bin/estcmd purge /home/www/casket-copy |
699 |
/usr/local/bin/estcmd optimize /home/www/casket-copy |
700 |
/usr/local/bin/estcmd inform casket || exit |
701 |
rm -rf /home/www/casket |
702 |
mv /home/www/casket-copy /home/www/casket |
703 |
</pre> |
704 |
|
705 |
<h3>文書の削除</h3> |
706 |
|
707 |
<p>gatherやpurgeを実行する際に「-cl」をつけるべきかどうかは運用の仕方によって変わってきます。「-cl」をつけた場合は、転置インデックスを部分的に最適化するので、処理がやや重くなります。ただし、明示的にoptimizeを実行しなくても検索の速度や精度が落ちません。</p> |
708 |
|
709 |
<p>「-cl」をつけない場合は、転置インデックスを更新しないで、文書情報に削除マークをつけるだけですので、比較的に軽い処理で済みます。ただし、検索時に無駄な領域を処理することになりますので、検索の速度と精度が少しずつ落ちてきます。それを解消するために、定期的にoptimizeを実行することが必要となります。「-cl」をつけないで削除した文書の領域を回収するには、optimize以外の手段はありません。</p> |
710 |
|
711 |
<p>通常の運用では、「-cl」をつけてgatherやpurgeを実行するのがよいでしょう。ただし、とても大量の上書きや削除を行う場合には、「-cl」をつけないでgatherやpurgeを実行してから、optimizeを実行する方が効率的です。また、可用性の確保の項目で述べたように、インデックスの複製に対して更新する場合にも「-cl」をつけない方法が適します。optimizeをした方がインデックスが小さく保たれるからです。</p> |
712 |
|
713 |
<h3>類似検索</h3> |
714 |
|
715 |
<p>estseek.confのsmlrvnumを正の数にすると、estseek.cgiで類似検索が可能になります。検索結果の各文書に「[similar]」というリンクが表示されますので、それを選択すると、その文書を種文書とした類似検索が実行されます。なお、estcmdの「-sim」オプションを使うと、コマンドラインからでも類似検索ができます。</p> |
716 |
|
717 |
<p>類似検索を実行すると、候補の各文書のキーワードを計算するので、とても時間がかかります。estcmdのextkeysサブコマンドを用いて予めキーワードのデータベースを作っておくと、類似検索の速度が劇的に向上します。キーワードの選択にはTF-IDF法を用いますので、インデックスを構築する最後の手順で行った方が精度が安定します。したがって、extkeysを含めたインデックスの更新手順は以下のようになります。</p> |
718 |
|
719 |
<pre>estcmd gather -cl -il ja -sd -cm casket . |
720 |
estcmd purge -cl casket |
721 |
estcmd extkeys casket |
722 |
</pre> |
723 |
|
724 |
<p>キーワード用のデータベースはoptimizeを行うと消去されます。したがって、optimizeが必要な場合は、optimizeを先に実行してからextkeysを実行してください。</p> |
725 |
|
726 |
<p>estseek.confにおけるsmlrvnumの値はベクトル空間の次元数を意味しますが、32程度がお薦めです。増やすと精度が上がる代わりに速度が下がります。減らすと精度が下る代わりに速度が上がります。extkeysを実行した場合には、その際の「-kn」オプションの値が次元数の決定に使われます。</p> |
727 |
|
728 |
<h3>文字化け対策</h3> |
729 |
|
730 |
<p>プレーンテキストの文書や、HTMLの文書でmeta要素による文字コードの指定がなされていないものには、インデクシングの際に文字コードが自動判定されます。しかし、自動判定の精度は完璧ではありません。自動判定の誤りによって文字化けが発生した際には、「-ic」オプションで文字コードを明示するとよいでしょう。例えば、「/home/www/public_html/chinese」以下の文書はEUC-CNで書かれていて、「/home/www/public_html/korean」以下の文書はEUC-KRで書かれていることが分かっているならば、以下のようにします。</p> |
731 |
|
732 |
<pre>estcmd gather -cl -ic EUC-CN -sd -cm casket /home/www/public_html/chinese |
733 |
estcmd gather -cl -ic EUC-KR -sd -cm casket /home/www/public_html/korean |
734 |
estcmd gather -cl -sd -cm casket /home/www/public_html |
735 |
</pre> |
736 |
|
737 |
<p>Windows上で「Ⅲ」「③」「㌦」などのいわゆる外字を使うことも多いかと思いますが、それらを含んだテキストをShift_JISとして扱うのは避けた方がよいでしょう。文字化けする可能性が高くなります。代わりにCP932もしくはWindows-31Jとして扱ってください。</p> |
738 |
|
739 |
<h3>日本語のパス</h3> |
740 |
|
741 |
<p>日本語などのマルチバイト文字を含んだ名前のファイルを登録することもできますが、文字化けを防ぐためには文字コードを明示することが必要です。estcmd gatherの「-pc」オプションを使います。例えばEUC-JPであると指定する場合は、以下のようにします。</p> |
742 |
|
743 |
<pre>estcmd gather -cl -pc EUC-JP -sd -cm casket . |
744 |
</pre> |
745 |
|
746 |
<p>UNIXではEUC-JPかUTF-8でファイル名を扱うことが多いです。日本語版のWindowsはCP932でファイル名を扱います。「-pc」オプションの値にShift_JISを指定しても期待通りに動作しないことに注意すべきです。Shift_JISの「\」(0x5c)をUTF-8に正規化すると、バックスラッシュでなく円マークになってしまい、区切り文字としての機能が失われるためです。CP932(Windows-31J)は「\」をバックスラッシュとして扱うことが明示されている規格なので、この問題はありません。</p> |
747 |
|
748 |
<p>文書内でタイトルが明示されなかった場合、estseek.cgiは代わりにファイル名をタイトルとして表示します。その場合にファイル名でなくフルパスを表示したい場合は「-pf」オプションも同時に指定してください。</p> |
749 |
|
750 |
<h3>Windows用のフィルタ</h3> |
751 |
|
752 |
<p>Windows用のバイナリパッケージには、xdoc2txtというフィルタプログラムが同梱されています。これをHyper Estraierから呼び出すためのestxfiltというラッパーも同梱されています。それらを使うと、PDF、RTF、MS-Word、MS-Excel、MS-PowerPointなどのファイルをインデックスに登録できます。同梱のコマンドとDLLは全てパスの通った場所に置いてください。</p> |
753 |
|
754 |
<p>例えば、「D:\mikio\doc」以下のファイルを登録したインデックスを作成するには、以下のようなコマンドを実行します。</p> |
755 |
|
756 |
<pre>cd D:\mikio\doc |
757 |
estcmd gather -cl -fx .pdf,.rtf,.doc,.xls,.ppt T@estxfilt -fz ^ |
758 |
-ic CP932 -pc CP932 -sd -cm casket . |
759 |
</pre> |
760 |
|
761 |
<p>「-ic」オプションでCP932を指定しているのは、estxfiltの出力の文字コードがCP932であるとわかっているためです。なお、行末の「^」はコマンドプロンプトのエスケープ文字です。</p> |
762 |
|
763 |
<h3>フィルタの作り方</h3> |
764 |
|
765 |
<p>gatherの「-fx」オプションで呼び出されるフィルタプログラムは、好きなように実装することができます。プログラム言語は何でも構いません。第1引数で指定されるファイルを読み込んで、第2引数のファイルに書き込めばよいのです。出力の形式は、文書ドラフト、プレーンテキスト、HTML、MIMEから選択することができます。</p> |
766 |
|
767 |
<p>例えば、MP3のファイルからタイトル等の情報を抜き出すフィルタを考えてみましょう。標準シェルで実装して、mp3infoとiconvを組み合わせることにします。なお、ID3タグの文字コードがISO-8859-1(Latin1)であることを前提としていますが、これは実際に記録している文字コードに合わせて読みかえてください。</p> |
768 |
|
769 |
<pre>#! /bin/sh |
770 |
mp3info -p '@title=%t\n@author=%a\n@type=audio/mpeg\n\n%c\n\t%t\n\t%a\n' "$1" | |
771 |
iconv -f ISO-8859-1 -t UTF-8 < "$2" |
772 |
</pre> |
773 |
|
774 |
<p>上記を「estmp3todraft」という名前で保存して、実行権限をつけて、パスの通った場所に置きます。あとは、以下のコマンドを実行すれば、MP3ファイルをインデックスに登録することができます。</p> |
775 |
|
776 |
<pre>estcmd gather -cl -fx .mp3 estmp3todraft -fz -sd -cm casket . |
777 |
</pre> |
778 |
|
779 |
<p>各種のフィルタが充実すると多くのユーザに喜んでいただけるので、もしあなたが有用なフィルタを作ったなら、Hyper EstraierのMLにぜひ紹介してください。</p> |
780 |
|
781 |
<h3>UIのカスタマイズ</h3> |
782 |
|
783 |
<p>属性検索条件や順序指定の式を手入力するのが面倒な場合、estseek.confのattrselect属性をtrueにしてください。セレクトボックスで指定できるようになります。</p> |
784 |
|
785 |
<p>任意のユーザ属性を表示したいなら、estseek.confのextattr属性を利用してください。</p> |
786 |
|
787 |
<p>入力フォームを変更したいなら、estseek.tmplの中の "<!--ESTFORM-->" の代わりに自分でフォームのHTMLを書いても構いません。その他、JavaScriptやCSSを駆使すればばかなりのカスタマイズができるはずです。</p> |
788 |
|
789 |
<p>CSSやJavaScriptでできないカスタマイズが必要ならば、estseek.cのソースを書き換えて改造してもよいですし、estcmdのXML出力モードを呼び出すスクリプトを書いてもよいでしょう。もちろん、APIを使ったプログラミングをすれば、最も強力なアプリケーションを作ることができるでしょう。</p> |
790 |
|
791 |
<h3>インクリメンタル検索と完全N-gram方式</h3> |
792 |
|
793 |
<p>入力フィールドに文字を打ち込む毎に結果の画面が更新される、いわゆるインクリメンタル検索を行うこともできます。それには、以下の手順を実行してください。</p> |
794 |
|
795 |
<ul> |
796 |
<li>estcmd gatherでインデックスを作る際に、-apnオプションをつけます。</li> |
797 |
<li>`/usr/local/share/hyperestraier/increm/' 以下にあるファイル群をestseek.cgiのあるディレクトリにコピーします。</li> |
798 |
<li>estseek.tmplの中の "<!--ESTFORM-->" を削除します。</li> |
799 |
<li>コピーしたestseek-frame.htmlにブラウザでアクセスします。</li> |
800 |
</ul> |
801 |
|
802 |
<p>-apnオプションは、完全N-gram方式のデータベースを作ることを指示します。完全N-gram方式とは、ヨーロッパ系の言語を解析する際にもN-gram方式を適用するものです。この指示はデータベースを作成する時にしかできません。データベースを作成した後に方式を変更することはできないということです。完全N-gramでなくてもインクリメンタル検索は可能ですが、英文だと単語毎でしか文書がヒットしないので多少不便になります。なお、完全N-gram方式の欠点は、インデックスのサイズが大きくなることと、関連文書検索の精度が下がることです。したがって、インクリメンタル検索を使わない場合は通常の方式が推奨されます。</p> |
803 |
|
804 |
<h3>FastCGI</h3> |
805 |
|
806 |
<p>裏技の範疇に入りますが、estseek.cgiを高速化したプログラムを作ることが可能です。これはUNIX版のみの機能で、FastCGIという規格に基づくものです。FastCGIの実行環境(mod_fcgiなど)とライブラリ(libfcgi)をインストールした上で、Hyper Estraierのソースパッケージの中で「make fcgi」を実行してください。すると「estseek.fcgi」というプログラムが作成されます。これをestseek.cgiの代わりに利用してください。</p> |
807 |
|
808 |
<p>FastCGIスクリプトはCGIスクリプトとほぼ同じインターフェイスでありながら、常駐プロセスになることが特徴です。したがって、プロセスを複製したりDBに接続したりするオーバーヘッドがかからないので、応答時間がかなり短くなります。同時接続数が多いサイトではこの方法はオススメです。FastCGIの詳細については<a href="http://www.fastcgi.com/">FastCGIのホームページ</a>をご覧ください。</p> |
809 |
|
810 |
<p>estseek.fcgiはインデックスをロックし続けるので、Webサーバの稼働中はインデックスを更新することができません。インデックスを更新するためには、estcmdで更新命令を掛けてから、Webサーバを再起動することになります。以下のようにするとよいでしょう。</p> |
811 |
|
812 |
<pre>estcmd gather -cl -il ja -sd -cm casket . & |
813 |
sudo /usr/local/apache2/bin/apachectl restart |
814 |
</pre> |
815 |
|
816 |
<p>スペシャルキャッシュとは、特定の属性の値をキャッシュすることによって処理の高速化を図る仕組みです。estseek.confのspcacheはスペシャルキャッシュの属性名を指定します。例えば、更新日時によるソートを頻繁に行う場合は、@mdate属性を指定しておくとよいでしょう。スペシャルキャッシュの対象に指定できる属性はひとつだけです。スペシャルキャッシュはメモリ上のキャッシュですので、CGIでは機能しません。常駐プロセスであるFastCGIでのみ威力を発揮します。</p> |
817 |
|
818 |
<h3>NFSによるインデックスの共有</h3> |
819 |
|
820 |
<p>NFSマウントのファイルシステム上にインデックスを置く場合には若干の注意が必要です。まず、そのNFSサーバおよびNFSクライアントがロックをサポートしている必要があります。21世紀の実装であれば大抵はロックをサポートしているでしょう。また、NFSサーバのプロセッサとNFSクライアントのプロセッサのエンディアンが一致していることが必要です。</p> |
821 |
|
822 |
<p>以上の条件を満たしているならば、NFSを使って複数のマシンでインデックスを共有することができます。並列化に関する条件は単一のマシンを使っている場合と同じです。すなわち、あるプロセスがライタで接続している間は他のプロセスはリーダでもライタでも接続できず、あるプロセスがリーダで接続している間は他のプロセスはリーダであれば接続できます。</p> |
823 |
|
824 |
<hr /> |
825 |
|
826 |
<h2 id="faq">よく聞かれる質問</h2> |
827 |
|
828 |
<dl> |
829 |
<dt>Q. 「Hyper Estraier」はどう発音すればよいですか?</dt> |
830 |
<dd>A. 作者は「ハイパーエストレイア」と発音しています。ちなみに、「estraier」は古いフランス語で「迷う」とか「はぐれる」とかいう意味の言葉ですが、本当の読み方はよく分かりません。</dd> |
831 |
</dl> |
832 |
|
833 |
<dl> |
834 |
<dt>Q. 「Hyper Estraier」と「HyperEstraier」はどちらが正しいですか?</dt> |
835 |
<dd>A. プロジェクト名としては「Hyper Estraier」が公式の名前です。パッケージ名としては「hyperestraier」が使われます。「HyperEstraier」はプログラム内の識別子やHTTPのユーザエージェント名として使われることがあります。</dd> |
836 |
</dl> |
837 |
|
838 |
<dl> |
839 |
<dt>Q. Windows上で動きますか?</dt> |
840 |
<dd>A. 動きます。バイナリパッケージをダウンロードしてください。</dd> |
841 |
</dl> |
842 |
|
843 |
<dl> |
844 |
<dt>Q. ビッグエンディアンもしくはリトルエンディアンのマシン上で動きますか?</dt> |
845 |
<dd>A. はい。どちらでも動作します。ただし、双方でインデックスを共有することはできません。</dd> |
846 |
</dl> |
847 |
|
848 |
<dl> |
849 |
<dt>Q. 64ビットのマシンで動きますか?</dt> |
850 |
<dd>A. はい。問題なく動作します。</dd> |
851 |
</dl> |
852 |
|
853 |
<dl> |
854 |
<dt>Q. EstraierとHyper Estraierを同一システムに共存させることは可能ですか。</dt> |
855 |
<dd>A. はい。可能です。コマンド名やライブラリ名などが重複しないように配慮していますので、互いに衝突することはありません。</dd> |
856 |
</dl> |
857 |
|
858 |
<dl> |
859 |
<dt>Q. Estraierとインデックスの互換性はありますか?</dt> |
860 |
<dd>A. いいえ。互換性はありません。</dd> |
861 |
</dl> |
862 |
|
863 |
<dl> |
864 |
<dt>Q. PDFは扱えますか?</dt> |
865 |
<dd>A. はい。適切なフィルタを組み合わせれば可能です。ただし、暗号化されていたり文字が画像として保存されているPDFからはテキストを抽出できません。</dd> |
866 |
</dl> |
867 |
|
868 |
<dl> |
869 |
<dt>Q. 私の商用製品でHyper Estraierを使ってよいですか?</dt> |
870 |
<dd>A. はい。詳しくは「COPYING.txt」を読んでください。</dd> |
871 |
</dl> |
872 |
|
873 |
<dl> |
874 |
<dt>Q. ビルドに失敗したのですが、なぜですか?。</dt> |
875 |
<dd>A. QDBMとlibiconvとzlibのバージョンが適切かどうか調べてください。Mac OS Xの場合は「make mac」、HP-UXの場合は「make hpux」を実行したか確認してください。ビルドに必要なコマンド(arやldなど)がパスに含まれているかどうか確認してください。それでもダメなら、メーリングリストか作者に報告してください。</dd> |
876 |
</dl> |
877 |
|
878 |
<dl> |
879 |
<dt>Q. バグを発見しました。</dt> |
880 |
<dd>A. できるだけ対応したいので、メーリングリストか作者に報告してください。その際に、開発環境、実行環境、再現手順、エラーメッセージ、ログなど、できるだけ詳細なデータがあると助かります。</dd> |
881 |
</dl> |
882 |
|
883 |
<hr /> |
884 |
|
885 |
</body> |
886 |
|
887 |
</html> |
888 |
|
889 |
<!-- END OF FILE --> |