Link

全文一致検索のカスタマイズ

全文一致検索において、漢字の異体字を同一視(包摂みたいなもの)する方法

とても面倒です。

  • 同一視する文字のグループと、代表となる文字を決めます。 例えば、
    {鴎, 鸥, 鷗}、代表=鴎
    {万, 萬}、代表=万
    

    どの二つのグループも互いに素でなければなりません。

  • 代表となる文字以外と、代表となる文字の組を作ります
    鸥 鴎
    鷗 鴎
    萬 万
    
  • 各文字を、Unicodeのコードに変換します。
    9e25 9d0e
    9dd7 9d0e
    842c 4e07
    
  • 1列目で最も大きいコードを見つけます。 この例なら、9e25。これを、MAXとします。

  • (0から数えて)MAX行あるファイルを作ります。 (0から数えて)n行目は、先ほどの表の1列目に数 n が現れるなら、その対応する2列目の値、 そうでなければ 0 にします。 数は、0xで始めて16進法で記述するか、0で始めて8進法で記述するか、1-9で始めて10進法で記述します。 16進法もしくは10進法で記述するとデバッグしやすいでしょう。混在させても構いません。 各行は , (コンマ)で終えます。最後の行の後のコンマはあってもなくても構いません。 /* … */ 形式のコメントも入れられますが、コメント中に多バイト文字をいれられるかどうかは お使いの環境に依存します(gccはUTF-8には文句を言わないみたい、VC++はUTF-8だと文句を言いますが、結局は通してくれます)。

例:

  (最初の行は0行目と数える)
  0,
  0,
  0,
  (0x842a行省略、次の行は(0から数えて 0x842c行目))
  0x4a07, /* 鸥 => 鴎 */
  ...
  (次の行は0x9dd7行目)
  0x9d0e,
  ...
  (次の行は0x9e25行目、普通に1から数えると0x9e26行目という事になる)
   0x9d0e,
  • このファイルを、eshk.hという名前で保存します。

  • eshk.hをおいたディレクトリをconfigureに伝えます。 例えば、/tmp/eshk.h を作成したのだとすると、

    ./configure --with-eshkdir=/tmp; make; make install
    
  • itbの先頭で、eshkを有効にする事を指定します

    @title=test
    $ioptions=collapse-eshk
    i0
    #title=森鷗外
    b1森鷗外
    !森鷗外
    
  • 全文一致検索の問い合わせのオプションに、collapse-eshkを指定します

    <search options="collapse-eshk">
      <join><p>鴎外</p></join>
    </search>
    

おわり。