もっとgroongaを知ってもらおう!ということで週刊groongaをはじめました。毎週木曜にgroongaやmroonga、rroongaのトピックを投稿予定です。
いよいよ、gihyo.jpさんでgroongaの隔週更新連載が始まりました!!
第5回の記事も公開されたので、一読をおすすめします。
- 「第1回 全文検索エンジンgroongaを紹介します!」
- 「第2回 groongaをRuby On Railsでも使ってみた ~chikamap.comの事例から」
- 「第3回 すべてのMySQLユーザに高速な全文検索機能を! - mroongaの紹介」
- 「第4回 rroongaを使ったソースコード検索エンジンMilkode」
- 「第5回 Rubyでサーバ要らずの高速全文検索! - rroongaの紹介」
連載は始まりましたが、利用事例をどんどん紹介していきたいです。(利用事例のストックが尽きたら終了してしまいます。)
groongaやmroonga、rroongaを実際に使っていて利用事例記事を書いてもいいよ、という人をまだまだ募集しています。
詳細はgroonga普及のための協力のお願いを参照してください。
はじめに
オープンソースのカラムストア機能付き全文検索エンジンgroongaを公開しています。
最新のバージョンは2013年5月29日にリリースした3.0.4です。
今回は、tokenize
コマンドを使ってマッチしない理由を確認する方法を紹介します。
tokenize
コマンドとは
groongaでは3.0.4からトークナイズした結果を確認する方法としてtokenize
コマンドをサポートしました。
例えば、本のタイトルを検索するときのことを考えてみましょう。
Books
テーブルがあって、Books
テーブルにはタイトルを保持するtitle
カラムがあるとします。
サンプルのスキーマ定義は以下のようになるでしょう。
table_create Books TABLE_HASH_KEY UInt32
table_create Lexicon TABLE_HASH_KEY ShortText --default_tokenizer TokenMecab
column_create Books title COLUMN_SCALAR ShortText
column_create Lexicon index_title COLUMN_INDEX --type Books --source title
上記サンプルのためのサンプルデータを用意します。
load --table Books
[
{"_key":1,"title":"東京旅行"},
{"_key":2,"title":"京都旅行"},
{"_key":3,"title":"東京都案内"},
]
title
から東京都を検索してみましょう。
select Books --query title:@東京都
この結果は以下のようになります。
[
[
[1],
[
["_id","UInt32"],["_key","UInt32"],["title","ShortText"]
],
[3,3,"東京都案内"]
]
]
では次に、title
から東京を検索してみましょう。
「東京旅行」と「東京都案内」がひっかかりました。
[
[
[2],
[
["_id","UInt32"],["_key","UInt32"],["title","ShortText"]
],
[1,1,"東京旅行"],
[3,3,"東京都案内"]
]
]
今度は、title
から京都を検索してみましょう。
この結果は以下のようになります。
[
[
[1],
[
["_id","UInt32"],["_key","UInt32"],["title","ShortText"]
],
[2,2,"京都旅行"]]]
]
]
「京都旅行」がひっかかりました。
でも、タイトルの一部に「京都」が含まれる「東京都案内」はひっかかりませんでした。
どうしてでしょうか。これはMeCabのトークナイズのしかたによるものです。
tokenizeコマンドでMeCabによるトークナイズを試すことができます。以下のようにして使います。
tokenize トークナイザー 文字列
"東京都案内"をトークナイズするには以下のコマンドを実行します。
> tokenize TokenMecab "東京都案内"
tokenizeコマンドの詳細はドキュメントを参照してもらうとして、「東京都案内」をトークナイズした結果は以下のようになります。
[{"value":"東京","position":0},{"value":"都","position":1},{"value":"案内","position":2}]
"東 京都 案内"ではなく"東京 都 案内"とトークナイズされていますね。
なので、"京都"にはマッチしなかったことがわかりました。
まとめ
今回は、groongaのtokenize
コマンドを使ってマッチしない理由を確認する方法を紹介しました。
groongaに興味を持ったなら、まずはインストールして試してみてください。
groongaの基本的な動作を知るためのチュートリアルもあります。インストールしたら試してみてください。