ブクログのパブー(Puboo)で Groonga 本を執筆しました

昨年 10 月頃に AMN 経由で執筆依頼を受けて執筆活動をしました。初執筆と言うことでボツ原稿が溜まるばかりで、なかなか原稿があがらず、第一回目を締め切りを落とし、第二回目の原稿に間に合わせ、その後いろいろと調整ということで、執筆完了してから約3ヶ月後にめでたく販売開始となりました。

電子書籍という形ですが、いつかは、一度は、本を書いてみたいという夢が叶いました。

今回執筆した内容ですが、個人的に注目した groonga という全文検索エンジンを用いて作る検索システムってのが題材です。検索システムの基本的な概念を解説しつつ、僕が昔から使い続けているブログシステム MovableType の検索 CGI を、全文検索エンジン groonga を使って作り直すぞっていう実用的?技術本です。何を隠そう、このブログの検索 CGI で個人的に必要に思って作った経験を汎用化して書籍化しただけです。

MovableType のデフォルトの検索エンジンって、遅いしイケてないと思いません?
そんな方々に読んでいただければと思ってます。言語は perl で記述していますが、MT ともある程度疎結合な設計にしているので、WordPress にも適用できます。今時なら、そっちの方が需要も高かったかも知れません。

- スポンサーリンク -

執筆した書籍はこちらからお求めいただけます。3/6〜3/13 15:00まで500円を300円で発売中です。
「Groonga」で生まれ変わるMovable Typeの全文検索機能 - TSUNODA | ブクログのパブー

img100.jpg

導入部分の試し読みができるますので、興味のある方はご覧いただきたいのですが、一般的な全文検索エンジンと呼ばれるもの"以外"の検索は、多くの場合データベースの LIKE 文と呼ばれる構文を用いて部分一致させた結果を表示しています。LIKE 文による検索はインデックスを張って高速化できないため、一般的に文章量に比例して応答速度が劣化します。従ってブログを書けば書くほど自ブログの検索が遅くなるって分けです。

実際に MT5 の検索 CGI の中枢のコードを見てみます。lib\MT\App\Search.pm の該当箇所を引用してみます。
コードは若干複雑ですが、like という文字列が見て取れます。動的に SQL を構成する作りになっています。WordPress のコードも分析してみましたが基本的に作りは同じで LIKE 文による検索でした。

    sub core_parameters {
        my $app = shift;
        my $core = {
            params => [
                qw( searchTerms search count limit startIndex offset
                    category author )
            ],
            types => {
                entry => {
                    columns => {
                        title     => 'like',
                        keywords  => 'like',
                        text      => 'like',
                        text_more => 'like'
                    },
                    'sort' => 'authored_on',
                    terms  => {
                        status => 2,  #MT::Entry::RELEASE()
                        class => $app->param('archive_type') ? 'entry' : '*',
                    },
                    filter_types => {
                        author   => \&_join_author,
                        category => \&_join_category,
                    },
                },
            },
            cache_driver => { 'package' => 'MT::Cache::Negotiate', },
        };
       
        my @filters = ($app->param('filter'), $app->param('filter_on'));
        if (@filters) {
            $core->{types}->{entry}->{columns} = { map { $_ => 'like' } @filters };
        }
        $core;
    }

さて、書籍には書いていないのですが、僕はどのようにしてきたか過去を振り返ってみます。

1. FastCGI 化して高速化してみた。でも検索品質が部分一致+日付ソートが嫌だ
2. Google の Search API を使って検索 CGI を作ってみたけど、いろいろ hack が必要で面倒で嫌だ
3. Google Custom Search を使って検索 CGI を作ってみたけど、なんか変な仕様に変わって嫌になった
4. Groonga を使って独自に検索 CGI を構築。 <---- いまココ

ヒットしたワード数などで重み付け、タイトル、本文などで重み付けも作り次第でできるので、今のところ満足のいく検索品質の検索 CGI を提供できていると思ってます。まさにこのブログの右端にある検索ボックスから検索していただいたものが、Groonga ベースの検索になっています。

さて、検索エンジンの超簡単なシステム構成図ですが、概ねこんな感じです。

img005.jpg

まぁそんな内容の技術本になっています。とりあえず本書片手にプログラミングすれば、少なくとも MovableType に全文検索 CGI を提供できるようになります。ただし、システムに groonga や mecab をインストールする権限が必要となりますので悪しからず・・・。

よろしければ、手にとっていただけると次を執筆する気力になったりします。m(_ _)m
最後に、いろいろな注文を聞いてくださったスタッフの方々に感謝致します。

- スポンサーリンク -