namazu-ml(avocado)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 正規表現での検索



古川です。

>> On Wed, 17 Jun 1998 14:37:19 +0900, Satoru Takabayashi <ccsatoru@xxxxxxxxxxxxxxxxxx> said:
  >>> 名古屋案内でもしましょうか :-)。
  >> 子供を家内 (およびその親戚) に押しつけて、自分は大須の電気街へ、という
  >> 夢のような計画を、現在たくらんでいるところです。
  > なるほど。ではその計画が成功した暁には大須で落ち合いましょう :-)。

たぶん行けそうな感じです。
6/27(Sat) なんですが、高林さんの御都合はいかがでしょうか?

# ついでに、安い PC Shop も教えてください。


  >> /[ア-オ]/
  >> とやっても、
  >> /[\xa5\xa2-\xa5\xaa]/
  >> と解釈されてしまうため、これを
  >> /(\xa5[\xa2-\xaa])/

  > うむむ。 J のつかない Perl ではその辺が厳しいのですよね。どうして
  > も限界があるし。

それと、書き忘れましたが、2 byte 目と、次の文字の 1 byte 目のペアでマッ
チしてしまうのを防ぐため、パターンを /(\xa5[\x22-\x2a])/ のように変換し、
侯補となる単語も 2 byte 目の bit 7 を落としてから、=~ するようにしてい
ます。


>> On Wed, 17 Jun 1998 19:13:33 +0900, Satoru Takabayashi <ccsatoru@xxxxxxxxxxxxxxxxxx> said:
  > 小さいインデックスだとうまくいくでしょうか?

  > # 私のところでは正常に正規表現で検索できているのですが他のところで
  > # はうまくいかないのかな?

私は pnamazu ばかり使って、今まで正規の namazu をあまり使っていなかった
のですが、昨日から試してみた範囲では、正常に検索できているように思います。

当然ながら、perl 版よりもずっと高速に。


>> On Thu, 18 Jun 1998 19:05:39 +0900, Satoru Takabayashi <ccsatoru@xxxxxxxxxxxxxxxxxx> said:
  >> mknmz でつくった NMZ.w は重複している単語があるようですね.
  > うーむ。これは困りました。きっと太陽のせいでしょう :-)。
  > …ではなくて、私のところでは再現できないので原因をつきとめるのは難
  > しいです。満月の夜にインデックスを作ると失敗するのかもしれません。
  > もう少し調べてみます。
  > どなたか何か思い当たる点があれば教えてください。


実行してコードを追ったわけではないので、はずしているかもしれませんが…
put_index の FOO ループの中で、


      FOO:
        while (<INDEX>) {
ここで単語を読んで
            $i++;

            $current_word = $_;
            chop $current_word;

            read(INDEX, $n, $INTSIZE);
ここで個数を読んで

            $nn = unpack("I", $n);
            read(INDEX, $baserecord, $INTSIZE * $nn);
ここで個数分だけ読んで

            <INDEX>;
これはいいんでしょうか?

            for (; $cnt <= $#words; $cnt++) {
                # SunOS4 + Perl5.003 などでは文字列の比較が正しくないので
                # unsignedcmp を呼び出す
                unless (($UnsignedCmp 
                     ? (unsignedcmp($words[$cnt], $current_word) <= 0)
                     : ($words[$cnt] le $current_word))) {
                    last;
                }
                $n = &get_n($KeyIndex{$words[$cnt]});
                $record = substr($KeyIndex{$words[$cnt]}, $INTSIZE);

                if ($current_word eq $words[$cnt]) {
ここの if 文に引っかからないと

                    $n += $nn;
                    $n = pack("I", $n);

                    $_ = "$current_word\n$n$baserecord$record\n";
                    print TMP_W "$current_word\n"
                        unless ($NoRegexpIndexOpt);
                    print TMP_I;
                    &indexingmisc($current_word, \$hash_ptr,
                                  \$hash_count, \$key_count, length($_));

                    $cnt++;
                    next FOO;
                }
                else {
                    $n = pack("I", $n);
                    $_ = "$words[$cnt]\n$n$record\n";
                    print TMP_W "$current_word\n"
                        unless ($NoRegexpIndexOpt);
ここで TMP_W に書いて、
                    print TMP_I;
                    &indexingmisc($words[$cnt],  \$hash_ptr,
                                  \$hash_count, \$key_count, length($_));
                }
            }
ヘタをして for ループを抜けてしまうと

            $nn = pack("I", $nn);
            $_ = "$current_word\n$nn$baserecord\n";
            print TMP_W "$current_word\n"
                unless ($NoRegexpIndexOpt);
ここでも TMP_W に書いてしまわないでしょうか?



コードを表面的にしか見ていないので、はずしている可能性は大ですが、とも
かく

  > どなたか何か思い当たる点があれば教えてください。

ということで…


# ところで、cgi 実行のときにも、QUERY_STRING に 'debug=1' とか書いてあ
# ると debug 情報が出るようにしておくと、リモートデバッグみたいなこと
# ができて便利だと思います。

-- 

                                        ヤマハ(株)ピアノプレーヤ設計課
                                                              古川 令
                                             furukawa@xxxxxxxxxxxxxxxx