LoginSignup
6
7

More than 5 years have passed since last update.

Mongodb 最短入門(2)数万件いれて探してみた

Last updated at Posted at 2016-01-12

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がでるか確認

curl http://127.0.0.1:8000/cgi-bin/search.py?q=test

今回は 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で、ざっくりファイルを消したり移動したりが大丈夫、懐かしい。。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7