(2791)
2791:
サイト内/掲示板の検索強化
投稿者:
konno
2008/01/03(木) 23:45
コメント数 3
コンテンツ、ログがどんどん増える一方で記憶力がどんどんあやしくなって
きているので、必要な情報を探し出すのがどんどん大変になってきています。
そこで、まずはトップページにサイト内検索を実装してみました。
検索エンジンは、とほほさんのサイトの wwwsrch.cgi を使用しました。
http://www.tohoho-web.com/soft/wsrch.htm
ほとんどここの説明通りで出来ますが、うちは @nifty なので、wwwsrch.cgi は
cgi-bin のフォルダに入れます。そしてその中身の設定は
# ★ 検索対象フォルダ
$target_dir = '../homepage/';
これでホームページ内を検索できます。
# ★ [戻る]ボタン
$return_url = '../homepage/index.html';
# URL置換を行う
# $target =~ s|○○○|△△△|;
$target =~ s|../homepage/|http://homepage3.nifty.com/tamaneko|;
あと、350行目あたりにヒット行表示を追加しました。あまり正確ではないですが、
目安にはなるでしょう。
print "$target</a> )\n";
}
print " $i行目 \n"; #ヒット行表示
print "<dd>";
修正はこれだけです。
これでサイト内の検索が使えるようになりました。\(^^)/ やったぁ
でもページが少ないのであんまり役に立たないかも。(ぉぃ
めざらさんやとしきさんのところぐらいあれば便利に使えそうに思うんですがねぇ。
(^^;
長くなるので掲示板のほうは別にしよう。
- No.2791 -
このTreeへ
[リストへもどる]
pre
(2791)
2794:
掲示板の検索機能強化
投稿者:
konno
2008/01/04(金) 23:10
2791 番 konno さんへのコメント コメント数 1
さて、こんどは掲示板の検索強化ですが、実はこちらの方がメインだったりします。
この掲示板には元々ワード検索機能がありますが、簡易的なもので、色々不満が
有ります。キーワードが大文字小文字区別とか、全ログの検索が出来ないとか。
そこで、としきさんのサイトの永続的URL対応の改造
http://toshiki.la.coocan.jp/computer/itabei/url.html
と、とほほさんのサイトの wwwsrch.cgi を参考にしてやってみました。
wforum.cgi の955行あたり?
# 検索フォーム #
sub find {
から、まずは全ログ検索の為に表示件数を増やします。
print "</select> 表\示:<select name=view>\n";
# foreach (10,15,20,25,30) {
foreach (10,20,40,60,100) { # 100件まで増やす
# 検索実行 #
sub search {
# ファイルを読み込み
$i=0;
# ==== ここから ===
$flag2=0;
while ($flag2 == 0) {
@new=();
# 過去ログの場合
if ($in{'act'} eq "past") {
# ログファイルを定義
if ($in{'pastlog'}) {
$count = $in{'pastlog'};
} else {
open(NO,"$nofile") || &error("Open Error: $nofile");
$count = <NO>;
close(NO);
}
$logfile = sprintf("%s%04d\.cgi", $pastdir,$count);
}
# ここまでとしきさんの永続的URL対応の改造からコピペで追加
open(IN,"$logfile") || &error("Open Error: $logfile");
$top = <IN> if ($mode ne "past");
while (<IN>) {
$flag=0;
foreach $wd (@wd) {
if ($wd =~ /[\x80-\xff]/) { #キーワードが漢字なら
if (index($_,$wd) >= 0) { $flag=1; } #オリジナルの検索
} else { #そうでないなら
if ($_ =~ /$wd/i) { $flag=1;} #英数文字列用検索
}
if ($flag == 1) {
ここは wwwsrch.cgi を参考にして英数文字列なら大文字小文字を区別しないように
追加しました。あとは全ログ検索の後半部分の追加。
close(IN);
# ==== ここから ===
if ($in{'act'} ne "past") {
$in{'act'} = "past";
}
if ($in{'pastlog'}) {
$in{'pastlog'} = $in{'pastlog'} - 1;
if ($in{'pastlog'} == 0) {
$flag2=1;
}
} else {
open(NO,"$nofile") || &error("Open Error: $nofile");
$in{'pastlog'} = <NO>;
close(NO);
}
}
# ここまで追加
# 検索終了
これで全ログを大文字小文字同一視検索できるようになりました。\(^^)/ やったぁ
大文字小文字同一視はあくまで簡易的な実装なので、AND での絞込み検索では関係
無い記事も表示されることがありますが、今までに比べて非常に便利になりました。
Web Forum系ならこれだけの修正で格段に使い勝手がよくなるので是非みなさんも
やってみてください。というか、やってほしいなぁ。(^^;
ところで、大文字小文字を区別するオプションとかあった方が良いという人
いるかなぁ。
- No.2794 -
このTreeへ
コメント元:2791 へ
[リストへもどる]
pre
(2791)
2816:
Re: 掲示板の検索機能強化
投稿者:
としき
2008/01/10(木) 13:31
参照先:http://toshiki.la.coocan.jp/
2794 番 konno さんへのコメント コメント数 1
> さて、こんどは掲示板の検索強化ですが、実はこちらの方がメインだったりします。
ついでというか、ちょっと要望。
もしかしたら検索時だけではないような気もしますが、検索時に気がついたとい
う事でこちらに書かせていただきます。
例えば、掲示板の検索で、「検索」「強化」をAND検索した場合。
引用部分が、色が変わっていない発言もあれば、色変更が引用部分を突き抜けて
しまっているものもあったりします。ここら辺、なんとかならんものでしょうか。
- No.2816 -
このTreeへ
コメント元:2794 へ
[リストへもどる]
pre
(2791)
2818:
Re^2: 掲示板の検索機能強化
投稿者:
konno
2008/01/12(土) 00:36
2816 番 としき さんへのコメント
> 例えば、掲示板の検索で、「検索」「強化」をAND検索した場合。
> 引用部分が、色が変わっていない発言もあれば、色変更が引用部分を突き抜けて
> しまっているものもあったりします。ここら辺、なんとかならんものでしょうか。
う〜む、これはたぶん引用処理のバグなんでしょうね。検索ルーチンでは
if ($refcol) {
$msg =~ s/([\>]|^)(>[^<]*)/$1<font color=\"$refcol\">$2<\/font>/g;
}
この辺を追いかけてみれば何か分かるかなぁ。
- No.2818 -
このTreeへ
コメント元:2816 へ
[リストへもどる]
pre
(2791)
2806:
掲示板の検索機能強化2
投稿者:
konno
2008/01/07(月) 01:28
2791 番 konno さんへのコメント コメント数 1
さて、全ログを検索できるようになると、検索件数が多くなります。
そのために、一度に表示する件数を増やしましたが、どうも使い勝手が
よくないですね。表示件数を増やすとページが長くなりすぎるし、少ないと
ページめくりが大変です。そこで、ページ切り替え部分を拡張しました。
標準では、
検索結果:52件 [前の10件] [次の10件]
という表示で、この場合6回ページをめくらなければならず、今何ページ目かも
分かりません。そこで、この部分を以下のように改造しました。
検索結果:52件 [前の10件] 1 [2] 3 4 5 6 [次の10件]
見て分かるように、分割数ぶんだけ数字表示のリンクを作り、各ページに直接
ジャンプできるようにしました。現在のページは、[ ] でくくってわかりやすく
しています。
改造部分は、
# 検索終了 の下
if ($back >= 0) {
print "[<a href=\"$script?mode=$mode&page=$back&word=$enwd&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\">前の$in{'view'}件</a>] \n";
}
# ここから
$h = $i / $in{'view'} +1 ;
if ($h > 1) {
$p = 0;
for ($j=1;$j<$h;$j++){
if ($page == $p) {
print " <a href=\"$script?mode=$mode&page=$p&word=$enwd&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\">[$j]</a>\n";
} else {
print " <a href=\"$script?mode=$mode&page=$p&word=$enwd&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\"> $j </a>\n";
}
$p = $p + $in{'view'};
}
}
# ここまで追加
if ($next < $i) {
これだけです。これで掲示板の検索機能強化は完成です。非常に便利になりましたよ。
みなさんも是非やってみてください。これで掲示板が即情報のデータベースとして
使えるようになりました。\(^^)/
・・・でもここの皆さんはログを落としてVZで検索したほうがもっと便利だから
あまり反応が無いかも。(;_;)
- No.2806 -
このTreeへ
コメント元:2791 へ
[リストへもどる]
pre
(2791)
2807:
Re: 掲示板の検索機能強化2
投稿者:
としき
2008/01/08(火) 00:10
参照先:http://toshiki.la.coocan.jp/
2806 番 konno さんへのコメント コメント数 1
> ・・・でもここの皆さんはログを落としてVZで検索したほうがもっと便利だから
そんなことはありません。
ただねぇ、ここのデフォルトの検索アルゴリズムはログの仕様に適合していない
という話があって。確か、昔、めざらさんのところの掲示板だっけ、話題になっ
たことがあったと思います。どういう事かというと、改行をまたがる検索ができ
ないね、ということ。実際に試してみればすぐにわかりますよね。
確か、改行またがりの検索ってVzでも面倒ですよね。
というか、コマンドラインでwgrep使った方がずっと楽。
これがいやでめざらさんは、なるべく改行を入れないようにする、とか言ってい
たし、私の方はgoogleの検索を使えばいい、なんて事を言い出す始末。でも、私
の主張したgoogle検索っていうのもデメリットがあって、投稿してから2〜3日
経たないとgoogleのデータベースに反映されないので、直近数日分の発言が検索
の網の目から漏れてしまうのです。
ま、とにかく、主張した手前、自分のところにはgoogle検索をつけてみました。
まさに「取ってつけた状態」で、自分でもあまりよい状況だとは思っていません。
とりあえず、お試しください。
- No.2807 -
このTreeへ
コメント元:2806 へ
[リストへもどる]
pre
(2791)
2808:
Re^2: 掲示板の検索機能強化2
投稿者:
konno
2008/01/09(水) 00:20
2807 番 としき さんへのコメント コメント数 1
> ただねぇ、ここのデフォルトの検索アルゴリズムはログの仕様に適合していない
> という話があって。確か、昔、めざらさんのところの掲示板だっけ、話題になっ
> たことがあったと思います。どういう事かというと、改行をまたがる検索ができ
> ないね、ということ。実際に試してみればすぐにわかりますよね。
そういえば以前そんな話題が有りましたね。確かに機械的に桁折した文章だと
そういう問題がありますが、私はなるべくきりのいいところで改行するように
心掛けているので、あまり気にしていませんでした。
> 確か、改行またがりの検索ってVzでも面倒ですよね。
> というか、コマンドラインでwgrep使った方がずっと楽。
wgrepって改行跨ぎ検索できましたっけ? 正規表現ですか。
> これがいやでめざらさんは、なるべく改行を入れないようにする、とか言ってい
> たし、私の方はgoogleの検索を使えばいい、なんて事を言い出す始末。でも、私
> の主張したgoogle検索っていうのもデメリットがあって、投稿してから2〜3日
> 経たないとgoogleのデータベースに反映されないので、直近数日分の発言が検索
> の網の目から漏れてしまうのです。
そうなんですよね。私も最初はgoogle検索を入れれば良いかなと思ったんですが、
最近の記事が漏れると言うのがなんだかなぁ、と思い直して、CGIにしたのでした。
> ま、とにかく、主張した手前、自分のところにはgoogle検索をつけてみました。
> まさに「取ってつけた状態」で、自分でもあまりよい状況だとは思っていません。
> とりあえず、お試しください。
試してみました。従来の検索画面に併設したんですね。試しに、「ポケ3 vz」で
検索すると199件も拾ってくれます。これはいいですね。同じキーワードで従来の
検索では、0件でした。「VZ」を大文字にすると13件出たので、やはりgoogle検索
は強力ですね。この併設方式はよさそうですねぇ。実は私はgoogle検索の入れ方が
わからなくて、CGIにしたというのが本音なのですが、この検索ページのソースから
切り貼りすれば出来るのかなぁ。
う〜む、$msg から改行を取り去って検索すれば良さそうな気がしてきました。
気が向いたらやってみようかな。
あれ?そういえばやしきの検索は無いようですが?そのうちに付くのかな。
- No.2808 -
このTreeへ
コメント元:2807 へ
[リストへもどる]
pre
(2791)
2810:
Re^3: 掲示板の検索機能強化2
投稿者:
としき@宿直
2008/01/09(水) 03:59
参照先:http://toshiki.la.coocan.jp/
2808 番 konno さんへのコメント コメント数 1
> wgrepって改行跨ぎ検索できましたっけ? 正規表現ですか。
オプション -s を使えば、改行またぎ検索の有無を指定できます。
> あれ?そういえばやしきの検索は無いようですが?そのうちに付くのかな。
多分、つかないと思います。その可能性が高いです。
- No.2810 -
このTreeへ
コメント元:2808 へ
[リストへもどる]
pre
(2791)
2813:
Re^4: 掲示板の検索機能強化2
投稿者:
konno
2008/01/10(木) 00:00
2810 番 としき@宿直 さんへのコメント
> オプション -s を使えば、改行またぎ検索の有無を指定できます。
そんなオプションがあったとは全然知りませんでした。今までログを検索するのに
改行跨ぎを意識したことが無いという事ですね。(^^;
> > あれ?そういえばやしきの検索は無いようですが?そのうちに付くのかな。
> 多分、つかないと思います。その可能性が高いです。
残念。隠されたお宝を家捜ししようと思ったのに。(^^;
- No.2813 -
このTreeへ
コメント元:2810 へ
[リストへもどる]
pre
(2791)
2821:
掲示板の改行跨ぎ検索
投稿者:
konno
2008/01/12(土) 00:56
2791 番 konno さんへのコメント コメント数 1
> う〜む、$msg から改行を取り去って検索すれば良さそうな気がしてきました。
> 気が向いたらやってみようかな。
ということでやってみたら簡単に出来ました。(^_^)
foreach $wd (@wd) {
$msg2 = $_; #改行跨ぎ用
$msg2 =~ s/
//g; #改行削除
$msg2 =~ s/ //g; #空白削除
$msg2 =~ s/ //g; #全角空白削除
if ($wd =~ /[\x80-\xff]/) { #キーワードが漢字なら
# if (index($_,$wd) >= 0) { $flag=1; } #オリジナルの検索
if (index($msg2,$wd) >= 0) { $flag=1; } #オリジナルの検索+跨ぎ
} else { #そうでないなら
# if ($_ =~ /$wd/i) { $flag=1;} #英数文字列用検索
if ($msg2 =~ /$wd/i) { $flag=1;} #英数文字列用検索+跨ぎ
}
これでほぼ実用的な改行跨ぎ検索が出来たと思います。(^_^)
といってもロクにテストして無いのですが、興味のあるかたは試して見てください。
m(__)m
- No.2821 -
このTreeへ
コメント元:2791 へ
[リストへもどる]
pre
(2791)
2824:
Re: 掲示板の改行跨ぎ検索
投稿者:
としき
2008/01/13(日) 14:45
参照先:http://toshiki.la.coocan.jp/
2821 番 konno さんへのコメント コメント数 1
> これでほぼ実用的な改行跨ぎ検索が出来たと思います。(^_^)
ダウト。
検索画面を開くと、次のような表示があります。
> ・複数のキーワードを入力するときは半角スペースで区切って下さい。
この仕様は守られていますか?
例えば、AND検索を指定しても、一番最初の単語しか検索してくれていないような
気がします。
- No.2824 -
このTreeへ
コメント元:2821 へ
[リストへもどる]
pre
(2791)
2827:
Re^2: 掲示板の改行跨ぎ検索
投稿者:
konno
2008/01/14(月) 01:01
2824 番 としき さんへのコメント コメント数 1
> ダウト。
> 検索画面を開くと、次のような表示があります。
> > ・複数のキーワードを入力するときは半角スペースで区切って下さい。
> この仕様は守られていますか?
> 例えば、AND検索を指定しても、一番最初の単語しか検索してくれていないような
> 気がします。
げげ、ほんとだ!! ・・・どうやら改行跨ぎ以前にバグっていたようです。
条件分岐が複雑になると難しいですね。フラグを追加して対処してみました。
foreach $wd (@wd) {
$flag1=0; #flag1追加
$msg2 = $_; #改行跨ぎ用
$_ =~ s/
//g; #改行削除
# $msg2 =~ s/ //g; #空白削除
# $msg2 =~ s/ //g; #全角空白削除
if ($wd =~ /[\x80-\xff]/) { #キーワードが漢字なら
if (index($_,$wd) >= 0) { $flag1=1; } #オリジナルの検索
# if (index($msg2,$wd) >= 0) { $flag1=1; } #オリジナルの検索+跨ぎ
} else { #そうでないなら
if ($_ =~ /$wd/i) { $flag1=1;} #英数文字列用検索
# if ($msg2 =~ /$wd/i) { $flag1=1;} #英数文字列用検索+跨ぎ
}
$_ = $msg2; #記事を戻す
if ($flag1 == 1) {
$flag=1;
if ($in{'cond'} eq 'OR') { last; }
} else {
$flag1=0;
if ($in{'cond'} eq 'AND') { $flag=0; last; }
}
}
if ($flag) {
泥縄ですが、一応うまくいってるように見えます。
- No.2827 -
このTreeへ
コメント元:2824 へ
[リストへもどる]
pre
(2791)
2828:
Re^3: 掲示板の改行跨ぎ検索
投稿者:
としき
2008/01/14(月) 11:54
参照先:http://toshiki.la.coocan.jp/
2827 番 konno さんへのコメント コメント数 1
> げげ、ほんとだ!! ・・・どうやら改行跨ぎ以前にバグっていたようです。
> 条件分岐が複雑になると難しいですね。フラグを追加して対処してみました。
原文というかオリジナルのソースコードも見ていないし、コード全体を検討した
わけでもないので大ハズシかもしれませんが、なんか直感的におかしい気がした
ので指摘させていただきます。
#ゴーストがささやくのよ
> if ($flag1 == 1) {
> $flag=1;
> if ($in{'cond'} eq 'OR') { last; }
> } else {
> $flag1=0;
> if ($in{'cond'} eq 'AND') { $flag=0; last; }
> }
字下げの問題は別にして。
else節のなかで、flag1を再設定していますが、これは必要なのですか?
flag1の取りうる値の範囲がよくわかっていないのですけれど、flag1!=1の場合に
flag1を0に再設定しているという事は、flag1が2とか3とかって値を取りうると
いう事ですよね。それは正しいのですか?
- No.2828 -
このTreeへ
コメント元:2827 へ
[リストへもどる]
pre
(2791)
2829:
Re^4: 掲示板の改行跨ぎ検索
投稿者:
konno
2008/01/15(火) 00:11
2828 番 としき さんへのコメント コメント数 1
> else節のなかで、flag1を再設定していますが、これは必要なのですか?
> flag1の取りうる値の範囲がよくわかっていないのですけれど、flag1!=1の場合に
> flag1を0に再設定しているという事は、flag1が2とか3とかって値を取りうると
> いう事ですよね。それは正しいのですか?
はい、間違いです。必要有りませんでしたね。取っても動作は変りませんでした。
どつぼにはまってたので、念のために入れていたんですね。(-_-;
#う〜ん、としきさんの目は何でも見通すフォルスの目なのか。決してスルーしないと。
すでに義体化ずみとか?(^^;
- No.2829 -
このTreeへ
コメント元:2828 へ
[リストへもどる]
pre
(2791)
2830:
Re^5: 掲示板の改行跨ぎ検索
投稿者:
としき@まだ会社
2008/01/15(火) 08:11
参照先:http://toshiki.la.coocan.jp/
2829 番 konno さんへのコメント コメント数 1
> はい、間違いです。必要有りませんでしたね。取っても動作は変りませんでした。
> どつぼにはまってたので、念のために入れていたんですね。(-_-;
念のために入れる、というのは正しい行いだと思います。
私が気になったのは、if節、およびelse節の中のifでは
「flag」
が設定されていたのに、このelse節のみ
「flag1」
が設定されていたからなのでした。
- No.2830 -
このTreeへ
コメント元:2829 へ
[リストへもどる]
pre
(2791)
2832:
Re^6: 掲示板の改行跨ぎ検索
投稿者:
konno
2008/01/16(水) 01:03
2830 番 としき@まだ会社 さんへのコメント
> 私が気になったのは、if節、およびelse節の中のifでは
> 「flag」
> が設定されていたのに、このelse節のみ
> 「flag1」
> が設定されていたからなのでした。
一番の問題は紛らわしい変数名にしたことかも。機能追加で2重検索のように
なったので、この部分のヒットフラグを flag1 とし、flag1 が立ったら本来の
flag を立てて、flag1 を 0 に戻す。という流れで考えたのですが、もっと
スマートなやり方があるんだろうなぁ。
- No.2832 -
このTreeへ
コメント元:2830 へ
[リストへもどる]
pre