1、建立索引

#coding=utf-8
from __future__ import unicode_literals
__author__ = 'zh'
import sys,os
from whoosh.index import create_in,open_dir
from whoosh.fields import *
from jieba.analyse import ChineseAnalyzer
import pymongo
import json
from pymongo.collection import Collection
from pymongo import database class CreatIndex:
def __init__(self):
self.mongoClient = pymongo.MongoClient('192.168.229.128',27017)
self.websdb = pymongo.database.Database(self.mongoClient,'webdb')
self.pagesCollection = Collection(self.websdb,'pages')
def BuiltIndex(self):
analyzer = ChineseAnalyzer()
# 索引模版
schema = Schema(
U_id=ID(stored=True),
# md5=ID(stored=True),
title=TEXT(stored=True,analyzer=analyzer),
location=TEXT(stored=True),
publish_time=DATETIME(stored=True,sortable=True),
content=TEXT(stored=False,analyzer=analyzer)
)
from whoosh.filedb.filestore import FileStorage
storage = FileStorage("../whoosh_index")
if not os.path.exists("../whoosh_index"):
os.mkdir("../whoosh_index")
ix = storage.create_index(schema)
print '建立索引文件!'
else:
ix=storage.open_index() # if not os.path.exists("whoosh_index"):
# os.mkdir("whoosh_index")
# ix = create_in("whoosh_index", schema) # for create new index
# #ix = open_dir("tmp") # for read only
writer = ix.writer()
try:
num=0
while(True):
# break
try:
row=self.pagesCollection.find_one({'indexed':{'$exists':False}})
if row!=None:
publish_time=None
if row.has_key('publish_time'):
publish_time=row['publish_time']
if str(publish_time)=='' or str(publish_time)=='':
publish_time=None
location=''
if row.has_key('location'):
location=json.JSONEncoder().encode(row['location']) writer.add_document(
U_id=''.join(str(row['_id'])),
# md5=row['md5'],
title=row['name'],
location=''.join(location),
publish_time=publish_time,
content=row['information']
)
self.pagesCollection.update_one({"_id":row["_id"]},{"$set":{"indexed":True}})
num+=1
print row["_id"],"已建立索引!"
else:
writer.commit()
print "全部处理完毕"
# time.sleep(3600)
# self.BuiltIndex()
break
except:
print row["_id"],"异常"
break
except:
writer.commit()
print "异常"
# print '已处理',num,'共计', self.pagesCollection.find({'indexed':{'$exists':True}}).count()
print '已处理',num,'共计', self.pagesCollection.find().count() creatindext = CreatIndex()
creatindext.BuiltIndex()

注:注意编码

2、检索

from __future__ import unicode_literals
#coding=utf-8
__author__ = 'zh'
# from whoosh.qparser import QueryParser
from whoosh import qparser,sorting
# from jieba.analyse import ChineseAnalyzer
from whoosh.index import open_dir
from whoosh.query import *
# import pymongo
import datetime
# from pymongo.collection import Collection
# from pymongo import database class FullText:
def __init__(self,index_home='whoosh_index'):
self.index_home = index_home
self.ix = open_dir(self.index_home)
self.searcher = self.ix.searcher() # 全文检索,目前主要利用关键字
def Query(self,parameter):
# analyzer = ChineseAnalyzer()
# ix = open_dir(self.index_home) # for read only # searcher = ix.searcher()
# print ix.schema['content']
# 按照字段查询,可联合查询,MultifieldParser
list=parameter['keys']
if len(list)==1:
parser = qparser.QueryParser(list[0], schema=self.ix.schema)
if len(list)>1:
parser = qparser.MultifieldParser(list, schema=self.ix.schema)
# else:
# return None
# print ix.schema
keywords = parameter['keywords']
# print keywords
q = parser.parse(keywords) # mf = sorting.MultiFacet()
scores = sorting.ScoreFacet()
date = sorting.FieldFacet("publish_time", reverse=True) # 是否分页返回OR全部返回,默认全部返回
_limit=None
if parameter.has_key('page') and parameter.has_key('pagesize'):
page=parameter['page']
pagesize=parameter['pagesize']
if page > 0 and pagesize !=0:
_limit=page*pagesize # 是否按照location字段过滤,默认不过滤
allow_q=None
if parameter.has_key('includeFields') and parameter['includeFields'].__contains__(u'location'):
allow_q = qparser.query.Term("location", u"coordinates") # 时间分组,暂时不用
# start = datetime.datetime(2000, 1, 1)
# end = datetime.datetime.now()
# gap = datetime.timedelta(days=365)
# bdayfacet = sorting.DateRangeFacet("publish_time", start, end, gap) results = self.searcher.search(q, limit=_limit,filter=allow_q,sortedby=[scores,date])
# results = searcher.search(q, limit=_limit,filter=restrict_q,
# groupedby=bdayfacet,sortedby=[scores,date])
# print results.estimated_length()
return results
fulltext_query = fulltext.FullText()

注:支持多字段检索、分类、排序等

whoosh参考提供陕西省POI数据(300万条,sqlserver备份文件

利用whoosh对mongoDB的中文文档建立全文检索的更多相关文章

  1. python 搜索引擎Whoosh中文文档和代码 以及jieba的使用

    注意, 数据库的表最好别有下划线 中文文档链接: https://mr-zhao.gitbooks.io/whoosh/content/%E5%A6%82%E4%BD%95%E7%B4%A2%E5%B ...

  2. Phoenix综述(史上最全Phoenix中文文档)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...

  3. Django 1.10中文文档—第一个Django应用Part1

    在本教程中,我们将引导您完成一个投票应用程序的创建,它包含下面两部分: 一个可以进行投票和查看结果的公开站点: 一个可以进行增删改查的后台admin管理界面: 我们假设你已经安装了Django.您可以 ...

  4. 【Chromium中文文档】OS X 沙箱设计

    OS X 沙箱设计 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/OSX ...

  5. 【Chromium中文文档】Chrome/Chromium沙箱 - 安全架构设计

    沙箱 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Sandbox.ht ...

  6. openstack中文文档

    http://www.openstack.cn/p392.html   openStack Hacker中文文档 http://docs.mirantis.com/fuel-dev/develop/a ...

  7. 【Chromium中文文档】进程模型

    进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Process_ ...

  8. 【Chromium中文文档】Web安全研究

    转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Extension_Sec ...

  9. Visual Studio Code中文文档

    Visual Studio Code中文文档 Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行. ...

随机推荐

  1. 分析Android-Universal-Image-Loader的缓存处理机制

    最近看了UIL中的缓存实现,才发现其实这个东西不难,没有太多的进程调度,没有各种内存读取控制机制.没有各种异常处理.反正UIL中不单代码写的简单,连处理都简单.但是这个类库这么好用,又有这么多人用,那 ...

  2. R语言︱机器学习模型评估方案(以随机森林算法为例)

    笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...

  3. php学习笔记upset函数。

    如果在函数中我们不希望再使用某个变量.可以使用unset()销毁函数, ②在php函数中,我们可以给某些参数赋一个默认初值. ③可以传一个默认的参数. ④php在传递变量的时候,默认是传递值传递,如果 ...

  4. Java利用递归算法统计1-6的数组排列组合数

    Java利用递归算法统计1-6的数组排列组合数 1.设计源码 /** * @Title:ArrayCombination.java * @Package:com.you.data * @Descrip ...

  5. ssh_Connection reset by peer报错

    连接SSH时,产生了一下错误----->Read from socket failed: Connection reset by peer 首先查看日志 tail -f /var/log/aut ...

  6. 【转】Nginx的启动、停止与重启

    Nginx的启动.停止与重启 启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@LinuxServer sbin]# /usr/local/nginx/sb ...

  7. 编译器重复定义错误:error C2371: 'SIZE' : redefinition; different basic types

    我们常常会定义自己工程用的数据类型,可能会与Windows的基本数据类型冲突. vs会报重复定义错误:error C2371: 'SIZE' : redefinition; different bas ...

  8. 【Luogu1471】方差(线段树)

    [Luogu1471]方差(线段树) 题面 这种傻逼题...自己去看把.. 题解 这题太傻比了 把方差公式拆开 维护平方和和区间和 修改就把平方和的公式拆开 简直傻逼的题目 #include<i ...

  9. 【CJOJ1644】【洛谷2758】编辑距离

    题面 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: 皆为小 ...

  10. 【洛谷1541】【CJOJ1087】【NOIP2010】乌龟棋

    题面 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌 ...