groongaでベクタカラムの特定の要素にアクセスするには

いよいよ、[gihyo.jp](http://gihyo.jp/)さんでgroongaの隔週更新連載が始まりました!! 
第3回の記事も公開されたので、一読をおすすめします。

* [「第1回 全文検索エンジンgroongaを紹介します！」](http://gihyo.jp/dev/clip/01/groonga/0001)
* [「第2回 groongaをRuby On Railsでも使ってみた ～chikamap.comの事例から」](http://gihyo.jp/dev/clip/01/groonga/0002)
* [「第3回 すべてのMySQLユーザに高速な全文検索機能を！ - mroongaの紹介」](http://gihyo.jp/dev/clip/01/groonga/0003)

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

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。

この記事を書いた時の最新のバージョンは2013年4月29日にリリースした[3.0.3](http://groonga.org/ja/docs/news.html#release-3-0-3)です。

今回は、groongaで任意のインデックスを指定してベクタカラムの要素にアクセスする方法を紹介します。

# ベクタカラムの任意の要素にアクセスするには

これまで、groongaではベクタカラムの任意の要素にアクセスする手段を提供していませんでした。

groonga 3.0.3からはそれができるようになりました。
配列の要素を参照するのに一般に使われる ``vector[N]`` という記法でアクセスできます。

# ベクタカラムの任意の要素にアクセスできると嬉しいこと

例えば、動画をタグ検索するときのことを考えてみましょう。
動画を分類するために、タグを複数つけるとします。

``Video`` テーブルがあって、``Video`` テーブルにはタイトルを保持する ``title`` カラムと複数のタグをつけるための ``tags`` カラムがあるとします。

サンプルのスキーマ定義は以下のようになるでしょう。

```
table_create --name Video --flags TABLE_HASH_KEY --key_type UInt32
table_create --name Tag --flags TABLE_HASH_KEY --key_type ShortText
column_create --table Video --name title --flags COLUMN_SCALAR --type ShortText
column_create --table Video --name tags --flags COLUMN_VECTOR --type Tag
column_create --table Tag --name index_tags --flags COLUMN_INDEX --type Video --source tags
```

上記サンプルのためのサンプルデータを用意します。

```
load --table Video
[
{"_key":1,"title":"groonga Demo","tags":["demo", "groonga", "FTS"]},
{"_key":2,"title":"mroonga Demo","tags":["demo", "mroonga", "FTS"]},
{"_key":3,"title":"rroonga Demo","tags":["demo", "rroonga", "FTS", "ruby"]},
{"_key":4,"title":"groonga Overview","tags":["presentation", "groonga", "FTS"]},
]
```

タグ検索をするにはgroongaでは以下のようなクエリを実行します。
例えば ``demo`` というタグがつけられたデータを探してみましょう。

```
select --table Video --query tags:@demo --output_columns _key,title
```

この結果は以下のようになります。

```
[
  [
    [3],
    [
      ["_key","UInt32"],
      ["title","ShortText"]
    ],
    [1,"groonga Demo"],
    [2,"mroonga Demo"],
    [3,"rroonga Demo"]
  ]
]
```

では、複数あるタグのうち、タグの順番に意味がある場合はどうでしょうか。
ベクタカラムで先頭にくるタグをより重視する場合です。

``--query tags:@demo`` はタグに``demo``が含まれているかどうかだけで判断します。
そのため、複数あるタグの一番最後に仮にあったとしてもひっかかります。

例えば、``--query tags:@groonga`` にすると``demo``以外もひっかかります。

```
[
  [
    [2],
    [
      ["_key","UInt32"],
      ["title","ShortText"]
    ],
    [1,"groonga Demo"],
    [4,"groonga Overview"]
  ]
]
```

これを、``demo``かつ``groonga``なものだけ検索したいというときにインデックスでアクセスする方法が使えます。

```
select --table Video --filter 'tags[0] == "demo" && tags[1] == "groonga"' --output_columns _key,title
```

この結果は以下のようになります。

```
[
  [
    [1],
    [
      ["_key","UInt32"],
      ["title","ShortText"]
    ],
    [1,"groonga Demo"]
  ]
]
```

これで、特定のタグの任意の要素をもとに検索できるようになりました。

# まとめ

今回は、groongaで任意のインデックスを指定してベクタカラムの要素にアクセスする方法を紹介しました。

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

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