Flaskを使ってWebページを構築していると、サイト内検索を実装したくなった。
Googleカスタム検索で実装してもよかったが、折角なのでMongoDBとflask-mongoengineを使って構築した。
構築環境
- python
- flask
- mongoDB
- flask-mongoengine
データベースのコレクションはsampleだとする。
フィールドは performer,Genre,title があるとする。
コードは以下の通り
search.py
import flask
from flask import *
from flask_mongoengine import MongoEngine
from mongoengine.queryset.visitor import Q
@app.route('/search', methods=['GET'])
def search():
#GETメソッドで取得した値があれば、スペースで区切った配列にする
if request.args.get('message') != None:
search_list = request.args.get('message').split()
page_num = int(flask.request.args.get('page') or 1)
result = sample.objects()
for i in search_list:
#繰り返しクエリを投げることでAnd検索を表現。
#Like検索は /'検索したい文字'/。しかし、ここでは変数を使っているので、'/' + i + '/' と書くと'/検索したい文字/'となってしまうので'$regex'ノーテーションを使う
#Q() | Q() で or 条件にできる。
result = result(Q(__raw__ ={'performer':{'$regex': i }}) | Q(__raw__ = {'title': {'$regex': i }}) | Q(__raw__ = {'Genre': {'$regex': i }}))
result = result.paginate(page=page_num, per_page=30)
return flask.render_template("search.html", result=result)
flask-mongoengine のpaginateメソッドを用いて検索結果のコンテンツを1ページに30個表示するように設定している。
見たとおり、or検索は実装していないが、あまり使わないので必要ないかと感じた。
あまり日本語でflaskとmongodbを組み合わせてwebサイトを作るといった趣旨の情報が少ないので、少しでも同胞の助けになれば。