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. ffmpeg结构体以及函数介绍(二)

    1 avcodec_find_decoder() /** * Find a registered decoder with a matching codec ID. * * @param id Cod ...

  2. zTree实现获取一级节点数据

    zTree实现获取一级节点数据 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</t ...

  3. eclipse:An internal error occurred during: "Build Project". GC overhead limit exceeded

    在使用Eclipse的Build Project功能时,提示以下错误: An internal error occurred during: "Build Project". GC ...

  4. form表单的action提交写到js中来,同时onclick事件也写在js中来。其action也可以通过ajax来提交的。

    1,html脚本 <body> <div style="display: none;"> <form id="submitForm" ...

  5. JNDI在本项目中的应用

    一,在tomcat的context文件中做如下配置 <?xml version="1.0" encoding="UTF-8"?> <Conte ...

  6. 手机端仿ios的日期组件脚本一

    二,代码 <script> var calendar1 = new LCalendar(); calendar1.init({ 'trigger': '#startDate', //标签i ...

  7. 关于protected关键字

    protected,算是默认的访问作用域的超集,他们在相同包下时,都可以访问所声明的成员:但对于不同包的访问,默认访问域就不行,protected也必须是通过继承关系来访问. TestBase bas ...

  8. CF484E Sign on Fence

    题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于 ...

  9. 动态增加表单元素并获取元素的text和value提交

    以上是效果图 需求是这样的: 专家设置好条件,然后设备检测到达到相应的条件之后,设备发出提醒给用户. 这就需要专家设置好能看懂的条件之后,然后把给专家看的,正常人能看懂的条件和发送的设备的,设备能够识 ...

  10. python操作excel常用的方法

    读操作模块安装 pip install xlrd 写操作模块安装 pip install xlwt xlrd读操作 1.打开excel xl = xlrd.open_workbook('test.xl ...