いよいよ、gihyo.jpさんでgroongaの隔週更新連載が始まりました!! 初回は概要紹介の「第1回 全文検索エンジンgroongaを紹介します!」です。
連載は始まりましたが、利用事例をどんどん紹介していきたいので、groongaやmroongaを実際に使っていて、利用事例記事を書いてもいいよ、という人をまだまだ募集しています。
詳細はgroonga普及のための協力のお願いを参照してください。
はじめに
オープンソースのカラムストア機能付き全文検索エンジンgroongaを公開しています。
この記事を書いた時の最新のバージョンは2013年3月29日にリリースした3.0.2です。
今回は、groonga 3.0.2で対応した --output_columns
での文字列連結について紹介します。
--output_columns
での文字列連結
groonga 3.0.2では --output_columns
での文字列連結を書くことができるようになりました。
例えば、特定カラムの内容の前後に<
と>
を追加したい、といったときには+
演算子を使って文字列を連結することができるようになりました。
--output_columns '"<" + カラム名 + ">"'
snippet_html()っぽいことができますね。
では実際にどんなふうに使えるか確認してみましょう。
サンプルのスキーマとデータ
サンプルのスキーマは以下の通りです。
Articleテーブルにtitle,category,contentカラムを作成しています。
table_create Article TABLE_PAT_KEY UInt32
column_create Article title COLUMN_SCALAR ShortText
column_create Article category COLUMN_SCALAR ShortText
column_create Article content COLUMN_SCALAR ShortText
table_create Lexicon TABLE_PAT_KEY ShortText --normalizer NormalizerAuto
column_create --table Lexicon --name title_index --flags COLUMN_INDEX|WITH_POSITION --type Article --source title
column_create --table Lexicon --name category_index --flags COLUMN_INDEX|WITH_POSITION --type Article --source category
サンプルのデータは以下の通りです。
これまでにQiitaへ投稿したタイトルですね。
load --table Article
[
{"_key":1, "category":"groonga", "title":"groongaでキーワードごとに重み付けをして検索するには"},
{"_key":2, "category":"mroonga", "title":"mroongaインストール時のMySQLとのバージョン不一致に対処する方法"},
{"_key":3, "category":"mroonga", "title":"mroongaでMySQL互換の照合順序を使うには"},
{"_key":4, "category":"groonga", "title":"groonga-httpdのセットアップでつまづかないための方法"},
{"_key":5, "category":"mroonga", "title":"mroongaで作ったテーブルをgroongaから検索するには"},
{"_key":6, "category":"groonga", "title":"groongaで特定のカラムを更新するには"},
{"_key":7, "category":"groonga", "title":"groongaでレコードを削除する方法"},
{"_key":8, "category":"groonga", "title":"groongaでMySQL互換のノーマライザーを使うには"},
{"_key":9, "category":"groonga", "title":"Groongaのデータベースをダンプ・リストアする方法"},
]
上記サンプルスキーマとデータの内容をsample.grnなどとして保存します。
次のコマンドを実行して、データベースを構築します。
% mkdir -p testdb
% groonga -n testdb/db < sample.grn
文字列連結による検索結果のカスタマイズ
ここまででデータベースの準備ができたので、実際に検索してみましょう。
まずはgroongaコマンドを実行して入力待機状態にします。
% groonga testdb/db
入力待機状態になったら以下のクエリを入力します。
select Article
以下のように9件の登録データが表示されます。
上のコマンドを実行した結果を見やすいように抜粋し、整形すると以下のようになります。
(なお、以降の実行結果も適宜抜粋・整形しており、実際の実行結果は他にも情報を含んでいます。詳しくは出力内容についてのドキュメントをご覧ください。)
[
[9],
[
["_id","UInt32"],["_key","UInt32"],["category","ShortText"],["content","ShortText"],["title","ShortText"]
],
[1,1,"groonga","","groongaでキーワードごとに重み付けをして検索するには"],
[2,2,"mroonga","","mroongaインストール時のMySQLとのバージョン不一致に対処する方法"],
[3,3,"mroonga","","mroongaでMySQL互換の照合順序を使うには"],
[4,4,"groonga","","groonga-httpdのセットアップでつまづかないための方法"],
[5,5,"mroonga","","mroongaで作ったテーブルをgroongaから検索するには"],
[6,6,"groonga","","groongaで特定のカラムを更新するには"],
[7,7,"groonga","","groongaでレコードを削除する方法"],
[8,8,"groonga","","groongaでMySQL互換のノーマライザーを使うには"],
[9,9,"groonga","","Groongaのデータベースをダンプ・リストアする方法"]
]
では、実際に文字列連結を試してみましょう。
titleカラムをキーワードgroongaで検索して、その結果としてcategoryカラムを<div>
タグのclass
に指定して、<div>
タグの内容はtitleカラムを指定することにしましょう。snippet_html()を使ってキーワードの周辺テキストの抽出もやってみましょう。
実際のクエリは以下のようになります。
このとき、--command_version 2
を指定するのを忘れないでください。また、"
を使うときはエスケープにも注意が必要です。
select Article --output_columns '"<div class=\\"" + category + "\\">" + title + "</div>", snippet_html(title)' --query "title:@groonga" --command_version 2
実行結果は以下のようになります。
[
[
[6],
[
["","null"],["snippet_html","null"]
],
["<div class=\"groonga\">groongaでキーワードごとに重み付けをして検索するには</div>",["<span class=\"keyword\">groonga</span>でキーワードごとに重み付けをして検索するには"]],
["<div class=\"groonga\">groonga-httpdのセットアップでつまづかないための方法</div>",["<span class=\"keyword\">groonga</span>-httpdのセットアップでつまづかないための方法"]],
["<div class=\"groonga\">groongaで特定のカラムを更新するには</div>",["<span class=\"keyword\">groonga</span>で特定のカラムを更新するには"]],
["<div class=\"groonga\">groongaでレコードを削除する方法</div>",["<span class=\"keyword\">groonga</span>でレコードを削除する方法"]],
["<div class=\"groonga\">groongaでMySQL互換のノーマライザーを使うには</div>",["<span class=\"keyword\">groonga</span>でMySQL互換のノーマライザーを使うには"]],
["<div class=\"groonga\">Groongaのデータベースをダンプ・リストアする方法</div>",["<span class=\"keyword\">Groonga</span>のデータベースをダンプ・リストアする方法"]
]
]
これで、意図通りの結果が得られました。
--output_columns
で文字列連結を使うことで、記事のカテゴリごとに適用するスタイルを変更しつつ、(今回はタイトルだけでしたが)記事の内容に応じてsnippet_html()による検索キーワードのハイライトを行うということができるようになりました。
まとめ
今回は--output_columns
で文字列連結により結果をカスタマイズする方法を紹介しました。
groongaに興味を持ったなら、まずはインストールして試してみてください。
groongaの基本的な動作を知るためのチュートリアルもあります。インストールしたら試してみてください。