Python实现MongoDB标题不区分大小写搜索功能求助
实现MongoDB标题字段不区分大小写搜索
方法1:使用正则表达式(适合小数据集)
直接在$match阶段用$regex并指定i选项(开启不区分大小写)即可,为避免搜索内容里的正则特殊字符干扰,建议先转义:
@cross_origin(origin='*',headers=['Content-Type','Authorization']) def search_by_title(): import re title = request.args.get('title') # 转义正则特殊字符,防止搜索逻辑出错 escaped_title = re.escape(title) pipeline = [ { "$match" : { "title" : { "$regex": escaped_title, "$options": "i" }}}, { "$project" : {"title" : 1, "movie" : 1, "_id" : 1}} ] data_to_return = [] for movie in movies.aggregate(pipeline): movie['_id'] = str(movie['_id']) data_to_return.append(movie) return make_response(jsonify(data_to_return), 200)
方法2:创建文本索引(适合大数据量,性能更优)
如果数据集较大,正则搜索的性能会受限,推荐给title字段创建文本索引,这种方式天然支持不区分大小写,且搜索效率更高:
首先执行一次索引创建操作(MongoDB Shell或Python中都可):
# 在Python中创建文本索引 movies.create_index([("title", "text")])
然后修改搜索逻辑:
@cross_origin(origin='*',headers=['Content-Type','Authorization']) def search_by_title(): title = request.args.get('title') pipeline = [ { "$match" : { "$text": { "$search": title }}}, { "$project" : {"title" : 1, "movie" : 1, "_id" : 1}} ] data_to_return = [] for movie in movies.aggregate(pipeline): movie['_id'] = str(movie['_id']) data_to_return.append(movie) return make_response(jsonify(data_to_return), 200)
文本索引还支持多词匹配,适合更复杂的搜索场景。
内容的提问来源于stack exchange,提问作者Claire
相关产品推荐
相关产品推荐

