スクリプツ・ラボ ホームページ > N-gram検索エンジン MindSearch > オンラインマニュアル > MindSearchFuzzyマニュアル


開発関連ツールの使い方



msctrl(デーモン制御)

 msctrl はMindSearchデーモンを停止させたり、共有メモリのロードを行なわせるなど、各種指示を行なうツールです。
 引数無しで起動すると起動方法を以下のように表示します。
      -----------------------------------------------------------------
      Usage: msctrl [-hHOST] [-pPORT] [-mN] { stop | search @SYM PATH.. |
          load [@SYM] PATH.. | reload PATH.. | reloadsub PATH.. |
          unload {@SYM|PATH..} | list | suspend | resume }
              -hHOST  ホスト名(デフォルト=localhost)
              -pPORT  ポート番号(デフォルト=3580)
              -m[N]   モニタ指定(デフォルト=0、N省略は1)
              --      起動方法を表示(今表示しているもの)
      -----------------------------------------------------------------

      stop:  MindSearchデーモンを停止させます。
             停止要求を出すだけで直ちにリターンするため、実際の停止までには
             さらに数秒の時間がかかります。

      load:  インデックスパス群、あるいは検索パスシンボルを指定し、インデッ
             クスを共有メモリにロードします。
             インデックスパスには末端フォルダ(mainA, subA といったもの)は
             付けません。主・副両方のインデックスを持つ場合にはデーモンが自
             動判定して共にロードします。
             既にロード済みのインデックスを指定すると次に示す reload と同じ
             機能となります。

      reload:前記のloadと同じですが、既にロードされている場合には一旦解放
             してからロードをし直します。

      reloadmain:
             主・副両方のインデックスを持つ場合であってもあえて主インデック
             スのみをロードします。

      reloadsub:
             副インデックスのみをリロードします。差分インデックス作成をおこ
             なった後で使います。

      unload:
             指定したインデックスデータを共有メモリから破棄します。
             (デーモンが停止する際には自動的にすべての共有メモリが解放され
             るため、本コマンドで一つ一つを解放する必要はありません)

      list:  現在ロードされているインデックスパスを標準出力に列挙します。
             1行毎に、基幹インデックスパス、主フォルダ、副フォルダの順。
             (例)
             $ msctrl list
             @symeiga /home/foo/msfuzzy/sample/indexes/eiga
             @symeigaDB /home/foo/msfuzzy/sample/indexes/eigaDB
             /home/foo/msfuzzy/sample/indexes/eiga mainA
             /home/foo/msfuzzy/sample/indexes/eigaDB mainA subA

      suspend:
             MindSearchのListenポートを閉じて新しい接続を停止します。
             既にコネクションを張っているクライアントが存在する場合には、
             それらすべてが終了するのを待ってからリターンします。

      resume:
             前記 suspend によって閉じてしまったMindSearchのListenポートを
             再度開きます。
 load, reload, unload の系統のパラメータ指示ではインデックスパスの指定が伴いますが、そのパスは末端フォルダ(mainA, subA といったもの)は含めません。どの末端フォルダを使うかはMindSearchデーモンが自動計算します。

インデックスのロード方法

 検索を行うには予めインデックスを共有メモリにロードしておく必要があります。その意味で msctrl によるロード機能と検索処理とは密接に関係があります。
 インデックスのロードは二段構えで行います。最初に検索パスシンボルとインデックスパス(群)との対応を登録し、次いでその検索パスシンボルを指定することでインデックス(群)の共有メモリへのロードを行います。

---
 load 指定は検索パスシンボルとインデックスパス群との対応を登録し、次いでそれらのインデックスをロードします。インデックスが既にロードされている場合には既存の情報を破棄して再ロードを行います。つまり通常あれば初回ロードも再ロードもどちらも load を使って構いません。
 パラメータの指定方法は複数ありますが、以下はよく使われる例です。
    (シンボル登録+ロード: 単一インデックス)
      $ msctrl load @symeiga sample/indexes/eiga

    (シンボル登録+ロード: 複数インデックス)
      $ msctrl load @twoindex sample/indexes/ eiga tokkyo
 後者の形式を例にとり補足します。
 @twoindex は検索パスシンボルです。@はコマンドの文法上必要な記号でシンボル自体ではありません。
 シンボルの後方に続くインデックスパス群はインデックスのパスを列挙したものです。上記は結果として以下の検索パスシンボルとインデックスを指定したことになります。
      ---------------------------------------
      検索パスシンボル: twoindex

      検索対象インデックス:
                        sample/indexes/eiga
                        sample/indexes/tokkyo
      ---------------------------------------
 複数のインデックスの指定は、単にそれらのパスを列挙しても良いのですが、本例では短縮形式を使っています。すなわち、まずベースとなるパスを指定することで起点を指示し、次にそこからの相対パスを列挙することで複数パスの指定を短い記述でおこなえます。
 前記例のインデックス指定部のみ抜き出すと以下のようになります。
      sample/indexes/ eiga tokkyo
 上記にはトークンが三つあります。第一トークンの末尾には'/'記号が付加されていますが、これは「起点」の指定であることを表します。第二トークンと第三トークンはその起点からの相対パスを二つ指定したことになります。結果として、
      sample/indexes/eiga
      sample/indexes/tokkyo
の二つのインデックスを指定したことになります。この例で展開されたパスは相対パスですが、MindSearchインストール時のベースパスが補充され最終的に絶対パスとなります。
 上記例では起点パスを相対パスで書いています。この場合にはMindSearchベースパス(msfuzzy/直下)からの相対と解釈されます。(都合、二重の相対計算がおこなわれます)。もちろん絶対パスで起点パスを記述しても構いません。
 また、パス群の途中で起点の切り直しをすることもできます。つまり起点パス指定は何回も使えます。

---
 search 指定は検索パスシンボルとインデックスパス群との対応を登録するだけの機能です。登録を抹消する機能も備えます。以下が操作例です。
    (シンボル登録)
      $ msctrl search @twoindex sample/indexes/ eiga tokkyo

    (シンボル抹消)
      $ msctrl search @twoindex
 search でシンボル登録だけを行った後のインデックスロードは別途 load 指定で行います。この場合の loadではインデックスパスだけあるいは検索パスシンボルだけを指定します。以下の2例は等価です。
    (ロードのみ(1))
      $ msctrl load @twoindex

    (ロードのみ(2))
      $ msctrl load sample/indexes/ eiga tokkyo
---
 unload 指定はメモリにロードしたインデックスを解放します。インデックスパスだけあるいは検索パスシンボルだけを指定します。以下は例です。
    (アンロードのみ(1))
      $ msctrl unload @twoindex

    (アンロードのみ(2))
      $ msctrl unload sample/indexes/ eiga tokkyo
 上の二つは似ていますが、前者の場合には、検索パスシンボルも同時に抹消され、後者ではシンボルは温存されるという違いがあります。
 特別に「unload all」を指定することにより、現在ロードされている全インデックスを解放できます。
    (すべてアンロード(シンボル登録も抹消))
      $ msctrl unload all

APIを使ってインデックスをロードする方法

 API経由でloaderと通信することで(msctrlを操作することなく)アプリケーションから直接にインデックスのロード処理を行うことがてきます。
 APIの使い方は通常の対デーモン(msdaemon)通信と同じですが、接続先ポートがloaderの通信ボートである3582である点が異なります(3580ではありません)。通信にはMindSearch付属の通信ドライバも使えます。(通信ドライバはポートを外から指定する仕様となっているため共通に使えます)
 API経由での操作に限らないことですが、MindSearchのローダにコマンドを送る場合、現在通信中のすべての MindSearch 派生プロセスが終了するまで待たされることに注意してください。他の派生プロセスが共有メモリ内のインデックス情報をアクセス中にメモリ内容を変更してしまうことを避けるためですが、逆に、長時間接続したままのアプリケーションが存在した場合には本APIもまたずっと待たされるので注意が必要です。開発段階では msclient などを使って手動で通信し接続したままにすることがありますがそれも待ちの原因となります。
 loaderが受け付けるコマンドはmsctrlのコマンドのうち、インデックスファイルのロード/アンロード関係のコマンドとまったく同じ文法になっています。
[コマンド]
  load [@SYMBOL] PATH1 PATH2..
  unload [@SYMBOL] PATH1 PATH2..
  search @SYMBOL PATH1 PATH2..
  reload [@SYMBOL] PATH1 PATH2..
  reloadsub [@SYMBOL] PATH1 PATH2..

[レスポンス]
  OK:
  または
  NG:<エラーメッセージ>
 msclient を使うとAPIレベルでのloaderとの通信の様子を確認できます。msclientのポート明示を使うことで(msdaemonではなく )loaderと対話を行います。以下は対話例です。
      -----------------------------------------------------------------------
      $ msclient -p3582 search.hist        ←msclientの起動(注:ポート番号明示
      msclient: start           ↑履歴ファイルは何でも構わない
      msclient: Host:localhost Port:3582
      "search.hist"を履歴ファイルとして読み込みます。
      MindSearchエンジンとの対話開始
      
      load sample/indexes/eiga             ←loadコマンドの発行
      send=load sample/indexes/eiga
      recv=OK:                             ←ローダからのレスポンス
      
      quit                                 ←msclientの終了(通信対象が違うので
      msclient: exit                         "FIN"は送出しないでください)
      -----------------------------------------------------------------------


freeshm(共有メモリの状況表示・解放)

 MindSearch Fuzzy はSystem V IPCの共有メモリ機能を使っています。したがって、現在の共有メモリ消費を調べたり削除するのは ipcs や ipcrm でおこなうことができますが、MindSearchの freeshm というプログラムを使うのが便利です。
 freeshm の起動方法は以下のようになっています。
      -----------------------------------------------------------------
      Usage: freeshm [-pPORT] list|delete [KEY]
              - KEYを指定する場合は 08 から始めてください。
                (先頭からの部分一致となります)
              - KEYが無指定の場合はMindSearch共有メモリすべて。
              - MindSearchデーモン/クライアント動作中はdeleteしないでください。
      -----------------------------------------------------------------
 -pPORT によるポート番号指定を行う場合、msdaemon起動時のポートに合わせてください(3580, 3584, 3588 .. のように4つ置きの数字を指定)。デフォルトポート以外を指定した場合、共有メモリのキーベース値も連動して変化します。

 list 指定により現在の共有メモリ消費を調べられます。以下のように表示されます。
      $ freeshm list
         1: 08001001
         2: 08014001
         3: 08014002
         4: 08014003
         5: 08014004
         6: 08024001
         7: 08024002
         8: 08024003
         9: 08024004
        10: 08028001
        11: 08028002
        12: 08028003
        13: 08028004
 表示される8桁の数字は16進数で、獲得された共有メモリのキーを表します。見方は以下の通りです。
            08------   "08"は固定でMindSearch Fuzzy(Ver3)によるものを示します
                       -pPORT による指定を行った場合、08, 18, 28, .. と変化します

            --00----   この00はMindSearchデーモンが自分のために獲得した
                       もので、デーモンが上がっている限り存在します。

            --01----   最初のインデックスのロードによるものです
            --02----   二番目のインデックスのロードによるものです

            ----1---   共通固定域の消費です
            ----4---   主インデックス用の消費です
            ----8---   副インデックス用の消費です
            ----c---   ソート情報をマージした領域です(複数index横断で使う)

            -----999   メモリブロックごとの通し番号です。一つのインデックス
                       で複数のブロックを消費します。
 delete 指定により共有メモリを削除できます。共有メモリの破棄は通常はMindSearchデーモンが(msctrlからの指示により)自らおこなうため普通は使う必要のないものですが、たとえば異常事態やkillでプロセス終了させられた等により万が一共有メモリが残ってしまった場合に freeshm コマンドで破棄するようにしてください。
 以下は操作例です。
      $ freeshm delete
         1: 08001001
         2: 08014001
         3: 08014002
         4: 08014003
         5: 08014004
         6: 08024001
         7: 08024002
         8: 08024003
         9: 08024004
        10: 08028001
        11: 08028002
        12: 08028003
        13: 08028004
      Delete?(y/n):y
 なお、これは freeshm コマンドに限らず ipcrm コマンドでも同様ですが、共有メモリを何らかのプロセスがアタッチしている場合にはそのプロセスが終了するまでは実際の破棄はおこなわれません。
注:共有メモリ獲得時のパーミッションは600になっているため、MindSearch起動者以外のアカウントからは見ることができません。


msclient(標準対話プログラム)

 msclient はコンソール上でMindSearchコアと直接に対話し、動作を確認するためのサンプルプログラムです。ちょっとした実験をおこなったりスクリプトの文法を確認するのにその都度アプリケーションを組む必要がないので便利に使えます。
 msclient は基本的には、キー入力したテキストをスクリプトとしてMindSearchに送出し、逆にMindSearchから受信したレスポンスをそのままコンソールに表示するものですが、それ以外に多少の付加機能が組み込まれています。たとえばデーターベースからのインデックス作成をエミュレートする機能などがあります。

 起動方法は以下のようになっています(単純起動するとUsageを表示できます)。
      -----------------------------------------------------------------
      Usage: msclient [-hHOST] [-pPORT] [-eARG1:ARG2:..] [-exec] HISTFILE
              -hHOST    ホスト名(デフォルト=localhost)
              -pPORT    ポート番号(デフォルト=3580)
              -eARG1:ARG2:..    ヒストリファイル内の文字列置換指定
              -exec     起動と同時にヒストリファイル内容を自動実行
              HISTFILE  使用するヒストリファイル名
      -----------------------------------------------------------------
 msclientは起動時に「ヒストリファイル」と呼ぶファイルを読み込みます。
 ヒストリファイルはキー入力を簡単にするためのテンプレートのようなものと思ってください。MindSearchのインストール時には以下の3種類のヒストリファイルが scripts/ ディレクトリに入っています(scripts/ ディレクトリをワークディレクトリとして使うことを想定しています)。
      makeindex.hist         インデックス作成に使う
      makeindexDB.hist       データーベースのインデックス作成に使う
      makeindexDBfull.hist   同上、
      search.hist            インデックス検索に使う(perlclient, javaclientでも共用)
      searchHere.hist        sample/indexes下を検索するための便利なもの
 さらに、上記のヒストリファイルを指定しつつ、msclientを起動する簡便なスクリプトとして以下のものも入っています。
      mak.sh                 インデックス作成用スクリプト
      makDB.sh               同上(データーベースモード用)
      makDBfull.sh           同上(データーベースモード用)
      makWEB.sh              同上(Webコンテンツをファイルから作成するため)
      sch.sh                 検索テスト用スクリプト
 msclientに関連した以下のページも参考にしてください。

        「サンプルのデータ/プログラム」−「インデックスを作成してみる」
        「インデックス作成」−「ファイルからのインデックス作成に msclient をアプリとして使う」



msstat(稼動状態表示)

 msstat はMindSearchの稼働状態を表示するツールです。
 起動方法は以下のようになっています。
      -----------------------------------------------------------------
      Usage: msstat [-hHOST] [-pPORT] [-mN] [-cN] [--help]
            -hHOST  ホスト名(デフォルト=localhost)
            -pPORT  ポート番号(デフォルト=3580)
            -mN     モニタ指定(デフォルト=0、N省略は1)
            -cN     通信モニタ指定(デフォルト=0、N省略は1)
            --help  起動方法を表示(今表示しているもの)
      -----------------------------------------------------------------
 上記のように起動オプションは msdaemon と同様です。
 最も簡単な起動は引数を何も付けずに単純起動する方法です。Port:3580で稼働しているMindSearchコアと通信がおこなわれ、次のように表示されます。
      -----------------------------------------------------------------
      $ msstat
      msstat: Host:localhost Port1:3580 Port2:3581 Port3:3582
      ----------現在のMindSearch稼働状態(Port=3580)----------
      現在接続数=2 累積接続数=2 過去最大同時接続数=2
      接続最新時刻=00:18:01 過去最長接続時間=00:00:00
      インデックス作成中接続数=0 累積インデックス作成数=2
      インデックス作成最新時刻=00:18:18 過去最長インデックス作成時間=00:00:16
      -----------------------------------------------------------------
 上記のように、指定されたポートで稼働しているMindSearchについて、現時点での接続数や、累積された接続数、いままで最も長い接続時間やインデックス作成時間といった各種情報をこれから得ることができます。
 シェルスクリプトを組み、msstat を定期的に走らせ、その出力をファイルにリダイレクトすることで稼働状態の時間経過をログとして出力することも可能です。

注:msstatが表示する情報は、走行中のlockdaemon(msdaemonの子プロセス)の内部メモリ上に存在するものです。これは揮発性であり、デーモンを停止させるとすべて消えてしまうので、特に統計情報を見たい場合にはご注意ください(定期的に走らせると良いという意味はそこにもあります)


msindexinfo(インデックスファイルの情報表示)

 msindexinfo は、MindSearchが生成したインデックスファイルについて重要な情報を表示するものです。(インデックスファイルはその多くがバイナリであるため、エディタで開いて眺めることができません)
 起動方法は以下のようになっています。
      -----------------------------------------------------------------
      Usage: msindexinfo [-N] INDEXDIR
              N=0     インデックス情報のみを表示
              N=n     インデックス情報のほかにドキュメント情報をn個表示
      -----------------------------------------------------------------
 インデックスファイルの存在するディレクトリを指定します。
 次は実行例です。
      -----------------------------------------------------------------
      (カレントディレクトリを msfuzzy/sample/indexes/ として以下を操作)

      $ msindexinfo -2 sample/indexes/eiga
      
          /home/foo/msch/msfuzzy/sample/indexes/eiga/mainA
          ==ドキュメントプロパティ==
          マーク=0x46 ('F'=0x46であるはず)
          状態=2 (0:アイドル 1:ビジー 2:完了)
          エンディアン=0 (1:BigEndian; 本マシンのBigEndian=0)
          文字種=E ('S'jis , 'E'uc , 'J'is のいずれか)
          フェーズ数=10
          ドキュメント数=6 グループ数=1 グループ端数=6 グループ要素数=100000
          主副識別コード=1
          物理ファイル=1 (0:データベースから生成 1:ファイルから生成)
          IndexVersion=63
          許可ProgVer最低/最大=63/64 拒否ProgVer最低/最大=00/00
          BasePath/DB名=/home/foo/msch/msfuzzy/sample/texts
          上位URL=
          作成日時=2009-05-30 15:10
          作成時の検索正規化フラグ  =061A
          作成時のカタカナ正規化レベル=1
          作成時のカタカナ正規化フラグ=0000003F
          ソートキー数=1 ソートキータイプ=D 絞り込みキータイプ=R---
          正規化グループサイズ=5932
          TotalDocuments=6
          DocNo=1
          Doc毎ORGコンテンツ位置=00000000H サイズ=00000262H
          無効フラグ=0
          Doc毎ソートキー=20031218010204
          Doc毎ファイル名=[eiga/eiga4.txt]
          Doc縮正規化コンテンツ位置=00000000H サイズ=00000258H 先頭サイズ=00000000H
          Doc縮絞り込みキー=20031218 0 0 0
          DocNo=2
          Doc毎ORGコンテンツ位置=00000262H サイズ=000001EEH
          無効フラグ=0
          Doc毎ソートキー=20031215010202
          Doc毎ファイル名=[eiga/eiga2.txt]
          Doc縮正規化コンテンツ位置=00000258H サイズ=000001DAH 先頭サイズ=00000000H
          Doc縮絞り込みキー=20031215 0 0 0
      -----------------------------------------------------------------
 上記のように、指定されたインデックスディレクトリの状態やプロパティを表示します。既に作成したインデックスファイルが、どのようなパラメータで作られたの情報を後になってから知ることができます。
 オプションで -n (nは任意の数値) を指定すると、インデックスに含まれる最初からn件分のファイルやレコードの管理情報を見ることができます。(上記では n=2 としているので最初の2ファイルを詳細表示しています)
 インデックスディレクトリの指定には、「mainA」のような末尾フォルダ名を付けても付けなくても構いません。付ければそのフォルダ(A系/B系、main/sub)のみを、付けない場合には同居するすべてのフォルダを表示します。



mscancelindex(インデックス作成の中止)

 このプログラムは現在進行中のインデックス作成を中止させるために使います。
 起動方法は以下のようになっています。
      -----------------------------------------------------------------
      Usage: mscancelindex [-hHOST] [-pPORT] [-mN] [-cN] [--]
              -hHOST  ホスト名(デフォルト=localhost)
              -pPORT  ポート番号(デフォルト=3580)
              -mN     モニタ指定(デフォルト=0、N省略は1)
              -cN     通信モニタ指定(デフォルト=0、N省略は1)
              --      起動方法を表示(今表示しているもの)
      -----------------------------------------------------------------
 上記のように起動オプションは msdaemon, msstop といった他のツールと同じです。
 最も簡単な起動は引数を何も付けずに単純起動する方法です。Port:3580で稼働しているMindSearchコアと通信がおこなわれ、もしそのコアがインデックス作成中であればそれをキャンセルさせます。
 なお、インデックス作成に入ってすぐのタイミングは既存のインデックスの削除処理をおこなっており、この期間はキャンセルが受け付けられないのでしばらくお待ちください。(数分待つこともあります)




Copyright(C) 2000-2009 Scripts Lab. Inc.