最近在使用MongoDB的时候,遇到了使用多个关键词进行模糊查询的场景。竹风使用的是mongoengine库。

查了各种资料,最后总结出比较好用的方法。先上代码,后面进行详细说明。如下:

 #!/usr/bin/env python
#coding:utf-8 import re
import mongoengine
from mongoengine import * mongoengine.register_connection('default', 'test', host='127.0.0.1') class TestData(Document):
name = StringField()
content = StringField() TestData.objects.get_or_create(name='天地玄黄',defaults={'content':'abc123'})
TestData.objects.get_or_create(name='宇宙洪荒',defaults={'content':'ABC123'})
TestData.objects.get_or_create(name='天天向上',defaults={'content':'Abc123'}) def print_arr(obj):
print obj.name,obj.content def fuzzy_query_by_contains():
print "\n###使用mongoengine的contains进行查询"
print "#contains区分大小写:"
test_data_list = TestData.objects(content__contains='abc123')
map(print_arr,test_data_list) print "#icontains不区分大小写:"
test_data_list = TestData.objects(content__icontains='abc123')
map(print_arr,test_data_list) def fuzzy_query_by_Q():
print "\n###使用Q来进行查询"
test_data_list = TestData.objects(
Q(name__icontains=u'天地') | Q(name__icontains=u'宇宙'))
map(print_arr,test_data_list) def fuzzy_query_by_pymongo():
print "\n###使用raw queries,New in version 0.4"
print "#单个查询条件"
search = {
'__raw__':{
'content':{'$regex':'A\S+\d+'},
},
}
test_data_list = TestData.objects(**search)
map(print_arr,test_data_list) print "#多个查询条件"
search = {
'__raw__':{
'name':{'$in':[re.compile(u'天天'),re.compile(u'宇宙')]},
},
}
test_data_list = TestData.objects(**search)
map(print_arr,test_data_list) if __name__ == '__main__':
fuzzy_query_by_contains()
fuzzy_query_by_Q()
fuzzy_query_by_pymongo()

先讨论一下fuzzy_query_by_contains方法,这里用的是mongoengine提供的contains操作。值得注意的是,contains区分大小写,而icontains不区分大小写。这种方式在针对一个关键词进行模糊查询的时候特别方便。

然后是fuzzy_query_by_Q方法,这里结合了contains和Q来进行组合查询。当使用Q()来进行组合查询时,必须使用位运算符(|和&),而不能使用or,and来进行逻辑运算。这种方式比较合适确定关键词数目的情况。如果关键词的数目是不定的,这种方式就略显纠结了。

竹风在动态关键词模糊查询的问题也是纠结良久,差点就要对每个关键词分别查询,然后取交集凑结果了。后来在文档中发现,mongoengine有__raw__这个参数,可以执行PyMongo的查询(version 0.4提供的新功能)。于是几经试验,fuzzy_query_by_pymongo方法就出炉了。
    PyMongo支持正则表达式,提供了两种方法,一种是使用$regex,另一种是使用re.compile()。
    在例子中,对单个关键词进行模糊查询,对应的代码为:{'$regex':'A\S+\d+'}
    接着就是对多个关键词进行查询,对应的代码为:{'$in':[re.compile(u'天天'),re.compile(u'宇宙')]}

对代码进行一些修改,以便接受多个关键词,代码如下:

 def fuzzy_query_by_pymongo():
print "#多个查询条件"
keyword = u'天天 宇宙'
search = {'__raw__' : {'name':{'$in':map(re.compile,keyword.split())}}}
test_data_list = TestData.objects(**search)
map(print_arr,test_data_list)

顺带一提,例子中创建数据是用的get_or_create,会返回一个元组,第一个元素是创建or查询的对象,第二个元素是是否创建成功。文档中的推荐用法如下:

 >>> a, created = User.objects.get_or_create(name='User A', defaults={'age': })
>>> b, created = User.objects.get_or_create(name='User A', defaults={'age': })
>>> a.name == b.name and a.age == b.age
True

最后是例子运行的结果,返回的结果顺序可能略有不同,不必在意。

 $ python mongodb_test.py

 ###使用mongoengine的contains进行查询
#contains区分大小写:
天地玄黄 abc123
#icontains不区分大小写:
天地玄黄 abc123
宇宙洪荒 ABC123
天天向上 Abc123 ###使用Q来进行查询
天地玄黄 abc123
宇宙洪荒 ABC123 ###使用raw queries,New in version 0.4
#单个查询条件
宇宙洪荒 ABC123
天天向上 Abc123
#多个查询条件
宇宙洪荒 ABC123
天天向上 Abc123

Python札记 -- MongoDB模糊查询的更多相关文章

  1. Python 代码实现模糊查询

    Python 代码实现模糊查询 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列 ...

  2. 转】Nodejs对MongoDB模糊查询

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: Jul 1, 2013 Tag ...

  3. 10 行 Python 代码实现模糊查询/智能提示

    10 行 Python 代码实现模糊查询/智能提示   1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的 ...

  4. MongoDB 模糊查询,及性能测试

    var mongodb = new MongoClient("mongodb://127.0.0.1:27017");//MongoServer.Create();//创建链接 v ...

  5. MongoDB模糊查询

    模糊查询简介MongoDB查询条件可以使用正则表达式,从而实现模糊查询的功能.模糊查询可以使用$regex操作符或直接使用正则表达式对象. MySQL  MongoDB select * from s ...

  6. MongoDB 模糊查询like

    1.LIKE模糊查询userName包含A字母的数据(%A%)-- SQL:SELECT * FROM UserInfo WHERE userName LIKE "%A%" -- ...

  7. MongoDB模糊查询,以及MongoDB模糊查询时带有括号的情况

    模糊查询 记录如下: { "_id" : ObjectId("5c3d486d24aa9a000526367b"), "name" : &q ...

  8. MongoDB模糊查询 工具

    {"Exception":{$regex:"定时发送邮件"}}    //模糊查询条件 {"DateTime":-1}         // ...

  9. Python——数据库like模糊查询

    在Python中%是一个格式化字符,所以如果需要使用%则需要写成%%.将在Python中执行的sql语句改为:sql = "SELECT * FROM table_test WHERE va ...

随机推荐

  1. asp.net应用程序生命周期和asp.net网页的生命周期

    一.asp.net应用程序生命周期 asp.net应用程序生命周期以浏览器向web服务器(比如IIS服务器)发送请求为起点,先后经历web服务器下的ISAPI(Internet Server Appl ...

  2. JavaScript Window 对象

    < JavaScript Window Object > && < IE check > JavaScript Window Object Window.loa ...

  3. Xmanager远程Centos 7 Xfce

    最近发现远程除了使用VNC还可以用Xmanager,孤陋寡闻了,通过这个远程软件,又把不怎么关注的Xwindow给了解了一遍. Xfce是一个自由软件,运行在类Unix操作系统 (如Linux.Fre ...

  4. C# 理解Thread.Sleep()方法 ----转帖

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:1.假设现在是 2008-4-7 12:00:00.000,如果我调 ...

  5. silverLight--绑定数据dataGrid

    后台代码编写 ,为表格绑定数据: using System; using System.Collections.Generic; using System.Linq; using System.Net ...

  6. iOS多线程 GCD常见用法

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...

  7. Dancing Links & Algorithm X

    1 参考链接 http://www.cnblogs.com/steady/archive/2011/03/15/1984791.html#undefined http://en.wikipedia.o ...

  8. GridView基础知识

    首先,gridview是封装好的,直接在设计界面使用,基本不需要写代码: 1.绑定数据源 GridView最好与LinQDatasourse配合使用,相匹配绑定数据: 2.外观控制 整体控制 自动选择 ...

  9. Python小练习一

    # 对http://www.something.com形式的URL进行分割 url = input("Please enter the URL:") domain = url[11 ...

  10. hdu 1312(DFS)

    Red and Black Tme Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...