Blog

Published on

RSS

Text内検索

検索オプション付き検索フォーム

Text内検索実装。

結局また自分で作ってます。

まだデザインを含めてこちょこちょ弄るかもしれないけど、ひとまず実用レベルになったので公開。Textのサイドバーに検索窓が戻ってきた。

残念ながらサイト内検索とは連携がとれていないので、Text内検索はText内のみ、サイト内検索はText以外のコンテンツのみ、となっています。


現在はBlog検索を拡張し、全サイト内を検索できるよう改良されています。

Namazuはどうした

最初サイト内検索と合わせてNamazuを使おうと思ってたし、そうTextにも書いたのだが、色々調べると、Namazuはそんな思うほど良いものではないことがわかった。

まず、そんなに超高速とかサーバ負荷が軽いというわけではないらしい。数万ページに対応できるのはやはりそのとおりなのだが、別にヴォルフロは数百ページだ。アクセス数も少ないし。Namazuよりも現在サイト内検索で使っているmsearchの方が高速なこともあるらしい。

そして、PHPファイルとかの検索は上手くできないので、結局wgetかなんかで整形済みのページを作ってそれを元にインデックスを作らないといけない。これだと、例えば "ALFEE" なんて検索ワードで検索をしたらグローバルメニューが引っかかって全部のページが引っぱり出されてしまう。もしかしたら回避策はあるのかもしれないが、なんか色々調べないといけなそう。

と、このヴォルフロッシュのあるレンタルサーバのXREAではNamazuのPHPモジュールがデフォルトでは使えないらしい。サポートに頼むとなんとかしれもらえるみたいだが、今のサーバが使えるようになってるかは謎。

とにかく、「なんかめんどくさそーだな」というのが印象。それに、Textに関して言えば、個別記事だけ検索に引っ掛けて月別とか年間リストとか無視したい。せっかくタグとか付けてるんだからそれも絡めて色々検索したい。

そんなことを考えてると、結局書いた方が楽だということになった。

プログラミング

検索の実態としては、ひとつひとつ地道にファイルを読んでいってstripos。いわゆる "grep型" ってヤツだ。インデックスを作らずに検索されたら直接それぞれのファイルを読みに行く。そして、形態素解析とかよく分かんないことはせずに素直にgrepstriposだけど)。元々1記事毎に本文のみがテキストファイルになってるからファイル丸ごと検索をかければいい。おかげさまで比較的楽な作業だ(いや、DataBaseの方が断然楽だろうけど

検索自体は意外と簡単だ。検索オプションがある場合はそれでフィルタをかけつつ、あとはwhileやらforeachやらでひたすらstriposを回す。条件にマッチした記事ファイルのデータを$result[]に入れる。

どちらかというと、クエリをキーワードごとに分ける作業とか、検索結果の表示方法だとか、モード分けとか、そっちの方が面倒だった気がする。とくに、サマリーにハイライトされた検索ワードが入るようにする部分はそれなりに行数も割いている。基本的にはその記事中で一番最初にキーワードが出てきたらへんを抜いている。

あとは、localからwolfrosch.comに持ってったときに、ApacheだかPHPだかの設定がlocalとちょっと違うらしく、mb_strlenがちゃんと文字数を数えてくれなくて困った。これもその本文のキーワード付近のサマリー抽出の部分。内部文字コードが食い違ってる様子もなく、念のためmb_strlen($str,'UTF-8')とかしてみても無駄だった。php.iniとか.htaccessとかも弄ってみたけどかわらず。というかこの辺はよく分かってないのでひとまずググってそれっぽいのをコピペ。合ってるかは不明。やはり行き当たりばったりの知識ではダメなのかうんともすんとも言わず。それ以外のマルチバイト関数mb_strcutとか)はちゃんと文字を数えられてるのがまた謎。

で、最終的には、mb_strlenじゃなくてstrlenなら正常に数えられることがわかった。あり? 逆じゃねーの?普通。しかし、これ以上どうしようもなさそうなので、ひとまずこれでお茶を濁す。対処療法だが。幸いlocalでもstrlenでマルチバイトも数えられる。overloadとかじゃなかったのか。よく分からん。

それにしても、この検索は、ヴォルフロの基本レイアウトテンプレート + Text用関数・変数セット + 検索スクリプト の3つが入り交じってて、だんだん変数がわかんなくなってきた。もっとちゃんと変数命名規則を作って、それにそれこそクラス化とかしないといかんのかなぁ。オブジェクト指向かぁ。未だによく分かってない。

検索

n件ごとにページに分解とかがめんどうで、ひとまず現在は、100件ヒットしようと200件ヒットしようと検索結果はすべて1ページにつっこんでる。なんかこれでもいい気がするんだけど、気が向いたらページ分けをします。20件/page とかが妥当なのかなぁ?

"関連Text" まで検索対象になるのは腹が立つ。そう、この部分意外とファイルにべた書き。やっぱり関数化しておけば良かった。いまからでも遅くないかな? 今度なんとかするか。

あとはおりをみてOR検索とかNOT検索も実装してみたい。

サイト内検索との関係

最初に書いたが、サイト内検索とText内検索は現在全く独立に動いている。まぁ、この2つを合わせれば検索できるページに漏れはないのだが、希望を言えばできれば統合はしたい。しかし、Textのオプション検索なんかも、それはそれで気に入ってる。

となると、サイト内検索も自分で書き直すのだろうか。そうなんだろうなぁ、多分。まぁ今回Text内検索書いて基本的なことは分かったからいいんだけど。楽しいし。

でも冷静考えると、普通のサイトはサイト部分とBlog部分の検索は別々だよなぁ。全サイトBlogツールで構築とかしてたら別だけど。ひとまずはこれでいい気がしてる。

動作チェック

そうそう、案の定Windowsでの動作やレンダリングチェックはしていない。それ以外でも、もし不具合があったら教えてください。

Comment

この記事へのコメント受付は終了しました。