groongaで--output_columnsの結果を任意の文字列でカスタマイズする方法

いよいよ、[gihyo.jp](http://gihyo.jp/)さんでgroongaの隔週更新連載が始まりました!! 初回は概要紹介の[「第1回　全文検索エンジンgroongaを紹介します！」](http://gihyo.jp/dev/clip/01/groonga/0001)です。

連載は始まりましたが、利用事例をどんどん紹介していきたいので、groongaやmroongaを実際に使っていて、利用事例記事を書いてもいいよ、という人をまだまだ募集しています。
詳細は[groonga普及のための協力のお願い](http://sourceforge.jp/projects/groonga/lists/archive/dev/2013-February/001186.html)を参照してください。

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。
この記事を書いた時の最新のバージョンは2013年3月29日にリリースした3.0.2です。

今回は、groonga 3.0.2で対応した ```--output_columns``` での文字列連結について紹介します。

# ``--output_columns`` での文字列連結

groonga 3.0.2では ```--output_columns``` での文字列連結を書くことができるようになりました。

例えば、特定カラムの内容の前後に``<``と``>``を追加したい、といったときには``+``演算子を使って文字列を連結することができるようになりました。

```
--output_columns '"<" + カラム名 + ">"'
```

[snippet_html()](http://groonga.org/ja/docs/reference/functions/snippet_html.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件の登録データが表示されます。

上のコマンドを実行した結果を見やすいように抜粋し、整形すると以下のようになります。
（なお、以降の実行結果も適宜抜粋・整形しており、実際の実行結果は他にも情報を含んでいます。詳しくは[出力内容についてのドキュメント](http://groonga.org/ja/docs/reference/command/output_format.html)をご覧ください。）

```
[
  [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に興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

groongaの基本的な動作を知るための[チュートリアル](http://groonga.org/ja/docs/tutorial.html)もあります。インストールしたら試してみてください。