Whoosh模块

Whoosh模块

纯Python的全文搜索库,Whoosh是索引文本及搜索文本的类和函数库。它能让你开发出一个个性化的经典搜索引擎。
Whoosh 自带的是英文分词,对中文分词支持不太好,使用 jieba 替换 whoosh 的分词组件。

索引查找

索引查找是在索引表和主表(线性表的索引存储结构)上进行查找。索引查找的过程:

  • 根据给定的索引值k1,在索引表上查找出索引值等于k1的索引项,来确定k1对应的子表在主表中的开始位置和长度。
  • 再根据给定的关键字k2,在对应的子表中查找出关键字等于k2的元素(节点)。

对于一个list类型的数据,python有专门的内置函数index()进行索引查找。但是这个索引查找的复杂度是O(n),当数据量大了,就不能满足速度上的追求。

安装

pip install whoosh

使用

  1. 建立索引和模式对象
  2. 写入索引文件
  3. 搜索

建立索引模式

>>> from whoosh.fields import *
>>> schema = Schema(title=TEXT, path=ID, content=TEXT)

title、path、content就是字段,每个字段对应索引查找标准文件的一部分信息,上面的例子中就是建立索引的模式:索引内容包括title、path、content,一个字段建立了索引,就是可以被搜索到,也能够被存储。

>>> schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT)

在字段后面添加了stored=True,意味着返回字段的搜索结果。

  • ID:只能为一个单元值,不能分割为若干个词,常用于文件路径、URL、日期、分类。
  • STORED:该字段随文件保存,但是不能被索引,也不能被查询,常用来显示文件信息。
  • KEYWORD:用空格或者逗号分隔的关键词,可以被索引和搜索,不支持词汇搜索。
  • TEXT:文件的文本内容,建立文本的索引并存储,支持词汇搜索。
  • NUMERIC:数字类型,保存整数或浮点数。
  • BOOLEAN:布尔类型
  • DATETIME:时间对象类型

建立索引存储目录

索引模式建立后,还要建立索引存储目录。

import os.path
from whoosh.index import create_in
from whoosh.index import open_dir
if not os.path.exists('index'):     #如果目录index不存在则创建
    os.mkdir('index') 
ix = create_in("index",schema)      #按照schema模式建立索引目录
ix = open_dir("index")             #打开该目录一遍存储索引文件
  • create_in:创建一个具有当前索引模式的索引存储目录对象,所有的索引将被保存在该目录中。
  • open_dir:打开该目录

写入索引文件

写入索引内容

writer = ix.writer()
writer.add_document(title=u'document', content=u'this is my')
writer.add_document(title=u"my second document", content=u"this is my second document", path=u"/b", tags=u"second short", icon=u"/icons/sheep.png")
writer.commit()
  • 字段的值必须是unicode类型
  • 不是每个字段都必须赋值

搜索

开始搜索,新建立一个对象。

from shoosh.qparser import QueryParser
ix = open_dir("index")
with ix.searcher() as searcher:
    query = QueryParser('content', ix.schems).parse('second')
    result = searcher.search(query)
    result[0]

直接构建query对象

from whoosh.query import And, Or, Term
query = And([Term('content',u'apple'), Term('content', u'bar')])    # 解析查询字符串后,生成一个`query`对象。

query对象为参数调用searchersearch方法,查询得到result,默认的search方法最多返回10个匹配文档,想要返回更多,就使用limit参数,设置None就是全部。

使用查询结果

  1. scoring:result文档列表使用score值来排序,whoosh.scoring模块包含多个不同scoring算法的实现,默认BM25F
  2. 过滤结果:对searcher对象的search方法使用filter参数,可以限定results中允许的文档,mask参数限定results中不允许的文档。
  3. 合并results对象:
    • Results.extend(results):把results加在Results后。
    • Results.filter(results):把results中的文档从Results中移除
    • Results.upgrade(results):把出现在results中的Results文档,移到Results的前头
    • Results.upgrade_and_extend(result),出现在results中的Results文档,移动到Results的前头,而那些不在Results中的results文档,则添加到Results后头。

ChineseAnalyzer for Whoosh搜索引擎

from jieba.analyse import ChineseAnalyzer
analyzer = ChineseAnalyzer()
schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT(stored=True, analyzer=analyzer))
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值