classics.

2010/06/24 Thuflickr

Ruby+MongoDB+MeCabで全文検索

これに検索コマンドをつけたのでメモ。MeCabを選んだのは気分です。

User Streamsから取得する際にそのままのJSONをMongoDBに入れてたのを、MeCabかませた配列も入れるコードを追加(過去ログもバッチ処理した)。

if status['text']
    status['keywords'] = MeCab::Tagger.new("-Owakati").parse(status['text']).split(' ')
end

あとインデックスを張る

$ mongo
> use userstreams
> db.status.ensureIndex({keywords: 1})

検索する関数

def search(keyword)
    keywords = MeCab::Tagger.new("-Owakati").parse(keyword).split(' ')
    return $db['status'].find({'keywords'=>{'$all'=>keywords}},{:sort=>['id', 'descending'],:limit=>10})
end

いろいろ書いた気がしていたけどあまり書いてなかったですね。{'keywords'=>{'$all'=>keywords}} の部分がどうするのかよくわからず、はまった。あとバッチ処理が長かった。

これまでの検索用関数はこういう感じで正規表現で楽勝じゃんみたいなのにしてたけどクエリが重くて、タイムアウトエラー吐いたりしたので思い直したのでした。

def search(keyword)
    return $db['status'].find({'text'=>/#{keyword}/},{:sort=>['id', 'descending'],:limit=>10})
end