検索結果をアクセスランキング順にソートする方法(2)2006年03月23日 10時59分31秒

NMZ.field.accessrank に各文書のアクセス数があれば、アクセスランキング順にソートできることを(1)で示しました。
(2)では、NMZ.field.accessrank を作成する方法をしめします。

キーとして NMZ.field.uri を、値はアクセス数でSDBMで管理することにします。
SDBM から NMZ.field.accessrank を生成するには、次に示すdbupdate.pl を使います。
dbupdate.pl はインデックスのあるディレクトリで実行します。


#!/usr/bin/perl

use Fcntl;
use SDBM_File;
use Config;

my $flags = O_CREAT | O_RDWR | BINARY();

tie( %dbhash, 'SDBM_File', 'NMZ.sdbm.accessrank', $flags, 0666)
        or die "Cannot open database $!";

chmod 0666, 'NMZ.sdbm.accessrank.dir', 'NMZ.sdbm.accessrank.pag';

my $nmz_uri = "NMZ.field.uri";
my $nmz_access_rank = "NMZ.field.accessrank";

open(NMZ_URI, "< $nmz_uri") || die "Cannot open file $!";
binmode NMZ_URI;

open(NMZ_ACCESS_RANK, "> $nmz_access_rank.$$.tmp")
        or die "Cannot open file $!";
binmode NMZ_ACCESS_RANK;

open(NMZ_ACCESS_RANK_I, "> $nmz_access_rank.i.$$.tmp")
        or die "Cannot open file $!";
binmode NMZ_ACCESS_RANK_I;

chmod 0666, "$nmz_access_rank.$$.tmp", "$nmz_access_rank.i.$$.tmp";

my $offset = 0;
while(my $uri = <NMZ_URI>) {
    my $count;

    chomp $uri;
    if (exists($dbhash{$uri})) {
        $count = $dbhash{$uri};
    } else {
        $count = 0;
    }

    printf NMZ_ACCESS_RANK "%-10d\n", $count;
    print NMZ_ACCESS_RANK_I pack('N', $offset);

    $offset += 11;
}

close(NMZ_ACCESS_RANK_I);
close(NMZ_ACCESS_RANK);

rename("$nmz_access_rank.$$.tmp", "$nmz_access_rank");
rename("$nmz_access_rank.i.$$.tmp", "$nmz_access_rank.i");

close(NMZ_URI);

untie( %dbhash );

sub BINARY {
    return O_BINARY if $Config{osname} =~ /^(MS)?Win/;
}

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://namazu.asablo.jp/blog/2006/03/23/300315/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。