FreePWINGで長い検索語を受け付けるようにする

木曜日, 2月 15 2007 @ 09:34 午前 JST

投稿者: kazuhiro

FreePWINGでは、JIS X 4081の規格上の制限から検索語は(全角文字で)127文字までとなっています。 それ以上の文字数の検索語を登録しようとするとエラーになるので、回避するにはプログラム側で検索語を切り詰めて短くする等の処理が必要になります。 しかし、

  1. 正確な文字数はFreePWINGの内部処理とほぼ同等の正規化を行わないと分からない。

  2. 前方一致検索用に後ろを切りつめた検索語と後方一致検索用に前を切りつめた検索語の二種類の検索語を登録する必要がある。

  3. ドキュメント上に公開されている手段では前方一致検索(あるいは後方一致検索)インデックスのみに検索語を登録する手段が無い。

等の問題があります。特に三番目に関しては意図しないヒットの原因にもなります。 そこで、FreePWINGの方を変更する事にしました。 長い検索語を登録しようとした場合、前方一致検索インデックスと条件検索インデックスには後ろを切り詰めて、後方一致インデックスには先頭を切りつめて登録するようになります。

--- BaseWord.pm.org	2004-05-29 10:29:05.000000000 +0900
+++ BaseWord.pm	2007-02-15 09:11:35.813811200 +0900
@@ -38,7 +38,7 @@
 #
 # 単語の最大長。
 #
-$max_word_length = 255;
+$max_word_length = 254;
 
 #
 # 単語の書き込み方向
@@ -250,11 +250,6 @@
 	$self->close_internal();
 	return 0;
     }
-    if (255 < length($fixed_word)) {
-	$self-> = "too long word";
-	$self->close_internal();
-	return 0;
-    }
 
     #
     # インデックスの方向が負だったら、単語の前後をひっくり返す。
@@ -263,6 +258,10 @@
 	$fixed_word = pack("n*", reverse(unpack("n*", $fixed_word)));
     }
 
+    if ($max_word_length < length($fixed_word)) {
+      $fixed_word = substr($fixed_word, 0, $max_word_length);
+    }
+
     #
     # 単語エントリをファイルへ書き込む。
     #

上記のパッチを文字コードはEUC-JP、改行コードはLFにして保存し、FreePWING 1.4.4の配布物にあるsrc/BaseWord.pmに適用して下さい。

タグ:FreePWING

コメント (0件)


Kazuhiro's blog
http://ikazuhiro.s206.xrea.com/article.php/20070215093427273