ユーザガイド

Copyright (C) 2004-2007 Mikio Hirabayashi
Last Update: Tue, 06 Mar 2007 12:05:18 +0900

目次

  1. はじめに
  2. 文書の属性
  3. ファイル形式
  4. 検索条件式
  5. 検索語の抽出
  6. 管理用コマンド
  7. 検索用CGIスクリプト
  8. 表示用CGIスクリプト
  9. インデックスの構造
  10. 助言
  11. よく聞かれる質問

はじめに

このガイドでは、Hyper Estraierのアプリケーションの詳細な使い方を説明します。イントロダクションをまだお読みでない場合は、先にそちらに目を通しておいてください。

Hyper Estraierは、いわゆるインデックス型の検索システムです。検索を行う前に、対象文書の情報を登録したインデックスを準備しておく必要があります。その手間がかかるかわりに、とても高速に検索を行うことができます。Hyper Estraierはインデックスを管理するコマンド「estcmd」とインデックスを使って検索を行うCGIスクリプト「estseek.cgi」からなります。つまり、コマンドラインでインデックスの管理作業を行い、Webブラウザで検索を行うことになります。

estcmdは様々な形式の文書を扱うことができ、またインデックスに対する多様な管理操作を行うことができます。このガイドでは、文書の扱われ方やインデックスの管理方法について詳細に説明します。

Hyper Estraierは様々な検索方法をサポートします。複数の検索語を組み合わせたり、文書の属性を使って検索したりすることができます。また、estseek.cgiの設定により、表示方法をカスタマイズすることができます。このガイドではそれらの方法についても説明します。


文書の属性

Hyper Estraierが扱う文書には、本文の情報だけでなく、タイトルなどの属性情報をつけることができます。属性は様々な応用ができます。属性を使った検索もできますし、更新日時の属性は差分更新の判断にも使われます。

属性名

属性には名前がつけられます。属性名は自由につけることができるのですが、Hyper Estraierが標準的に使う属性はシステム属性として予め定義されています。システム属性の名前には「@」が先頭につきます。システム属性は以下のものがあります。

システム属性以外の属性はユーザ定義属性と呼ばれます。後述の文書ドラフト形式を使うと、任意のシステム属性とユーザ定義属性をつけることができます。HTMLのmeta要素やMIMEのヘッダもユーザ属性として扱われます。属性名は「%」で始まってはいけません。

属性の型

属性には2種類の型があります。文字列型数値型です。文字列型は、任意の文字列です。文字列型の値には、完全一致、前方一致、後方一致、部分一致の判定ができます。数値型は、数値または日付の情報を表したものです。数値型は文字列を数値に直した上で、大小の判定が行われます。数値型の値は形式によって扱われ方が違います。日付として解釈される場合、UNIX紀元(1970年1月1日0時0分0秒)からの経過秒数が判定に使われます。

属性がどの型であるかは登録時には決定されません。検索時に属性をどちらの型として解釈するか指定されます。属性の長さに制限はありません。

文書の属性や本文に指定する文字列はUTF-8で表現されている必要があります。テキストファイルやHTMLなどでそれ以外の文字コードを使っている場合は、UTF-8に変換してください。なお、estcmdは文字コードを自動判定して変換処理を行います。

システム属性でもユーザ属性でも、実際にどのような値を入れるかはユーザやアプリケーションに任されます。指定する側と解釈する側で合意が取れていれば問題ないわけですが、RFCなどで関連する規定がある場合はそれに従うのがよいでしょう。例えば、「@type」にはRFC2045のメディアタイプの書式を用い、「@lang」にはISO639の言語コード(「ja」「en」など)を用いるとよいでしょう。ユーザ定義属性の仕様を決める際にはDublin Coreの規格を参考にするといいかもしれません。

URI属性

URI(Uniform Resource Identifier)は、文書を識別するための文字列です。HTTPやFTPやLDAPのURL(Uniform Resource Locator)はURIの一種です。インデックスに登録する全ての文書にはURI属性がついている必要があります。

外部(インターネット)に公開されるURIは、世界中のどのユーザからも一意に識別できる必要があります。したがって、ローカルホストでしか通用しない「file://」のURLは外部に公開すべきではありません。estseek.cgiは「file://」のURLを「http://」や「ftp://」などに置換する機能を備えていますので、それを活用してください。

URIはファイルを識別するだけのものではありません。書籍のISBNなどのURN(Uniform Resource Name)もURIの一種です。また、URIのスキーマは独自に定義することもできます。例えば、XYZ社の社員名簿の全文検索システムであれば、社員番号を含めた「xyz:empno:12345」のようなURI属性を生成するのもよいでしょう。

URIに日本語などのマルチバイト文字をそのまま使ってはいけません。その場合、一般にURLエンコードと呼ばれるエスケープ処理が必要となります。URIの仕様についてはRFC3986を参照してください。

estcmdは、「file://」で始まるローカルファイルシステムのURLをURI属性として自動的につけてくれます。ただし、対象文書がURI属性を独自に定義している場合はそちらを優先します。ローカルファイルシステムのURLは「_lpath」という属性としても記録されます。ローカルファイルシステムの絶対パスは「_lreal」という属性として記録され、ファイル名は「_lfile」という属性として記録されます。各属性値の文字コードはUTF-8に正規化されます。「_」で始まる名前の属性は、estseek.cgi の詳細表示機能で表示されません。

ダイジェスト属性

ダイジェストとは、2つのデータが同じものかどうかを効率的に判定するために、データそのものの代わりに使われる短いデータです。メッセージダイジェストとも言います。インデックスに登録する全ての文書には、ダイジェスト属性が付加されます。

文書がダイジェスト属性を明示的に指定していない場合は、本文のMD5(Message Digest 5)を値とするダイジェスト属性が暗黙的に付加されます。明示的に指定する場合、MD5以外のアルゴリズムを使っても構いませんし、本文以外のデータ(ファイルそのものなど)を対象としてダイジェストを計算しても構いません。本文に更新があったならばダイジェストも変化するということが唯一の要件です。

重み付け属性

特定の文書を検索結果の上位に表示されやすいようにするには、重み付け属性を使うと便利です。例えば元のスコアが100で重み付けが1.5の場合、重み付けされたスコアは150になります。デフォルトでは、重み付けはP2PのノードAPI(ノードサーバ)を利用した場合にのみ行われ、インデクシングの際にではなく、検索の際に行われます。したがって、ノードサーバにおいては、文書の属性を編集することによって動的に重み付けを変更できます。estcmdやコアAPIでオプションを指定すれば、インデクシング時に静的に重み付けを行うこともできます。


ファイル形式

estcmdが扱う4種類のファイル形式のそれぞれがどのように扱われるかを説明します。その他の形式を扱うためのフィルタについては後述します。

プレーンテキスト

特に構造のない文字列です。デフォルトでは、ファイル名の接尾辞が「.txt」「.text」「.asc」の場合にプレーンテキストとして扱われます。

HTML

言わずもがな、Webで使われるハイパーテキストです。デフォルトでは、ファイル名の接尾辞が「.html」「.htm」「.xhtml」「.xht」の場合にHTMLとして扱われます。

隠しテキストについては後述します。

MIME(電子メール)

RFC822に基づくメッセージ交換のためのデータ形式です。デフォルトでは、ファイル名の接尾辞が「.eml」「.mime」「.mht」「.mhtml」の場合にMIMEとして扱われます。

マルチパートの各パートの中身が「text/plain」か「text/html」か「message/rfc822」の場合には、その内容を本文として扱います。これによって、Webアーカイブ(MHTML)も適切に扱うことができます。ヘッダの値がMIMEエンコードされていた場合はそれをデコードして扱います。エンティティがBase64やquoted-printableでエンコードされていた場合はそれをデコードして扱います。

文書ドラフト

文書ドラフトは、Hyper Estraier独自のデータ形式です。文書ドラフトを中間フォーマットとして使うことで、様々な形式の文書を統合的に扱うことができます。デフォルトでは、ファイル名の接尾辞が「.est」の場合に文書ドラフトとして扱われます。

文書ドラフトの形式はRFC822に似ていますが、細かい違いがあります。ヘッダの区切り文字は「:」でなく「=」です。また、「=」の後に空白を置く必要はありません。例えば、MIDIの歌詞データを登録する際には、以下のようなデータになるでしょう。

@uri=http://www.music-estraier.com/mididb/w/wa/wakamonotachi.kar
@title=若者たち
@author=佐藤勝,藤田敏雄
@cdate=2004-11-01T23:11:18+09:00
@mdate=2005-03-21T08:07:45+09:00
category=chorus,j-pop

君の行く道は 果てしなく遠い
だのになぜ 歯をくいしばり
君は行くのか そんなにしてまで
        若者たち
        佐藤勝,藤田敏雄

文書ドラフトは以下の仕様を満たす必要があります。

属性部において、「%」で始まる行は制御命令とみなされて無視されます。文書ドラフトに別の目的のデータを混入させたい場合はこの機能を利用してください。ただし、「%VECTOR」とそれに続くタブで始まる行がある場合、それは文書のキーワードベクトルを示します。キーワードベクトルの形式はTSVです。各フィールドには、キーワードとそのスコアが交互に表れます。「%SCORE」とそれに続くタブで始まる行がある場合、それは文書の代替スコアを示します。

隠しテキストは、通常の本文と同様に検索語が抽出されますが、検索結果のスニペットでは表示されないことが特徴です。タイトルや著者に含まれる語も全文検索の対象にしたい場合には、タイトルや著者と同じ文字列を隠しテキストとしても指定するとよいでしょう。

文書ドラフトの最大の特徴は、URI属性を指定できることです。つまり、文書ドラフト自体のURIではなく、別のファイルのURIをインデックスに記録することができるのです。WebからHTMLデータを収集して文書ドラフト形式で保存するプログラムを作れば、簡易的なWeb検索エンジンを簡単に実現することができます(付録のestwaverコマンドを使えばもっと簡単ですが)。文書ドラフトを保存するオーバーヘッドをかけたくない場合は、いよいよAPIを使うことになります。

文書ドラフトをWeb経由で配送する際には、MIMEタイプを「text/x-estraier-draft」にすることを推奨します。ユーザエージェントが文書ドラフトを適切に検出すれば、そのままインデックスに登録したり、適切なビューワで表示したりできるようになります。


検索条件式

検索条件には、全文検索条件と属性検索条件の2種類があります。両方を同時に指定することもでき、その場合は両方を満たした文書が該当とみなされます。さらに、全文検索の条件式には、通常書式や簡便書式などの種類あります。用途に応じて使い分けてください。

全文検索条件の通常書式

全文検索条件式は、指定した語句が本文に含まれる文書を検索するためのものです。例えば、「コンピュータ」という文字列を含む文書を探したいなら、検索式に「コンピュータ」とそのまま指定してください。

複数の検索語を空白で区切ってならべることもできます。例えば、「United Nations」と指定すると、「United」の直後に「Nations」が来る文書を検索します。

検索語を「AND」で挟んで並べると、AND検索ができます。例えば、「インターネット AND セキュリティ」と指定すると、「インターネット」と「セキュリティ」の両方を含む文書を検索します。

検索語を「ANDNOT」で挟んで並べると、ANDNOT検索ができます。例えば、「スキー ANDNOT スノボー」と指定すると、「スキー」を含むが「スノボー」は含まない文書を検索します。ANDNOT検索は、探したい語が他の語の一部に含まれてうまく検索できない場合にも便利です。「ファイル」で検索すると「プロファイル」がヒットして鬱陶しい場合には、「ファイル ANDNOT プロファイル」とするとよいでしょう。

検索語を「OR」で挟んで並べると、OR検索ができます。例えば、「レモン OR ライム」と指定すると、「レモン」と「ライム」の片方または両方を含む文書を検索します。OR検索は、類義語や表記の揺れに対応した検索をするのに便利です。「woman OR women」などとして英単語の活用を吸収したり、「龍馬 OR 竜馬」などとして漢字表記の揺れを吸収したりするとよいでしょう。

OR」は「AND」や「ANDNOT」よりも優先順位が高いことに注意してください。例えば、「F1 OR F-1 OR Formula One AND 優勝 OR チャンピオン」と入力した場合、「F1」か「F-1」か「Formula One」のどれかを含んで、かつ「優勝」か「チャンピオン」のどちらかを含む文書を探します。

Hyper Estraierは、日本語だけでなく、英語、ドイツ語、フランス語、中国語など、大抵の言語を扱うことができます。英字の大文字と小文字の違いは無視されます。「Japan」「japan」「JAPAN」「jaPaN」は全て同じです。ダイアクリティカルマーク付きのラテン文字や、ギリシア文字、キリル文字でも同様です。

AND」「ANDNOT」「OR」は演算子ですので、大文字で書かなければなりません。また、前後に空白が必要です。「AND」という文字列を含む文書を探したい場合は、「and」と指定してください。「ANDNOT」や「OR」でも同様です。

全ての文書に該当するワイルドカードとして、「[UVSET]」という定数があります。これを使うと、純粋なNOT検索ができます。例えば、「[UVSET] ANDNOT ファイル」とすると、「ファイル」を含まない全ての文書を検索します。ただし、この処理は遅いです。

欧米に見られる空白で語を区切る言語の単語に対しては、前方一致、後方一致、正規表現の条件を指定して検索を行うことができます(日本語には効果がありません)。前方一致の場合は文字列の前に空白を挟んで「[BW]」を置き、後方一致の場合は文字列の前に空白を挟んで「[EW]」を置き、正規表現の場合は文字列の前に空白を挟んで「[RX]」を置きます。例えば、「[BW] euro」だと「euro」で始まる単語を含む文書を検索します。「[EW] sphere」だと「sphere」で終わる単語を含む文書を検索します。「[RX] ^inter.*al$」だと「inter」で始まって「al」で終わる単語を含む文書を検索します。

全文検索条件の簡便書式

Googleなどの検索エンジンでは、空白で区切ることでAND条件を指定できます。そのような挙動の方が望ましい場合は、簡便書式を使うことができます。簡便書式を使うかどうかは、アプリケーションのコマンドラインのオプションや設定ファイルで指定します。estseek.cgiのデフォルトの設定では、簡便書式が使われるようになっています。

簡便書式では、空白または「&」で区切るとAND条件になります。例えば、「インターネット セキュリティ」と入力すると、「インターネット」と「セキュリティ」の両方を含む文書を検索します。

複数の検索語を「""」で括ると、フレーズ検索ができます。例えば、「"United Nations"」と入力すると、「United」の直後に「Nations」が出現する文書を検索します。

!」を使うとNOT検索ができます。例えば、「スキー ! スノボー」と入力すると、「スキー」を含むが「スノボー」を含まない文書を検索します。

|」を使うとOR検索ができます。例えば、「レモン | ライム」と入力すると、「レモン」か「ライム」の片方または両方を含む文書を検索します。

|」の優先順位が「&」や「!」より高いのは通常書式と同じです。

簡便書式においては、ワイルドカードによって前方一致や後方一致や正規表現の条件を指定することができます(日本語には効果がありません)。前方一致の場合は文字列の後に「*」を置き、後方一致の場合は文字列の前に「*」を置き、正規表現の場合は文字列の前後に「*」を置きます。例えば、「euro*」だと「euro」で始まる単語を含む文書を検索します。「*sphere」だと「sphere」で終わる単語を含む文書を検索します。「*^inter.*al$*」だと「inter」で始まって「al」で終わる単語を含む文書を検索します。

空白や「&」「!」「|」「*」を検索語そのものとして指定したい場合は、フレーズ検索を応用してください。例えば「AT&T」を検索したい場合は、「"AT&T"」とします。

全文検索条件のその他の書式

粗略書式は、簡便書式よりもさらに単純な書式です。空白で区切るとAND条件になり、「|」で区切るとOR条件になり、「""」で挟むとフレーズ検索になるところは簡便書式と同じです。ただし、「&」は通常の文字として扱われます。また、OR条件を指定するには、検索語の前に「-」をつけて、「unix -linux」などとして表現します。粗略書式では、ワイルドカードなどの特殊機能は全て無効になります。

論理和書式は、空白で区切った各トークンのOR条件を指定するものです。論理積書式は、空白で区切った各トークンのAND条件を指定するものです。論理和書式や論理積書式においても、ワイルドカードなどの特殊機能は全て無効になります。

属性検索条件

属性検索条件式は、各文書が持つ属性に対して演算子を適用して、該当する文書を検索するためのものです。属性条件式は属性名と演算子と値を空白で区切って並べたものです。例えば、「@title STRINC 重要」と指定すると、タイトルに「重要」という文字列を含む文書だけに絞り込みます。「STRINC」は演算子です。属性検索用の演算子には以下のものがあります。

演算子の前に「!」を置いて「!STREQ」などとすると、条件に当てはまらないものに絞り込みます。例えば、「@title !STRBW ※未承諾広告」などとします。文字列の演算子の前に「I」を置いて「ISTREQ」などとすると、文字列の大文字と小文字の違いを無視します。「!」と「I」を両方指定する場合、「!ISTREQ」などとします。演算子を省略して属性名のみを指定した場合、値は問わずに、その属性を備える文書を該当とみなします。STRANDSTRORSTROREQNUMBTは空白で区切った複数の文字列を引数に取ります。「NUMBT 51 100」は、「51から100まで」という意味であり、境界値も範囲に含みます。

属性名を「,」で区切って並べると、並べた属性のいずれかという意味になります。例えば「from,to,cc STRINC mikio」は、「fromかtoかccのどれかにmikioを含む」という意味になります。「,」の前後に空白を入れてはいけません。

属性条件は複数指定することができます。その場合、指定された全ての条件を満たす文書が該当とみなされます。なお、属性検索を行うと候補の全ての文書の情報を参照するため、検索速度が多少遅くなります。後述の属性インデックスを使うと属性検索を高速化することができます。

順序指定

順序指定式によって、結果の表示順序を指定することもできます。順序指定式は属性名と演算子を空白で区切って並べたものです。例えば、「@size NUMA」と指定すると、サイズが小さい文書から並べられます。「NUMA」は演算子です。順序指定用の演算子には以下のものがあります。演算子を省略した場合は、「STRA」が指定されたとみなします。

順序指定を行わなかった場合は、スコアの降順になります。スコアとは、各文書に指定した検索語がどのくらい含まれるかという指標です。AND検索やOR検索で複数の語が指定された場合、TF-IDF法に基づいてスコアの調整が行われます。「the」や「する」といった頻出語よりも、「hippopotamus」や「咀嚼」といった特徴的な語句に高いスコアをつけるということです。また、検索語が同数程度含まれるならば、総語数の多い文書よりも総語数の少ない文書の方がスコアが高くなります。スコアの昇順に並べたい場合は、属性名を省いて単に「[SCA]」と指定してください。

順序指定式は一つしか指定できません。なお、順序指定を行うと候補の全ての文書の情報を参照するため、検索速度が多少遅くなります。

類似検索

ある文書に似た文書を探す、類似検索式もサポートされます。関連文書検索とも呼ばれることもあります。類似検索の利用方法はアプリケーションによって様々ですが、典型的には、検索結果に示される文書のひとつをユーザが指定して、それに似た文書を再検索するために使われます。estseek.cgiの場合、「[similar]」というリンクを選択すると類似検索を行うことができます。類似検索の結果は類似度の降順に並べられます。類似度はベクトル空間モデルという考え方に基づいて算出されます。文書からキーワードを取り出してベクトルとして表現し、ベクトル同士のなす角の余弦を類似度とするものです。ちょっと難しい言い方になりましたが、要するに、語彙が似通った文書は類似度が高くなるということです。キーワードとしては、文書内の頻度にTF-IDF法で重みづけを行った結果が上位の語句が選択されます。

類似検索式をユーザが入力する必要はありませんが、アプリケーションに類似検索機能をつけるためには書式を知っておく必要があります。検索フレーズが「[SIMILAR]」という演算子で始まっている場合に類似検索が行われます。「[SIMILAR]」の後ろには、種文書(類似判定の元となる文書)のベクトルの要素を列挙します。各要素は「WITH」演算子で始まり、スコアの数値とキーワードの文字列を空白で区切って指定します。例えば、300の「日本」と250の「japan」と100の「東京」を含む文書を仮想の種文書とする場合は、「[SIMILAR] WITH 300 日本 WITH 250 japan WITH 100 東京」と指定します。

[SIMILAR] 24 2048 8192 WITH 300 日本 WITH 250 japan」のように、演算子の後に空白で区切って3つの数値を指定することができます。この例の場合、キーワードの上位24語の各々に該当する文書を2048件ずつ取り出し、その和集合からスコアが上位の8192件の文書を類似度判定の候補として選ぶということを意味します。デフォルトでは上位16語から各々1024件を取り出して上位4096件を候補とします。

関連文書検索と順序指定式を同時に指定した場合、類似度が0.5以上の文書に絞り込んだ上で、順序指定式に基づいて並べられます。なお、関連文書検索の検索速度はとても遅いです。後述のキーワードデータベースを使うと類似検索を高速化することができます。

類似隠蔽

検索結果に似たような文書ばかりが並んで鬱陶しい場合は、類似隠蔽機能を利用してください。類似隠蔽機能のインターフェイスはアプリケーションによって異なりますが、0.0から1.0までの類似度を指定します。すると、検索結果の各々の文書に対して、指定した値を越える類似度を持つ他の文書を重ねる処理を行います。重なった文書群の中で表示されるのは最も順位の高いものだけです。類似度の指定は0.7から0.9までの間にすると使いやすいでしょう。

類似度に「file」を指定した場合、同じファイルに対する異なるURL(CGI等のクエリ文字列など)の文書を隠蔽します。「dir」を指定した場合、同じディレクトリ内にある文書を隠蔽します。「serv」を指定した場合、同じサーバ内にある文書を隠蔽します。

ID検索とURI検索

検索フレーズが「[ID]」で始まっている場合にはID検索が行われます。指定したID番号の文書のみが該当します。例えば、「[ID] 5」のようにします。検索フレーズが「[URI]」で始まっている場合にはURI検索が行われます。指定したURIの文書のみが該当します。例えば、「[URI] http://estraier.gov/foo.html」のようにします。これらによって、検索コマンド(estcmd search)を取得コマンド(estcmd get)の代用として使うことができます。


検索語の抽出

文書の本文や検索フレーズの文字列から検索語を抽出する際には、いくつかのルールがあります。ここでは、そのルールついて詳しく説明します。

検索語の抽出

英語やその他のヨーロッパの言語にのように空白で語が区切れる場合、空白で区切った文字列を検索語として登録します。「It is fine today.」という文字列からは、「it」「is」「fine」「today」「.」の5個の検索語が抽出されます。

日本語をはじめとする、語を空白で区切れない言語の場合は、N-gramという手法で検索語が抽出されます。連続するN文字を語として、1文字ずつずらしながら語を抽出する手法です。Hyper Estraierでは2文字を語とするので2-gram(bi-gram)と呼ばれることもあります。例えば「本日は晴天なり。」という文字列からは、「本日」「日は」「は晴」「晴天」「天な」「なり」「り。」の7個の検索語が抽出されます。

2-gram方式だと1文字の検索語はどの検索キーにも一致しないことになりますが、それでも検索は可能です。1文字の検索語が指定された場合、その文字を含む全てのキーのOR検索が内部的に行われます。ただし、調べるキーの数が多いので、検索速度は少し遅くなります。

検査の省略による高速化

ホンマグロ」という検索語が指定された場合「ホン」「ンマ」「マグ」「グロ」を含み、かつそれぞれが隣り合っている部分がある文書を該当とみなせばよいことになります。しかし、デフォルトでは全ての語をの検査をせず、「ホン」と「マグ」だけを調べます。「ホン」の1つ飛ばした隣に「マグ」があるならば、「ンマ」を調べる必要はないからです。また、各検索語は後ろになにが来るかという情報を持っているので、「マグ」を調べると「グロ」の存在もわかります。このような工夫をしてなるべく検査を省略した方が、応答時間が短くなって快適です。

ただし、スコアの計算は、調べた検索語が各該当文書の中で出現する数を基準に行うので、全ての語を調べた方が精度が高まることが多いです。つまり、速度と精度のトレードオフの関係になります。どちらを優先するかはアプリケーションのコマンドラインオプションや設定ファイルで指定します。estseek.cgiのデフォルトの設定では1個飛ばしで検査するようになっています。

精度の制限による高速化

Hyper Estraierでは、N-gramの連接判定の精度を落とすことによって処理速度を上げる工夫がなされています。検索やインデックス更新の処理が高速な反面、まれに検索語が含まれない文書が該当とみなされることがあります。検索語の後ろ2語まで(日本語なら3文字分)の連接判定しかしませんので、「シミュレーション」で検索した場合、「シミュレ」「ミュレー」「ュレーシ」「レーショ」「ーション」の全てを含む文書は、たとえ「シミュレーション」がなくても該当してしまいます。また、連接判定にはハッシュ関数を用いますので、まれ(251分の1の確率)に精度が3語分を下回ることがあります。

ただし、スニペットを作る際には文字列の逐次探索による完全な連接判定が行われますので、スニペットの中に検索語のハイライトが含まれない文書は検索ゴミであることが容易にわかります。なお、estseek.cgiには、検索ゴミであることを検出して表示しないようにするオプションもあります。

分かち書き方式との比較

N-gram方式と対比されるアプローチとして、分かち書き方式があります。自然言語の文法や語法に基づく方法で単語や形態素を切り出すものです。Hyper Estraierの前身であるEstraierでは分かち書き方式を採用していました。N-gram方式は再現率がほぼ完璧である(検索漏れがない)という利点がありますが、分かち書き方式に比べて精度が低い(検索ゴミが多い)という欠点があります。検索システムの用途や対象文書の内容によってどちらが適するかは変わってきます。興味を持たれた方は、Hyper EstraierとEstraierの使い勝手を比べてみてください。

Hyper Estraierには、N-gram方式と分かち書き方式を併用するオプションもあります。N-gramで抽出した語からなるメインインデックスとは別に、分かち書きで抽出した重要語だけからなる補助インデックスを管理します。そうすると、検索語が適切に分かち書きできた場合は、補助インデックスを見て、高速で高精度な検索を行うことができます。分かち書きがうまく行えなかった場合も、メインインデックスを見れば、検索漏れのない結果を提示することができます。


管理用コマンド

ここでは、インデックス管理用コマンドestcmdの詳細な仕様を説明します。検索もできるので、estcmdをスクリプト言語から呼び出せばそれなりのアプリケーションが簡単に作れます。

書式

estcmdは多くのサブコマンドの集合体です。サブコマンドの名前は第1引数で指定されます。その他の引数はサブコマンドの種類に応じて解釈されます。dbという引数はインデックスのパスです。

estcmd create [-tr] [-apn|-acc] [-xs|-xl|-xh|-xh2|-xh3] [-sv|-si|-sa] [-attr name type] db
インデックスを作成します。
-trをつけると、既にインデックスがある場合にも新しいインデックスを作成します。
-apnをつけると、全ての言語をN-gram法で処理します。
-accをつけると、N-gram法の代わりに文字種分類法を利用します。
-xsをつけると、50000件未満の文書を登録することを想定してインデックスを作成します。
-xlをつけると、300000件以上の文書を登録することを想定してインデックスを作成します。
-xhをつけると、1000000件以上の文書を登録することを想定してインデックスを作成します。
-xh2をつけると、5000000件以上の文書を登録することを想定してインデックスを作成します。
-xh3をつけると、10000000件以上の文書を登録することを想定してインデックスを作成します。
-svをつけると、スコア情報を破棄します。
-siをつけると、スコア情報を32ビットの数値として記録します。
-saをつけると、スコア情報をそのまま保存した上で検索時に調整されないようにマークします。
-attrは属性インデックスの対象となる属性名とデータ型を指定します。複数指定可能です。
estcmd put [-tr] [-cl] [-ws] [-apn|-acc] [-xs|-xl|-xh|-xh2|-xh3] [-sv|-si|-sa] db [file]
文書ドラフト形式のファイルを登録します。
fileは対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。
-trをつけると、既にインデックスがある場合にも新しいインデックスを作成します。
-clを付けると、上書きされた文書の領域を整理します。
-wsを付けると、重み付け属性を静的に適用します。
-apnをつけると、全ての言語をN-gram法で処理します。
-accをつけると、N-gram法の代わりに文字種分類法を利用します。
-xsをつけると、50000件未満の文書を登録することを想定してインデックスを作成します。
-xlをつけると、300000件以上の文書を登録することを想定してインデックスを作成します。
-xhをつけると、1000000件以上の文書を登録することを想定してインデックスを作成します。
-xh2をつけると、5000000件以上の文書を登録することを想定してインデックスを作成します。
-xh3をつけると、10000000件以上の文書を登録することを想定してインデックスを作成します。
-svをつけると、スコア情報を破棄します。
-siをつけると、スコア情報を32ビットの数値として記録します。
-saをつけると、スコア情報をそのまま保存した上で検索時に調整されないようにマークします。
estcmd out [-cl] [-pc enc] db expr
特定の文書の情報をインデックスから削除します。
exprは対象のID番号かURIかローカルパスを指定します。
-clを付けると、削除された文書の領域を整理します。
-pcはファイルのパスの文字コードを指定します。デフォルトはISO-8859-1です。
estcmd edit [-pc enc] db expr name [value]
特定の文書の属性を更新します。
exprは対象のID番号かURIかローカルパスを指定します。
nameは属性の名前を指定します。
valueは属性の値を指定します。省略した場合その属性は削除されます。
-pcはファイルのパスと属性値の文字コードを指定します。デフォルトはISO-8859-1です。
estcmd get [-nl|-nb] [-pidx path] [-pc enc] db expr [attr]
特定の文書の情報を文書ドラフト形式で出力します。
exprは対象のID番号かURIかローカルパスを指定します。
attrを付けると、その属性の値のみを出力します。
-nlを付けると、ファイルロックをかけないでインデックスを開きます。
-nbを付けると、ブロックせずにファイルロックをかけます。
-pidxは検索対象に追加する疑似インデックスのパスを指定します。複数指定可能です。
-pcはファイルのパスの文字コードを指定します。デフォルトはISO-8859-1です。
estcmd list [-nl|-nb] [-lp] db
インデックスに登録されている全ての文書のID番号を出力します。
-nlを付けると、ファイルロックをかけないでインデックスを開きます。
-nbを付けると、ブロックせずにファイルロックをかけます。
-lpを付けると、「file://」のURIに対応するローカルパスも出力します。
estcmd uriid [-pidx path] [-nl|-nb] [-pc enc] db expr
指定したURIの文書のID番号を出力します。
exprは対象のURIかローカルパスを指定します。
-nlを付けると、ファイルロックをかけないでインデックスを開きます。
-nbを付けると、ブロックせずにファイルロックをかけます。
-pidxは検索対象に追加する疑似インデックスのパスを指定します。複数指定可能です。
-pcはファイルのパスの文字コードを指定します。デフォルトはISO-8859-1です。
estcmd meta db [name [value]]
インデックスのメタデータを扱います。
nameはメタデータの名前を指定します。省略した場合は名前の一覧を出力します。
valueは記録するメタデータの値を指定します。省略した場合は現状の値を出力します。空文字列の場合は削除します。
estcmd inform [-nl|-nb] db
インデックスに登録された文書数や異なり語数などの情報を出力します。
-nlを付けると、ファイルロックをかけないでインデックスを開きます。
-nbを付けると、ブロックせずにファイルロックをかけます。
estcmd optimize [-onp] [-ond] db
インデックスを最適化して、不要な領域を削除します。
-onpを付けると、削除された文書の領域を回収する処理を省略します。
-ondを付けると、データベースファイルの最適化を省略します。
estcmd merge [-cl] db target
別のインデックスをマージします。
targetは別のインデックスのパスを指定します。
-clを付けると、削除された文書の領域を整理します。
estcmd repair [-rst|-rsh] db
壊れたインデックスを修復します。
-rstを付けると、厳密な整合性検査を行います。
-rshを付けると、整合性検査を省略します。
estcmd search [-nl|-nb] [-pidx path] [-ic enc] [-vu|-va|-vf|-vs|-vh|-vx|-dd] [-sn wnum hnum anum] [-kn num] [-ec rn] [-gs|-gf|-ga] [-cd] [-ni] [-sf|-sfr|-sfu|-sfi] [-hs] [-attr expr] [-ord expr] [-max num] [-sk num] [-aux num] [-dis name] [-sim id] db [phrase]
インデックスに登録された文書を検索します。
phraseは全文検索の検索式を指定します。
-nlを付けると、ファイルロックをかけないでインデックスを開きます。
-nbを付けると、ブロックせずにファイルロックをかけます。
-pidxは検索対象に追加する疑似インデックスのパスを指定します。複数指定可能です。
-icは引数の文字コードを指定します。デフォルトはUTF-8です。
-vuを付けると、ID番号とURIをタブ区切りにした形式で結果を出力します。
-vaを付けると、属性情報を含めたマルチパート形式で結果を出力します。
-vfを付けると、文書ドラフト形式を含めたマルチパート形式で結果を出力します。
-vsを付けると、属性情報とスニペットを含めたマルチパート形式で結果を出力します。
-vhを付けると、属性情報とスニペットを人間が読みやすい形式にして結果を出力します。
-vxを付けると、属性情報とスニペットをXML形式にして結果を出力します。
-ddを付けると、結果を文書ドラフト形式のファイルとして保存します。
-snは、スニペットの全体の幅と冒頭から抽出する幅とハイライトされる語の周辺から抽出する幅を指定します。
-knは、抽出するキーワードの数を指定します。デフォルトではキーワード抽出は行いません。
-umを付けると、キーワードを抽出する際に形態素解析器を用います。
-ecは類似隠蔽の下限類似度を0.0から1.0までの実数で指定します。「serv」を指定するとサーバ単位になり、「dir」を指定するとディレクトリ単位になり、「file」を指定するとファイル単位になります。
-gsを付けると、N-gramの全てのキーの存在を検査します。デフォルトは1個置きです。
-gfを付けると、N-gramのキーを2個置きで検査します。
-gaを付けると、N-gramのキーを3個置きで検査します。
-cdを付けると、文書の内容がフレーズと確実に適合するか検査します。
-niを付けると、TF-IDF法によるスコアの調整を行いません。
-sfを付けると、検索式を簡便書式として扱います。
-sfrを付けると、検索式を粗略書式として扱います。
-sfuを付けると、検索式を論理和書式として扱います。
-sfiを付けると、検索式を論理積書式として扱います。
-hsを付けると、該当文書のスコア情報を属性として出力します。
-attrは絞り込みの属性条件を指定します。複数指定可能です。
-ordはソート条件を指定します。デフォルトはスコアの降順です。
-maxは最大表示件数を指定します。負数にすると無制限になります。デフォルトは10件です。
-skは表示をスキップする件数を指定します。デフォルトは0件です。
-auxは補助インデックスの結果を採用する許可を指定します。0を越えない値を指定すると補助インデックスは使われません。デフォルトは32件です。
-disは重複回避属性の名前を指定します。
-simは類似検索の種文書のID番号を指定します。
estcmd gather [-tr] [-cl] [-ws] [-no] [-fe|-ft|-fh|-fm] [-fx sufs cmd] [-fz] [-fo] [-rm sufs] [-ic enc] [-il lang] [-bc] [-lt num] [-lf num] [-pc enc] [-px name] [-aa name value] [-apn|-acc] [-xs|-xl|-xh|-xh2|-xh3] [-sv|-si|-sa] [-ss name] [-sd] [-cm] [-cs num] [-ncm] [-kn num] [-um] db [file|dir]
ファイルシステムを探索して文書を登録します。
第3引数としてファイル名を指定すると、そのファイルから処理対象のパスのリストを読み込みます。「-」を指定した場合、標準入力が読み込まれます。findコマンドの出力を読み込むと便利です。
第3引数としてディレクトリ名を指定すると、そのディレクトリ以下の全てのファイルを処理対象にします。
-trをつけると、既にインデックスがある場合にも新しいインデックスを作成します。
-clを付けると、上書きされた文書の領域を整理します。
-wsを付けると、重み付け属性を静的に適用します。
-noを付けると、処理内容の表示だけを行い、実際の処理を行いません。
-feを付けると、処理対象の全てのファイルを文書ドラフトとして扱います。デフォルトでは、拡張子によって文書形式を判断し、サポート外のものは無視されます。
-ftを付けると、処理対象の全てのファイルをプレーンテキストとして扱います。
-fhを付けると、処理対象の全てのファイルをHTMLとして扱います。
-fmを付けると、処理対象の全てのファイルをMIMEとして扱います。
-fxは、ファイル名の接尾辞に関連づけた外部コマンドを指定します。カンマ区切りで複数の接尾辞を指定できます。「*」だと全てのファイルに一致します。コマンド名の前に「T@」をつけるとその出力がプレーンテキストとして解析され、「H@」をつけるとHTMLとして解析され、「M@」をつけるとMIMEとして解析され、いずれでもない場合は文書ドラフトとして解析されます。このオプションは複数回指定できます。
-fzを付けると、-fxの条件に当てはまらないファイルを無視します。
-foを付けると、処理対象のファイルを読み込みません。外部フィルタの効率化のために使います。
-rmは、処理後に削除するファイルを指定します。カンマ区切りで複数の接尾辞を指定できます。「*」を指定すると全てのファイルを削除します。このオプションは複数回指定できます。
-icは対象文書の文字コードを指定します。デフォルトは自動判定です。
-ilは文字コードの判定で優先される言語を指定します。デフォルトは英語です。
-bcを付けると、バイナリファイルを検出して処理対象から除外します。
-ltは、解析するテキストのサイズ制限をキロバイト単位で指定します。デフォルトは128KBです。負数にすると無制限になります。制限を超えた場合、先頭から制限サイズまでのテキストが解析されます。
-lfは、読み込むファイルのサイズ制限をメガバイト単位で指定します。デフォルトは32MBです。負数にすると無制限になります。制限を超えた場合、そのファイルは無視されます。
-pcはファイルのパスの文字コードを指定します。デフォルトはISO-8859-1です。
-pxはパスのリストから読み取る属性の名前を指定します。パスのリストはTSV形式にすることができ、第1フィールドは対象文書のパス名、第2フィールド以降は属性値の定義として扱われます。-pxによって第2フィールド以降に対応する属性名を定義します。このオプションは複数回指定できます。
-aaは追加する属性の名前と値を指定します。このオプションは複数回指定できます。
-apnをつけると、全ての言語をN-gram法で処理します。
-accをつけると、N-gram法の代わりに文字種分類法を利用します。
-xsをつけると、50000件未満の文書を登録することを想定してインデックスを作成します。
-xlをつけると、300000件以上の文書を登録することを想定してインデックスを作成します。
-xhをつけると、1000000件以上の文書を登録することを想定してインデックスを作成します。
-xh2をつけると、5000000件以上の文書を登録することを想定してインデックスを作成します。
-xh3をつけると、10000000件以上の文書を登録することを想定してインデックスを作成します。
-svをつけると、スコア情報を破棄します。
-siをつけると、スコア情報を32ビットの数値として記録します。
-saをつけると、スコア情報をそのまま保存した上で検索時に調整されないようにマークします。
-ssは、代替スコアとして扱う属性の名前を指定します。
-sdを付けると、ファイルの更新日時を文書の属性として追加します。
-cmを付けると、文書の属性の更新日時がファイルの更新日時より古い場合にのみ登録を行います。
-csは、キャッシュメモリのサイズをメガバイト単位で指定します。デフォルトは64MBです。
-ncmをつけると、仮想メモリの残量検査を省略します。
-knは、抽出するキーワードの数を指定します。デフォルトではキーワード抽出は行いません。
-umを付けると、キーワードを抽出する際に形態素解析器を用います。
estcmd purge [-cl] [-no] [-fc] [-pc enc] [-attr expr] db [prefix]
インデックス内にあってファイルシステム上にない文書の情報を削除します。
prefixを指定すると、その文字列で始まるURIの文書のみを対象とします。ディレクトリのローカルパスでも指定できます。
-clを付けると、削除された文書の領域を整理します。
-noを付けると、処理内容の表示だけを行い、実際の処理を行いません。
-fcを付けると、ファイルがあるかないかにかかわらず文書情報を削除します。
-pcはファイルのパスの文字コードを指定します。デフォルトはISO-8859-1です。
-attrは絞り込みの属性条件を指定します。複数指定可能です。
estcmd extkeys [-no] [-fc] [-dfdb file] [-ncm] [-ni] [-kn num] [-um] [-attr expr] db [prefix]
インデックス内の各文書のキーワードを抽出したデータベースを作成します。
prefixを指定すると、その文字列で始まるURIの文書のみを対象とします。
-noを付けると、処理内容の表示だけを行い、実際の処理を行いません。
-fcを付けると、既にキーワードが登録されている文書でもキーワードを作りなおします。
-dfdbは、文書頻度を記録した外部データベースを指定します。デフォルトではインデックスから動的に文書頻度を計算します。
-ncmをつけると、仮想メモリの残量検査を省略します。
-niを付けると、TF-IDF法によるスコアの調整を行いません。
-knは、抽出するキーワードの数を指定します。デフォルトは32個です。
-umを付けると、キーワードを抽出する際に形態素解析器を用います。
-attrは絞り込みの属性条件を指定します。複数指定可能です。
estcmd words [-nl|-nb] [-dfdb file] [-kw|-kt] db
インデックス内の異なり語とそのレコードサイズ(文書頻度)を出力します。
-nlを付けると、ファイルロックをかけないでインデックスを開きます。
-nbを付けると、ブロックせずにファイルロックをかけます。
-dfdbは、結果を格納する外部のデータベースを指定します。デフォルトでは標準出力にTSV形式で出力されます。外部データベースが既に存在する場合は、各レコードの値を加算します。
-kwを付けると、キーワードとその該当文書数を出力します。
-ktを付けると、キーワードとその関連語を出力します。
estcmd draft [-ft|-fh|-fm] [-ic enc] [-il lang] [-bc] [-lt num] [-kn num] [-um] [file]
各種形式のファイルを文書ドラフト形式に変換して出力します。
fileは対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。
-ftを付けると、対象をプレーンテキストとして扱います。デフォルトは文書ドラフト形式です。
-fhを付けると、対象をHTMLとして扱います。
-fmを付けると、対象をMIMEとして扱います。
-icは対象文書の文字コードを指定します。デフォルトは自動判定です。
-ilは文字コードの判定で優先される言語を指定します。デフォルトは英語です。
-bcを付けると、バイナリファイルを検出して処理対象から除外します。
-ltは、解析するテキストのサイズ制限をキロバイト単位で指定します。デフォルトは256KBです。負数にすると無制限になります。制限を超えた場合、先頭から制限サイズまでのテキストが解析されます。
-knは、抽出するキーワードの数を指定します。
-umを付けると、キーワードを抽出する際に形態素解析器を用います。
estcmd break [-ic enc] [-il lang] [-apn|-acc] [-wt] [file]
プレーンテキストを検索語に分解します。
fileは対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。「@」で始まる場合、「@」より後ろの文字列そのものを処理対象とします。
-icは処理対象の文字コードを指定します。デフォルトは自動判定です。
-ilは文字コードの判定で優先される言語を指定します。デフォルトは英語です。
-apnをつけると、全ての言語をN-gram法で処理します。
-accをつけると、N-gram法の代わりに文字種分類法を利用します。
-wtを付けると、「末尾の1-gram」も出力します。
estcmd iconv [-ic enc] [-il lang] [-oc enc] [file]
文字コードを変換します。
fileは対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。「@」で始まる場合、「@」より後ろの文字列そのものを処理対象とします。
-icは処理対象の文字コードを指定します。デフォルトは自動判定です。
-ilは文字コードの判定で優先される言語を指定します。デフォルトは英語です。
-ocは出力の文字コードを指定します。デフォルトはUTF-8です。
estcmd regex [-inv] [-repl str] expr [file]
正規表現を含む行を出力します。
exprは正規表現を指定します。
fileは対象のファイルを指定しますが、省略した場合は標準入力が読み込まれます。
-invを付けると、正規表現にマッチしない行を出力します。
-replを付けると、正規表現にマッチする部分を指定した文字列に置き換えるとともに、マッチしない行も出力します。
estcmd scandir [-tf|-td] [-pa|-pu] [dir]
ディレクトリに含まれるファイルを再帰的に探索して出力します。
dirは探索の起点となるディレクトリを指定しますが、省略した場合はカレントディレクトリが指定されます。
-tfを付けると、通常のファイルのみを出力します。
-tdを付けると、ディレクトリのみを出力します。
-paを付けると、絶対パスを出力します。
-puを付けると、URLを出力します。
estcmd multi [-db db] [-nl|-nb] [-ic enc] [-gs|-gf|-ga] [-cd] [-ni] [-sf|-sfr|-sfu|-sfi] [-hs] [-hu] [-attr expr] [-ord expr] [-max num] [-sk num] [-aux num] [-dis name] [phrase]
ローカルメタ検索のテストを行います。
phraseは全文検索の検索式を指定します。
-dbは、メタ検索の対象となるデータベースを指定します。複数指定可能です。
-nlを付けると、ファイルロックをかけないでインデックスを開きます。
-nbを付けると、ブロックせずにファイルロックをかけます。
-pidxは検索対象に追加する疑似インデックスのパスを指定します。複数指定可能です。
-icは引数の文字コードを指定します。デフォルトはUTF-8です。
-gsを付けると、N-gramの全てのキーの存在を検査します。デフォルトは1個置きです。
-gfを付けると、N-gramのキーを2個置きで検査します。
-gaを付けると、N-gramのキーを3個置きで検査します。
-cdを付けると、文書の内容がフレーズと確実に適合するか検査します。
-niを付けると、TF-IDF法によるスコアの調整を行いません。
-sfを付けると、検索式を簡便書式として扱います。
-sfrを付けると、検索式を粗略書式として扱います。
-sfuを付けると、検索式を論理和書式として扱います。
-sfiを付けると、検索式を論理積書式として扱います。
-hsを付けると、該当文書のスコア情報を出力に含めます。
-huを付けると、該当文書のうURLを出力に含めます。
-attrは絞り込みの属性条件を指定します。複数指定可能です。
-ordはソート条件を指定します。デフォルトはスコアの降順です。
-maxは最大表示件数を指定します。負数にすると無制限になります。デフォルトは10件です。
-skは表示をスキップする件数を指定します。デフォルトは0件です。
-auxは補助インデックスの結果を採用する許可を指定します。0を越えない値を指定すると補助インデックスは使われません。デフォルトは32件です。
-disは重複回避属性の名前を指定します。
estcmd randput [-ren|-rla|-reu|-ror|-rjp|-rch] [-cs num] db dnum
無作為に生成した文書を登録するテストを行います。
-renを付けると、英文風の文書のみを登録します。デフォルトは全種類を登録します。
-rlaを付けると、独文、仏文、西文風の文書のみを登録します。
-reuを付けると、希文、露文風の文書のみを登録します。
-rorを付けると、アジア全域の文字を使った文書のみを登録します。
-rjpを付けると、和文風の文書のみを登録します。
-rchを付けると、UCS-2の全ての文字を使った文書のみを登録します。
-csは、キャッシュメモリのサイズをメガバイト単位で指定します。デフォルトは64MBです。
estcmd wicked db dnum
文書の登録、削除、検索、データベースの開閉、最適化などを無作為に繰り返すテストを行います。
dnumは処理の回数を指定します。
estcmd regression db
回帰テストを行います。
estcmd version
バージョンと著作権の情報を出力します。

全てのサブコマンドは、処理が正常に終了した場合には0を、そうでない場合は1を終了ステータスにします。putoutgatherpurgerandputwickedregressionについては、実行中のプロセスに1(SIGHUP)、2(SIGINT)、3(SIGQUIT)、13(SIGPIPE)、15(SIGTERM)のどれかのシグナルを送ることにより、データベースを閉じて正常終了させることができます。

createの「-attr」オプションにおけるデータ型は、「seq」ならシーケンシャル型、「str」なら文字列型、「num」なら数値型になります。

gather等の「-ic」オプションでは、「UTF-8」「EUC-JP」「Shift_JIS」「ISO-2022-JP」「ISO-8859-1」などの、IETFに登録されている文字コード名を指定してください。実際には、iconvが認識する名前は全て使えます。また、「-il」オプションでは、「en」(英語)、「ja」(日本語)、「zh」(中国語)、「ko」(朝鮮語)のどれかを指定してください。

gatherの「-fx」オプションで指定した外部コマンドは、第1引数に対象文書のパス、第2引数に出力先のパスが渡されて呼び出されます。すなわち、外部コマンドは第1引数のファイルを解析して文書ドラフトやプレーンテキストやHTMLやMIMEを生成し、第2引数のファイルに書き込むという機能を持つことが期待されます。なお、対象文書は一時ファイルとしてコピーされて渡されます。対象文書の元来のパスは環境変数ESTORIGFILEの値として渡されますが、決して元のファイルを変更してはいけません。ESTORIGFILEを使う場合はファイルを読み込む必要はありませんので、「-fo」オプションも同時につけるとよいでしょう。

gatherextkeysの実行時には、仮想メモリの空き領域が少ない場合には処理を停止するチェック機能が働きます。UNIX系のOSでスワップ領域を確保していない場合はこのチェックが誤動作する場合がありますので、その際には「-ncm」オプションを指定して実行してください。

応用例:メールボックスのインデクシング

mh形式(1メール=1ファイル)でメールボックスを管理するメーラ(Mew、Wanderlust、Sylpheedなど)をお使いなら、個々のメールを対象にした全文検索のインデックスを簡単に作ることができます。例えば、メールボックスが「/home/mikio/Mail」にあり、その中のbusinessフォルダかfriendsフォルダに振り分けられたメールを登録する場合、以下のコマンドを実行します。

find /home/mikio/Mail -type f | egrep 'inbox/(business|friends)/[0-9]+$' |
  estcmd gather -cl -fm -cm casket -

作成されたインデックスは、estseek.cgiを使って検索することができます。なお、-cmオプションをつけておくことで、差分更新ができます。MIMEにはDateヘッダがありますので、-sdオプションでファイルの更新時刻を持ってくる必要はありません。

mh形式以外のメーラをお使いの場合は、mh形式になるようにメールをエクスポートしてください。Windowsで言うところのEML形式でも構いません。あるいは、APIを使って専用のアプリケーションを作成してください。

応用例:外部コマンドのフィルタ

外部コマンドをフィルタとして呼び出すこともできます。「/usr/local/share/hyperestraier/filter/」に各種のフィルタがインストールされているので、適宜ご利用ください。

estfxmantotxtはUNIXのmanのマニュアルをプレーンテキスト形式に変換するフィルタです。以下のように利用して、manのファイルを対象にしたインデックスを作ることができます。

PATH=$PATH:/usr/local/share/hyperestraier/filter ; export PATH
find /usr/share/man /usr/local/man -type f |
  egrep '.*/man[0-3]/.*\.[0-3](.gz)*$' |
  estcmd gather -cl -fx ".1,.2,.3,.1.gz,.2.gz,.3.gz" "T@estfxmantotxt" -fz -sd -cm casket -

estfxmsotohtmlはMS-Office(Word/Excel/PowerPoint)のファイルをHTML形式に変換するフィルタです。以下のように利用して、MS-Officeのファイルを対象にしたインデックスを作ることができます。なお、estfxmsotohtmlを動作させるにはwvWare(wv-1.0.3)とxlhtml(ppthtmlも同梱)をインストールしておくことが必要です。

PATH=$PATH:/usr/local/share/hyperestraier/filter ; export PATH
estcmd gather -cl -fx ".doc,.xls,.ppt" "H@estfxmsotohtml" -fz -ic UTF-8 -sd -cm casket .

estfxpdftohtmlはPDFのファイルをHTML形式に変換するフィルタです。以下のように利用して、PDFのファイルを対象にしたインデックスを作ることができます。なお、estfxpdftohtmlを動作させるにはpdftotextxpdfに同梱)をインストールしておくことが必要です。

PATH=$PATH:/usr/local/share/hyperestraier/filter ; export PATH
estcmd gather -cl -fx ".pdf" "H@estfxpdftohtml" -fz -ic UTF-8 -sd -cm casket .

estfxxdwtotxtはDocuWorksのファイルをプレーンテキスト形式に変換するフィルタです。以下のように利用して、DocuWorksのファイルを対象にしたインデックスを作ることができます。なお、estfxxdwtotxtを動作させるにはxdw2textをインストールしておくことが必要です。

PATH=$PATH:/usr/local/share/hyperestraier/filter ; export PATH
estcmd gather -cl -fx ".xdw" "T@estfxxdwtotxt" -fz -ic CP932 -sd -cm casket .

各フィルタの中身を見ていただければ、とても簡単なシェルスクリプトであることがお分かりいただけると思います。シェルやPerlやRuby等で同様のプログラムを書けば様々なフィルタを簡単に作ることができます。ただし、外部コマンドのフィルタは呼び出しのオーバーヘッドが大きいので、大量の文書を扱うのには向いていません。本格的にやるならばAPIを使ってください。

応用例:コマンドラインからの検索

コマンドラインから検索する際には、端末の文字コードを考慮する必要があります。例えば端末の文字コードがEUC-JPの場合は、以下のようにするとよいでしょう。

estcmd search -ic EUC-JP -vh -max 8 casket 'こんにちは' |
  iconv -f UTF-8 -t EUC-JP -c | less

-icオプションで検索式の文字コードを指定して、iconvで出力の文字コードを変換しています。-vhオプションと-maxオプションは検索結果を見やすくするためにつけています。上述の検索語を可変にしたスクリプトを作っておくと便利かもしれません。

応用例:XML形式の検索結果

各種のスクリプト言語からHyper Estraierの検索結果を手軽に利用するためには、estcmdのXML出力機能を用いるとよいでしょう。XMLの詳しい書式についてはestresult.dtdをご覧ください。

estcmd search -vx -max 8 casket 'socket AND shutdown'

検索用CGIスクリプト

ここでは、検索用CGIスクリプトestseek.cgiの詳細な仕様を説明します。設定ファイルの書き方が中心になります。

構成

estseek.cgiが動作するには、設定ファイルテンプレートファイルトップページファイルヘルプファイルが必要です。それぞれestseek.confestseek.tmplestseek.topestseek.helpというのが標準的な名前です。

設定ファイルの名前はCGIスクリプトの接尾辞を.confに変えたものです。estseek.cgiestsearch.cgiという名前に変えたとしたら、estsearch.confが読み込まれます。その他のファイルの名前は設定ファイルの中で記述されますので、同一ディレクトリの中にいくつもの検索用ページを設置することができます。

estseek.cgiは「/usr/local/libexec/estseek.cgi」としてインストールされていますので、それをコピーして利用してください。また、設定ファイルなどのサンプルが「/usr/local/share/hyperestraier/」の中にインストールされていますので、それをコピーして修正すると楽です。「/usr/local/share/hyperestraier/locale/ja/」の中には日本語化されたサンプルもあります。

設定ファイルの書式

設定ファイルは、変数名と値を「:」で区切った形式の行を並べたものです。「#」で始まる行はコメントとして無視されます。デフォルトでは、設定ファイルは以下のような内容になっています。

indexname: casket
tmplfile: estseek.tmpl
topfile: estseek.top
helpfile: estseek.help
lockindex: true
pseudoindex:
replace: ^file:///home/mikio/public_html/{{!}}http://localhost/
replace: /index\.html?${{!}}/
showlreal: false
deftitle: Hyper Estraier: a full-text search system for communities
formtype: normal
perpage: 10 100 10
attrselect: false
#genrecheck: private{{!}}private
#genrecheck: business{{!}}business
#genrecheck: misc{{!}}miscellaneous
attrwidth: 80
showscore: true
extattr: author|Author
extattr: from|From
extattr: to|To
extattr: cc|Cc
extattr: date|Date
snipwwidth: 480
sniphwidth: 96
snipawidth: 96
condgstep: 2
dotfidf: true
scancheck: 3
phraseform: 2
dispproxy:
candetail: true
candir: false
auxmin: 32
smlrvnum: 32
smlrtune: 16 1024 4096
clipview: 2
clipweight: none
relkeynum: 0
spcache:
wildmax: 256
qxpndcmd:
logfile:
logformat: {time}\t{REMOTE_ADDR}:{REMOTE_PORT}\t{cond}\n

それぞれの変数の機能を以下に示します。

replaceは正規表現によってURIを変換するのに使います。複数回指定できます。先頭にマッチする「^」を駆使すれば接頭辞(ディレクトリ)の変換ができますし、末尾にマッチする「$」を駆使すれば接尾辞(拡張子)の変換ができます。例えば、「\.htm${{!}}.html」とすると、末尾の「.htm」を「.html」に変換できます。「{{!}}」の前の部分は正規表現なので、「\」や「.」にはエスケープ文字「\」を前置する必要があることに注意してください。「{{!}}」の後の置換文字列は正規表現ではないので、エスケープは必要ありません。

extattrは任意の属性を表示するのに使います。複数回指定できます。例えば、文書の更新日時を「Modified」というラベルをつけて表示したい場合は「extattr: @mtime|Modified」と書き、文書のサイズを「Size」というラベルをつけて表示したい場合は「extattr: @size|Size」と書きます。

テンプレートファイル

検索ページの見栄えを決めるためのファイルです。HTMLで、記述してある内容がそのまま表示されます。ただし、「<!--ESTTITLE-->」の部分にはページタイトルが挿入され、「<!--ESTFORM-->」の部分には検索フォームが挿入され、「<!--ESTRESULT-->」の部分には検索結果が挿入され、「<!--ESTINFO-->」の部分にはインデックスの情報が挿入されます。CSSやJavaScriptを駆使すれば、かなり自由にユーザインターフェイスをカスタマイズすることができます。

トップページファイル

検索用CGIスクリプトに最初にアクセスした際、あるいは検査条件を全く入力しないでアクセスした際に表示されるメッセージを記述したファイルです。記述してある内容が検索結果の位置にそのまま挿入されます。デフォルトではHyper Estraierのバナーが記述してありますが、お好みのバナーに変えたり、システムのメンテナンス情報などを記載したりするとよいでしょう。

ヘルプファイル

入力用フォームの付近にある「help」リンクを選択すると表示されるメッセージを記述したファイルです。デフォルトでは検索機能の簡単な使い方が記述してあります。設定によって機能が増減した場合はヘルプも適当に書き換えてください。

検索フォームの設置

Webサイトの検索機能として設置する場合、サイトのトップページに検索フォームを置きたくなるでしょう。その場合、以下のようなHTMLを書いてください。

<form method="get" action="estseek.cgi">
<div>
<input type="text" name="phrase" value="" size="32" />
<input type="submit" value="Search" />
<input type="hidden" name="enc" value="UTF-8" />
</div>
</form>

estseek.cgi」の部分は設置したestseek.cgiのURLにしてください。「UTF-8」の部分はそのページの文字コードにしてください。「EUC-JP」「Shift_JIS」「ISO-2022-JP」「ISO-8859-1」などが使えます。

お洒落な入力フォーム

Webサイトを検索する際には、本文もしくはタイトルで絞り込むことが多いでしょう。また、ソート条件にはスコアか日付かサイズを指定することが多いでしょう。そういった典型的な操作を簡単に行なうために、estseek.cgiにはWebサイト用の入力フォームの形式が用意されています。設定ファイルのformtypeの値を「web」にすると、Webサイト検索用の入力フォームになります。なお、Webサイトの検索を高速化するには、以下のように属性インデックスを張っておくとよいでしょう。

estcmd create -attr @title str -attr @mdate seq -attr @size seq casket

ファイルサーバを検索する際には、本文もしくはファイル名で絞り込むことが多いでしょう。また、ソート条件にはスコアか日付かサイズを指定することが多いでしょう。そういった典型的な操作を簡単に行なうために、estseek.cgiにはファイルサーバ用の入力フォームの形式が用意されています。設定ファイルのformtypeの値を「file」にすると、ファイルサーバ検索用の入力フォームになります。なお、ファイルサーバの検索を高速化するには、以下のように属性インデックスを張っておくとよいでしょう。

estcmd create -attr _lpath str -attr @mdate seq -attr @size seq casket

メールボックスを検索する際には、本文もしくはSubject/From/To/Ccの各ヘッダで絞り込むことが多いでしょう。また、ソート条件にはスコアか日付かサイズを指定することが多いでしょう。そういった典型的な操作を簡単に行なうために、estseek.cgiにはメールボックス用の入力フォームの形式が用意されています。設定ファイルのformtypeの値を「mail」にすると、メールボックス検索用の入力フォームになります。なお、メールボックスの検索を高速化するには、以下のように属性インデックスを張っておくとよいでしょう。

estcmd create -attr subject str -attr from str -attr @mdate seq -attr @size seq casket

お洒落な入力フォームはJavaScriptによって実現されているので、JavaScriptをサポートしないブラウザを想定する場合には使わない方がよいでしょう。

クエリ展開

「go/went/gone/going」「man/men」「歩く/歩い(た)」のような活用や、「center/centre」「F-1/F1」「プロキシ/プロクシ」のような表記揺れや、「lady/madam/gentlewoman」「侍/武者/武士」のような類義語を考慮した検索ができると便利です。例えば、「go」で検索すると、「went」や「gone」や「going」を含む文書もヒットするということです。それには、「go」という語が入力された際に、それをアプリケーションが「go OR went OR gone OR going」というクエリに展開すればよいことになります。

estseek.confqxpndcmdにコマンドラインを指定することで、任意のコマンドを呼び出すクエリ展開を行うことができます。指定したコマンドには、環境変数ESTWORDの値として、検索語が渡されます。検索フレーズに複数の語が指定された場合は、各語に対応してコマンドが複数回呼び出されます。呼び出されたコマンドは、クエリ展開した結果の語を改行区切りで出力します。そのような動作をするコマンドを作っておけば、好きなようにクエリ展開を行うことができます。

WordNetという英語のシソーラスを用いて類義語のクエリ展開をするためのコマンドestwnetxpndが「/usr/local/share/hyperestraier/filter」の中にインストールされています。WordNetをインストールした上で、estwnetxpndの絶対パスをqxpndcmdの値として設定すると使えるようになります。

estcmd extkeys」でキーワードを抽出してある場合は、「estcmd words -kt」で関連語の一覧をダンプすることができます。出力はTSV形式です。第1フィールドはキーワードの文字列で、第2フィールドはその語の頻度です。第3フィールド以降には、関連語の文字列とそのスコアが交互に現れます。この出力をもとにデータベースを作成し、それをクエリ展開のコマンドで利用するとよいでしょう。

裏技

属性条件の入力欄に「gstep=1」などとすると、N-gramの検査精度を一時的に変えられます。同様に「tfidf=true」または「tfidf=false」とすると、TF-IDF法の有効無効を一時的に変えられます。「scan=true」または「scan=false」とすると、検索フレーズの精密検査の有効無効を一時的に変えられます。

検索結果の経過時間表示の右側に「*」マークがつくことがあります。これは、インデックス内に削除文書の情報がたくさんあることによって検索処理が非効率になったことを意味しています。頻繁にこれがでるようになったら、インデックスの最適化を行ってください。


表示用CGIスクリプト

ここでは、表示用CGIスクリプトestproxy.cgiの詳細な仕様を説明します。これを使うと、Googleのキャッシュ機能のように、検索語の部分をハイライトして表示することができます。

構成と機能

estproxy.cgiが動作するには、estproxy.confという設定ファイルが必要です。設定ファイルの名前はCGIスクリプトの接尾辞を.confに変えたものです。

estproxy.cgiは「/usr/local/libexec/estproxy.cgi」としてインストールされていますので、それをコピーして利用してください。また、設定ファイルのサンプルが「/usr/local/share/hyperestraier/estproxy.conf」としてインストールされていますので、それをコピーして修正すると楽です。

estproxy.cgiは、CGIスクリプトとして動作するプロクシです。すなわち、Web上の任意の文書のURLをパラメータとして与えると、ユーザの代理としてその文書のデータを取得し、適当な加工を施した上で、その結果を表示します。取得すべき文書のURLは「url」という名前のパラメータとして指定します。HTML以外のメディアタイプの文書もHTMLに変換して表示するのが特徴です。さらに、「word1」から「word32」までの名前のパラメータによって、ハイライトすべき語句を指定することができます。

対応するプロトコルは、HTTPとFILEです。「http://」で始まるURLを指定すると、HTTPプロトコルを用いてそのコンテンツを取得します(今のと頃HTTPSには対応していません)。「file://」で始まるURLを指定すると、estproxy.cgiが動作するファイルシステム上のファイルを直接読み込んで処理します。この仕組みによって、サーバ上の任意のファイルの内容を加工して表示することができます。

対応するファイル形式は、プレーンテキスト(text/plain)とHTML(text/html)とMIME(message/rfc822)です。それ以外の形式の場合でも、任意の外部フィルタで加工することによって処理することができます。

設定ファイルの書式

設定ファイルは、変数名と値を「:」で区切った形式の行を並べたものです。「#」で始まる行はコメントとして無視されます。デフォルトでは、設定ファイルは以下のような内容になっています。

#replace: ^http://localhost/{{!}}file:///home/mikio/public_html/
allowrx: ^http://
#allowrx: ^file://
denyrx: /\.
passaddr: 1
limitsize: 32
urlrule: \.est${{!}}text/x-estraier-draft
urlrule: \.(eml|mime|mht|mhtml)${{!}}message/rfc822
typerule: ^text/x-estraier-draft${{!}}[DRAFT]
typerule: ^text/plain${{!}}[TEXT]
typerule: ^(text/html|application/xhtml+xml)${{!}}[HTML]
typerule: ^message/rfc822${{!}}[MIME]
language: 0
shownavi: 1

それぞれの変数の機能を以下に示します。

allowrxdenyrxの判定は、replaceを適用した結果に対して行なわれます。allowrxdenyrxは記述した順番に解釈されます。正規表現における英字の大文字と小文字は区別されません。

応用例:HTMLのハイライト表示

estseek.cgiの検索結果のページに、該当文書のハイライト表示のリンクをつけてみましょう。estseek.cgiと同じ場所にestproxy.cgiestproxy.confも置いてください。あとは、estseek.cgiに以下の記述をするだけでOKです。

...
dispproxy: estproxy.cgi
...

日本語のページの文字コード認識の精度を向上させるためには、「language: 1」も指定するとよいでしょう。また、加工済のページの冒頭にあるナビゲーションバーが不要な場合は、「shownavi: 0」にしてください。

応用例:メールの表示

estseek.cgiによるメールボックスの検索システムで検索の該当文書を表示する際には、該当文書のタイトルからのリンク先と「[disp]」のリンク先の双方にestproxy.cgiを使ったページのURIを指定すると便利です。ここでは、estseek.cgiestproxy.cgiが同じ場所に設置してあり、メールボックスのデータは「/home/mikio/Mail」の下にあるものとします。その場合、estseek.confには以下のように記述してください。

...
replace: .*/Mail/{{!}}estproxy.cgi?url=file:///home/mikio/Mail/
...
dispproxy: [URI]
...

セキュリティ上の理由から、estproxy.confのデフォルトの設定では「file://」によるアクセスは許可していませんので、以下の用に記述してメールボックスの中身のみを表示できるようにしてください。

...
allowrx: ^file:///home/mikio/Mail/
...

日本語のメールの文字コード認識の精度を向上させるためには、「language: 1」も指定するとよいでしょう。なお、もし「allowrx: file://」とやってしまうとサーバ上の全てのファイルが公開されることになるので気をつけてください。


インデックスの構造

ここでは、Hyper Estraierのインデックスの詳細な構造について説明します。補助インデックスや属性インデックスを用いて検索を高速化する方法についても説明します。

基本的な構造

インデックスのディレクトリの中には以下のファイルやディレクトリが格納されます。

2階層転置インデックス

中核となるデータベースは_idxです。これは転置インデックスまたは転置ファイルといわれるデータベースであり、ある語を検索キーにして、その語を含んだ文書の一覧を探す機能を提供します。全ての登録文書に表れる全ての語の出現情報を保持しているので、転置インデックスのサイズはとても大きなものになります。

_auxは補助転置インデックスと呼ばれる、登録文書のキーワードのみの出現情報を記録した転置インデックスです。キーワードのみに対象を絞っているので、データベースのサイズが小さく、精度の高い検索結果を生成できる利点があります。その反面、全ての語を保持しているわけではないので、検索漏れが発生する可能性があります。

検索が行われた際には、まず補助転置インデックスに対して検索を行い、そこで十分な件数の結果が得られた場合はその時点で結果を提示します。そこで十分が件数が得られなかった場合はさらにメインの転置インデックスを検索し、その結果を提示します。これにより、大抵の場合は高速に高精度の結果を返すことができますし、検索漏れが起こることもありません。

キーワードデータベースと類似検索

類似検索を実行すると、候補の各文書の本文を取り出してキーワードを計算してから比較するので、とても時間がかかります。登録文書のキーワードを予め計算してデータベースに記憶しておけば、類似検索を高速に行うことができます。キーワードデータベースはそのためのデータベースです。

estseek.confにおけるsmlrvnumの値は類似検索の際に抽出するキーワードの数を意味しますが、キーワードデータベースを利用する場合にはその値は無視されます。

キーワード抽出

estcmd gatherで文書を登録しただけではキーワードの抽出は行われないので、補助転置インデックスやキーワードデータベースは空のままです。estcmd extkeysを実行すると、キーワードを抽出して補助インデックスとキーワードデータベースに登録します。この操作を行わなくても動作に支障はありませんが、検索速度を上げるためにはぜひやっておいてください。特に類似検索と類似隠蔽の速度が劇的に向上します。キーワードの選択にはTF-IDF法を用いますので、インデックスを構築する最後の手順で行った方が精度が安定します。したがって、extkeysを含めたインデックスの更新手順は以下のようになります。

estcmd gather -cl -il ja -sd -cm casket .
estcmd purge -cl casket
estcmd extkeys casket

抽出されるキーワードの数のデフォルト値は32個です。「-kn」オプションで抽出数は変更できます。増やすとデータベースが大きくなりますが、検索精度は向上します。逆に減らすとデータベースは小さくなりますが、検索精度は低下します。文書ドラフトに予めキーワードを埋め込むには、%VECTOR制御命令を用いてください。

デフォルトでは、estcmd extkeysはTD-IDFのための文書頻度(DF)のデータを全てメモリ上に展開するので、搭載メモリが少ない環境ではメモリ不足になることが考えられます。その場合は、予めDFのデータを外部データベースに保存しておいて、それを使ってestcmd extkeysを実行するとよいでしょう。以下のようにしてください。

estcmd words -dfdb mydfdb casket
estcmd extkeys -dfdb mydfdb casket

分かち書きの利用

キーワードを抽出するために分かち書き器を使うようにすることもできます。estcmd extkeysを実行する際に「-um」オプションをつけると、字種による分かち書きが行われます。つまり、文字を空白、英数字、漢字、平仮名、片仮名、ハングル、それ以外の記号に分類し、それぞれの連続した部分を単語として切り出します。

estcmd extkeys -um casket

日本語用の形態素解析器MeCabを分かち書きに利用することもできます。Hyper Estraierをビルドする前の設定で「./configure --enable-mecab」として、Hyper EstraierにMeCabを組み込んでおくと、字種による分かち書きの代わりにMeCabが使われます。

なお、形態素解析によるキーワード抽出ではTF-IDFによるスコアの調整は不要ですので、文書の登録とキーワードの抽出を同時に行っても精度を保つことができます。以下のようにします。

estcmd gather -cl -sd -cm -kn 32 -um casket .

-kn」は抽出するキーワードの数を指定して、「-um」は形態素解析器を利用することを指定します。文書の登録時にキーワードも登録した場合、estcmd extkeysを実行する必要はありません。ただし、大規模なサイトのインデックスを初期構築する場合、キーワード抽出なしでestcmd gatherを実行してから、estcmd extkeysでキーワードを抽出する方が、全体としての時間は短くなります。差分登録の際には文書登録とキーワード抽出を同時に行った方が高速です。

属性インデックス

属性検索は属性データベースにおける全てのレコードを検査するために多くの時間がかかります。属性インデックスを作成すると、検査するレコードを絞り込むことによって属性検索を高速化することができます。属性インデックスはestcmd createコマンドで作成します。「-attr」オプションで対象となる属性名とデータ型を指定します。例えば@title属性にシーケンシャル型のインデックスを張り、@author属性に文字列型のインデックスを張り、@size属性に数値型のインデックスを張るには、以下のようにしてインデックスを作成します。

estcmd create -attr @title seq -attr @author str -attr @size num casket

シーケンシャル型の属性インデックスは、文書IDをキーにして属性値を値に持つ構造です。検索時には全てのレコードが検査されますが、属性データベースよりは高速に属性検索が行えるようになります。また、型に依存しないという利点と、ソートも高速になるという利点があります。文字列型の属性インデックスは、昇順(辞書順)の文字列をキーとして文書IDを値に持つ構造です。文字列型の演算子の一部(STREQSTRBWSTROREQ)がとても高速化されます。それ以外の文字列型の演算子もやや高速化されます。数値型の属性インデックスは、昇順の数値をキーとして文書IDを値に持つ構造です。数値型の演算子の一部(NUMEQNUMGTNUMGENUMLTNUMLENUMBT)がとても高速化されます。それ以外の数値型の演算子もやや高速化されます。ひとつの属性に指定できるインデックスはひとつだけです。なお、属性インデックスを張ると文書の更新や削除の処理は少し遅くなります。

文字列型と数値型の属性インデックスが張られている属性に対しては、その値の上位を取得するランキング検索を行うことができます。ランキング検索は、検索フレーズが「[RANK]」で始まっている場合に行われます。「[RANK]」の後ろには、取得する件数と対象の属性名を空白で区切って指定します。例えば、文書のサイズが小さいものから10件を取得するには、「[RANK] 10 @size」と指定します。件数が負数の場合は、順序が降順として扱って絶対値の件数を取得します。ランキング検索は属性検索式でなく検索フレーズに指定することに注意してください。全文検索とランキング検索を同時に行うことはできません。

疑似インデックス

文書ドラフトを特定のフォルダに入れておくと、そのフォルダを疑似的なインデックスとして扱い、その中にある文書ドラフトを検索対象に含めることができます。疑似インデックスの検索はgrepと同様の逐次探索で行なわれるので、本当のインデックスに比べてかなり遅いですが、インデックスを作る必要がないというのが便利なところです。疑似インデックスのディレクトリが「/tmp/pindex」であったとすると、以下のようにしてそれを検索対象に加えることができます。

estcmd search -pidx /tmp/pindex casket "unix AND linux"

疑似インデックスを検索対象に加えた場合、本当のインデックスと疑似インデックスのメタ検索が行なわれます。疑似インデックスのみを対象として検索する場合は、空のインデックスとのメタ検索を行なってください。疑似インデックスは複数個指定することもできます。estseek.cgiで疑似インデックスを検索対象に加える場合、estseek.confに「pseudoindex: /tmp/pindex」といった設定を加えてください。

本当のインデックスに文書を登録する際には、各文書を別個のコネクションで登録するよりも、沢山の文書を1回のコネクションで登録した方が効率的です。したがって、登録すべき文書がある程度の量になるまでは疑似インデックスに入れておき、ある程度の量になったら疑似インデックスの中の文書ドラフトを本当のインデックスに登録して、疑似インデックスを空にするという運用方法も検討する価値があるでしょう。


助言

ここでは、アプリケーションとしてのHyper Estraierを活用するためのコツをいくつか紹介します。

大規模なインデックスの構築

文書を登録する処理では、インデックスの内部で持っているデータベースに膨大な量の書き込みを行います。データベースを参照するオーバーヘッドを抑えるために、Hyper Estraierは処理中のデータをメモリ上にキャッシュする仕組みを持っています。キャッシュが大きい方が登録処理は高速になりますが、スワップが起きるとかえって効率が落ちますので、実メモリの4割程度の大きさにするとよいようです。例えば1GBの実メモリを搭載しているマシンで作業をする場合、400MB程度が適切でしょう。また、10万件以上の文書を登録する場合、インデックスを作成する際に大規模用のチューニングをするように指定すると処理効率が向上します。

estcmd-csオプションを使うとキャッシュサイズの指定ができます。サイズはメガバイト単位で指定します。デフォルトは64MBです。また、-xlオプションや-xhオプションを使うと大規模用のチューニングがなされます。つまり、以下のようにして文書を登録するとよいでしょう。

estcmd gather -cl -il ja -xl -sd -cm -cs 400 casket .

インデックスの最大サイズはおおよそ300GBです。また、対象文書がプレーンテキストの場合、インデックスのサイズは対象文書の容量の50%から200%程度になります。HTMLであれば25%から100%程度です。したがって、一つのインデックスに登録できる文書の総量の目安は、プレーンテキストなら300GB、HTMLなら600GBといったところです。なお、インデックスのサイズは、小さい文書が多数あるよりも、大きい文書が少数ある方が小さくなります。また、日本語の文書よりも英語の文書の方が小さくなります。

100GBを越えるインデックスで補助インデックスを利用する場合、補助インデックスのサイズが2GBを越えてデータベースの更新に失敗する可能性があります。その場合は、ビルド前の設定で「./configure --enable-vista」として、Vistaデータベースを組み込んでください。

可用性の確保

インデックスを更新している最中にはロックがかかるので、そのインデックスを使った検索はその間はできなくなります。検索システムとしては、その間は停止時間ということになります。それを避けるためには、インデックスのコピーに対して更新を処理を行い、完了したらオリジナルと入れ換えるようにするとよいでしょう。また、インデックスの更新中に不意にシステムが停止するなどしてインデックスが壊れた場合も、複製に対する更新であれば問題がないので安心です。

上述の処理を自動化するには、以下のようなスクリプトを書いておくとよいでしょう。冒頭のexit文は、複製が既に存在している場合(以前の更新に失敗するとそうなります)に処理を停止するようにしています。途中のexit文では、更新したインデックスが壊れた場合に処理を停止するようにしています。

test -e /home/www/casket-copy && exit
cp -R /home/www/casket /home/www/casket-copy
/usr/local/bin/estcmd gather -il ja -sd -cm /home/www/casket-copy /home/www/public_html
/usr/local/bin/estcmd purge /home/www/casket-copy
/usr/local/bin/estcmd extkeys /home/www/casket-copy
/usr/local/bin/estcmd optimize /home/www/casket-copy
/usr/local/bin/estcmd inform casket-copy || exit
rm -rf /home/www/casket
mv /home/www/casket-copy /home/www/casket

実際のところ、estcmd search-nlオプションを指定したり、estseek.conflockindexの値をfalseにしたりすれば、更新中でロックされているインデックスに対しても検索を行うことができます