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
Comments