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. 使用poi和jfreechart生成excel图表图片

    最近项目在频繁的操作excel,里边涉及到很多和图表有关的东西.有时候需要使用java操作excel自带的图标,比较复杂的我们都是使用excel模板的形式实现. 除此之外,也有一些功能只需要生成对应的 ...

  2. 在CYGWIN下编译和运行软件Bundler ,以及PMVS,CMVS的编译与使用

    本人按照 http://blog.csdn.net/zzzblog/article/details/17166869 http://oliver.zheng.blog.163.com/blog/sta ...

  3. EJB相关的面试题

    1.EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别. (1)EJB包括Session Bean.Ent ...

  4. Codeforces Round #467 (Div. 1) B. Sleepy Game

    我一开始把题目看错了 我以为是博弈.. 这题就是一个简单的判环+dfs(不简单,挺烦的一题) #include <algorithm> #include <cstdio> #i ...

  5. hdu5925 Coconuts

    比完看acdream说这题是签到题 怎么都不会写 我现在补完也觉得 这不是傻逼题么 我我这个这么快5题的人真的不应该啊 #include<bits/stdc++.h> using name ...

  6. jQuery对象与js对象互相转换

    两种转换方式将一个jQuery对象转换成js对象:[index]和.get(index); (1)jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的js对象. 如:var $v ...

  7. RobotFramework下的http接口自动化post关键字的使用

    在http协议中,除了get请求外,另一个最常用的就是post请求了.和get 请求类似,post请求接收一个参数,[ url ] 示例1:调用博客园(http://www.cnblogs.com/) ...

  8. 二、CSS

    css基本语法及页面引用 css基本语法 css的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个值 ...

  9. Python机器学习 (Python Machine Learning 中文版 PDF)

    Python机器学习介绍(Python Machine Learning 中文版) 机器学习,如今最令人振奋的计算机领域之一.看看那些大公司,Google.Facebook.Apple.Amazon早 ...

  10. 【BZOJ1968】约数研究(数论)

    [BZOJ1968]约数研究(数论) 题面 BZOJ链接(题目是图片形式的) 题解 傻逼题 \(NOIP\) \(T1\)难度 不会做的话您可以退役 #include<iostream> ...