#MongoDB + python の検索APIを作る
Mongodb 最短入門(1)EC2にインストール&起動&いきなり数万件入れてみた の続き
MongoDB + python で検索
数万件もはいっても,日本語で部分一致でも検索できたよ。
(1)でEC2のt2.microで1Gくらいのテキスト量のデータをいれてみました。
けっこう軽い
python の正規表現をオブジェクトで渡す
- コマンドラインだと、jsavascriptの正規表現を使います。
- pythonの正規表現でオブジェクトにして渡してあげたら、部分一致や正規表現が使える
- jsonでなくbsonで入ってるので、bsonのユーティリティ使います。
python search.py
search.py
# coding: utf-8
import pymongo
from bson.json_util import loads
from bson.json_util import dumps
import re
client=pymongo.MongoClient()
#database
db=client.test
regx = re.compile("ピンク", re.IGNORECASE)
cursor = db.honyarara.find({"title":regx})
for document in cursor:
print dumps(document)
APIサーバーにしてみます。
MongoDBにいれたデータを検索して、結果をjsonで返すCGIにしてみます
python CGI起動 ッターン!
python -m CGIHTTPServer &
こちら↓参照
一行でCGIサーバー(1)python編
URLにアクセスしてJSONがでるか確認
今回は q=<>で渡された単語をtitle,もしくはkana という2個のフィールドを OR検索 します
こんなデータがあるとして→{"title":"test mongo!","kana":"てすと"},{},{},,
search.py
#!/usr/bin/python
# coding: utf-8
import pymongo
from bson.json_util import dumps
import re
import json
import cgi
print "Content-type: text/html\n\n"
client=pymongo.MongoClient()
#database test
db=client.test
#クエリを取得
form = cgi.FieldStorage()
#qというリクエスト変数があったら
if(form.has_key("q")):
q = form["q"].value
regx = re.compile(q, re.IGNORECASE)
#正規表現をフィールドにセットしてmongoの find メソッドで取得
cursor = db.honyarara.find({
"$or": [
{"title":regx},
{"kana":regx}
]
})
else:
print "{}"
exit()
#リストにいれて、、bson → jsonの文字列 → jsonから変数に変換
items=[]
for document in cursor:
items.append(json.loads(dumps(document)))
#配列からjsonに変換
print json.dumps({"items": items })
MongoDBの初期化
良い子は真似してはいけませんが、最初からやり直したいとき
- 停止する
service mongod stop
-
/etc/mongo.conf
にかいてある データディレクトリを確認/var/lib/mongo
- ざっくり中身を消す。もしくはmongodユーザーの権限でディレクトリを作りなおす
- もしくはconfで別の場所を指す
- で、再起動
service mongod start
MySQLの作法にならっていてパスなどは同じようになっているらしい。昔のMyISAMで、ざっくりファイルを消したり移動したりが大丈夫、懐かしい。。