higuchi.com blog

The means justifies the ends

実験中 [Nucleus の記事を Hyper Estraier に登録する方法]

[PR] 本ブログの商品紹介リンクには広告が含まれています

ちょっと思うところがあって、このブログの記事を全文検索エンジンである Hyper Estraier のインデックスに放り込んで、キーワード抽出してみたり、関連記事検索をしてみたり、という実験をごそごそやっています。

Hyper Estraier には、ファイルシステム上のテキストや HTML などのファイルを一括でインデックスに登録するツールは付属しているのですが、ご存じの通りここで使っているブログシステムの Nucleus は、記事データをファイルではなく MySQL などのデータベース上に保存しているので、付属のツールは使えません。

Web を検索してみたら、Livedoor の中の人が同じようなことを行ったメモ(Hyper Estraier で検索)を公開してくれていて、それをほんのちょっとだけ書き換えたら簡単にできちゃいましたので、そのコードをお裾分け。

#!/usr/local/bin/perl
use strict;use DBI;
use Readonly;
use Encode;
use DateTime::Format::MySQL;

Readonly my $datasources => [ 'dbi:mysql:nucleus', 'ユーザー名', 'パスワード' ];
Readonly my $base_dir => "/tmp";
Readonly my $node_path => "$base_dir/casket/";
Readonly my $ESTCMD => "/usr/local/bin/estcmd";
Readonly my $DRAFT_FORMAT => <<'END_DRAFT'
@uri=http://www.higuchi.com/item/%d
@title=%s
@cdata=%s+09:00

%s
%s
END_DRAFT
;

## create node
system( ESTCMD, "create", $node_path )
unless -d $node_path;

## indexing
my $entries = get_entries();
for my $entry (@$entries) {
do_estcmd("put", {
entry => $entry,
opts => [qw(-cl)],
}, \&_mk_draft);
}
do_estcmd("extkeys", { opts => [qw(-um)] });

sub build_estcmd {
my ( $subcmd, $opts ) = @_;
my $cmd = join( ' ', $ESTCMD, $subcmd, @$opts, $node_path );
return $cmd;
}

sub do_estcmd {
my ($subcmd, $params, $callback) = @_;
my $command = build_estcmd($subcmd, $params->{opts});
open( CMD, "| $command" ) || die $!;
print CMD $callback->($params->{entry}) if $callback;
close( CMD );
}

sub _mk_draft {
my $entry = shift;
my $dt = DateTime::Format::MySQL->parse_datetime( $entry->{itime} );
my $input = sprintf( $DRAFT_FORMAT,
$entry->{inumber}, $entry->{ititle}, $dt, $entry->{ibody}, $entry->{imore} );
return $input;
}

sub get_entries {
my $dbh = DBI->connect( @{$datasources},
{ RootClass => "DBIx::ContextualFetch" } )
or die $DBI::errstr;
$dbh->do("set names utf8");
my $sql = qq{SELECT * FROM nucleus_item WHERE idraft=0};
my $sth = $dbh->prepare($sql);
$sth->execute;
my $entries = $sth->fetchall_hash;
$sth->finish;
$dbh->disconnect;
return $entries;
}

1;
__END__

コメント

まだコメントはありません

コメントを書く

関連するかもしれない記事

直帰率対策 [関連記事へのリンクを自動生成]

先日ちょっとためした Nucleus の記事データを Hyper Estraier で検索する実験の副産物で、このブログの...

この記事を読む »

迷子よけ [パンくずリスト]

このBlogのデザインを定義している“スキン”を少しいじって、ページのアタマに、いわゆる“パンくずリスト...

この記事を読む »

検索エンジンとの付き合い方 [mod_rewriteの術]

blogをサイトの「上のほう」の階層に置くようになってから、Googleをはじめとする検索エンジンのロボッ...

この記事を読む »

改築中 [DokuWikiの日本語化]

ここ1ヶ月ほど、higuchi.comのサーバーを少しずつアップグレードしています。旧サーバーではNucleusを日...

この記事を読む »

TypePad AntiSpam ステッカー

読者プレゼント [NP_TypePadAntiSpam]

先日の続きです。 シックス・アパートの無料コメントスパム除けサービス《TypePad AntiSpam》を Nucl...

この記事を読む »

Nucleus の終わりと始まり [LMNucleus 3.66]

higuchi.com を10数年にわたって支えてきたブログシステムの Nucleus CMS が、開発終了を宣言してし...

この記事を読む »

寄ってらっしゃい [Google Sitemaps]

このところ、Yahoo!の新検索エンジンであるYSTのクローラー(インターネット上のページをリンク伝いに読...

この記事を読む »

アップデート [Nucleus 日本語ランゲージファイル]

Nucleusの日本語ランゲージファイルをアップデートしました。ご指摘をいただいていた誤訳や意味の分かり...

この記事を読む »

ベータ版 [Nucleus v2.5対応 日本語ランゲージファイル]

しばらく、忙しさにかまけてBlogシステムの改良をさぼっていたら、本家Nucleusサイトでは新バージョンで...

この記事を読む »

Joiもすなるblog [Nucleus に日本語を通してみよう]

「今さら何を」と言われそうですが、Joi に触発されて、blog (Weblog)に興味を持ちはじめました。いわゆ...

この記事を読む »