Python轻量级搜索工具Whoosh的使用教程

目录
  • Whoosh简介
  • Index & query
  • 示例代码
    • 数据
    • 字段
    • 创建索引文件
    • 查询

本文将简单介绍Python中的一个轻量级搜索工具Whoosh,并给出相应的使用示例代码。

Whoosh简介

Whoosh由Matt Chaput创建,它一开始是一个为Houdini 3D动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。

Whoosh纯由Python编写而成,是一个灵活的,方便的,轻量级的搜索引擎工具,现在同时支持Python2、3,其优点如下:

  • Whoosh纯由Python编写而成,但很快,只需要Python环境即可,不需要编译器;
  • 默认使用 Okapi BM25F排序算法,也支持其他排序算法;
  • 相比于其他搜索引擎,Whoosh会创建更小的index文件;
  • Whoosh中的index文件编码必须是unicode;
  • Whoosh可以储存任意的Python对象。

Whoosh的官方介绍网站为:https://whoosh.readthedocs.io/en/latest/intro.html。相比于ElasticSearch或者Solr等成熟的搜索引擎工具,Whoosh显得更轻便,操作更简单,可以考虑在小型的搜索项目中使用。

Index & query

对于熟悉ES的人来说,搜索的两个重要的方面为mapping和query,也就是索引的构建以及查询,背后是复杂的索引储存、query解析以及排序算法等。如果你有ES方面的经验,那么,对于Whoosh是十分容易上手的。

按照笔者的理解以及Whoosh的官方文档,Whoosh的入门使用主要是index以及query。搜索引擎的强大功能之一在于它能够提供全文检索,这依赖于排序算法,比如BM25,也依赖于我们怎样储存字段。因此,index作为名词时,是指字段的索引,index作为动词时,是指建立字段的索引。而query会将我们需要查询的语句,通过排序算法,给出合理的搜索结果。

关于Whoosh的使用,在官文文档中已经给出了详细的说明,笔者在这里只给出一个简单的例子,来说明Whoosh如何能方便地提升我们的搜索体验。

示例代码

数据

本项目的示例数据为poem.csv,下图为该数据集的前十行:

poem.csv

字段

根据数据集的特征,我们创建四个字段(fields):title, dynasty, poet, content。创建的代码如下:

# -*- coding: utf-8 -*-
import os
from whoosh.index import create_in
from whoosh.fields import *
from jieba.analyse import ChineseAnalyzer
import json

# 创建schema, stored为True表示能够被检索
schema = Schema(title=TEXT(stored=True, analyzer=ChineseAnalyzer()),
                dynasty=ID(stored=True),
                poet=ID(stored=True),
                content=TEXT(stored=True, analyzer=ChineseAnalyzer())
                )

其中,ID只能为一个单元值,不能分割为若干个词,常用于文件路径、URL、日期、分类;

TEXT文件的文本内容,建立文本的索引并存储,支持词汇搜索;Analyzer选择结巴中文分词器。

创建索引文件

接着,我们需要创建索引文件。我们利用程序先解析poem.csv文件,并将它转化为index,写入到indexdir目录下。Python代码如下:

# 解析poem.csv文件
with open('poem.csv', 'r', encoding='utf-8') as f:
    texts = [_.strip().split(',') for _ in f.readlines() if len(_.strip().split(',')) == 4]

# 存储schema信息至indexdir目录
indexdir = 'indexdir/'
if not os.path.exists(indexdir):
    os.mkdir(indexdir)
ix = create_in(indexdir, schema)

# 按照schema定义信息,增加需要建立索引的文档
writer = ix.writer()
for i in range(1, len(texts)):
    title, dynasty, poet, content = texts[i]
    writer.add_document(title=title, dynasty=dynasty, poet=poet, content=content)
writer.commit()

index创建成功后,会生成indexdir目录,里面含有上述poem.csv数据的各个字段的索引文件。

查询

index创建成功后,我们就利用进行查询。

比如我们想要查询content中含有明月的诗句,可以输入以下代码:

# 创建一个检索器
searcher = ix.searcher()

# 检索content中出现'明月'的文档
results = searcher.find("content", "明月")
print('一共发现%d份文档。' % len(results))
for i in range(min(10, len(results))):
    print(json.dumps(results[i].fields(), ensure_ascii=False))

输出结果如下:

一共发现44份文档。
前10份文档如下:
{"content": "床前明月光,疑是地上霜。举头望明月,低头思故乡。", "dynasty": "唐代", "poet": "李白 ", "title": "静夜思"}
{"content": "边草,边草,边草尽来兵老。山南山北雪晴,千里万里月明。明月,明月,胡笳一声愁绝。", "dynasty": "唐代", "poet": "戴叔伦 ", "title": "调笑令·边草"}
{"content": "独坐幽篁里,弹琴复长啸。深林人不知,明月来相照。", "dynasty": "唐代", "poet": "王维 ", "title": "竹里馆"}
{"content": "汉江明月照归人,万里秋风一叶身。休把客衣轻浣濯,此中犹有帝京尘。", "dynasty": "明代", "poet": "边贡 ", "title": "重赠吴国宾"}
{"content": "秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。", "dynasty": "唐代", "poet": "王昌龄 ", "title": "出塞二首·其一"}
{"content": "京口瓜洲一水间,钟山只隔数重山。春风又绿江南岸,明月何时照我还?", "dynasty": "宋代", "poet": "王安石 ", "title": "泊船瓜洲"}
{"content": "四顾山光接水光,凭栏十里芰荷香。清风明月无人管,并作南楼一味凉。", "dynasty": "宋代", "poet": "黄庭坚 ", "title": "鄂州南楼书事"}
{"content": "青山隐隐水迢迢,秋尽江南草未凋。二十四桥明月夜,玉人何处教吹箫?", "dynasty": "唐代", "poet": "杜牧 ", "title": "寄扬州韩绰判官"}
{"content": "露气寒光集,微阳下楚丘。猿啼洞庭树,人在木兰舟。广泽生明月,苍山夹乱流。云中君不见,竟夕自悲秋。", "dynasty": "唐代", "poet": "马戴 ", "title": "楚江怀古三首·其一"}
{"content": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,还寝梦佳期。", "dynasty": "唐代", "poet": "张九龄 ", "title": "望月怀远 / 望月怀古"}

到此这篇关于Python轻量级搜索工具Whoosh的使用教程的文章就介绍到这了,更多相关Python搜索工具Whoosh内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Django实现whoosh搜索引擎使用jieba分词

    本文介绍了Django实现whoosh搜索引擎使用jieba分词,分享给大家,具体如下: Django版本:3.0.4 python包准备: pip install django-haystack pip install jieba 使用jieba分词 1.cd到site-packages内的haystack包,创建并编辑ChineseAnalyzer.py文件 # (注意:pip安装的是django-haystack,但是实际包的文件夹名字为haystack) cd /usr/local/li

  • Django之使用haystack+whoosh实现搜索功能

    为了实现项目中的搜索功能,我们使用的是全文检索框架haystack+搜索引擎whoosh+中文分词包jieba 安装和配置 安装所需包 pip install django-haystack pip install whoosh pip install jieba 去settings文件注册haystack应用 INSTALLED_APPS = [ 'haystack', # 注册全文检索框架 ] 在settings文件中配置全文检索框架 # 全文检索框架的配置 HAYSTACK_CONNECT

  • 基于python + django + whoosh + jieba 分词器实现站内检索功能

    基于 python django 源码 前期准备 安装库: pip install django-haystack pip install whoosh pip install jieba 如果pip 安装超时,可配置pip国内源下载,如下: pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com <安装的库> pip install -i http://mirrors.al

  • Django中使用Whoosh进行全文检索的方法

    Whoosh 是纯Python实现的全文搜索引擎,通过Whoosh可以很方便的给文档加上全文索引功能. 什么是全文检索 简单讲分为两块,一块是分词,一块是搜索.比如下面一段话: 上次舞蹈演出直接在上海路的弄堂里 比如我们现在想检索上次的演出,通常我们会直接搜索关键词: 上次演出 ,但是使用传统的SQL like 查询并不能命中上面的这段话,因为在 上次 和 演出 中间还有 舞蹈 .然而全文搜索却将上文切成一个个Token,类似: 上次/舞蹈/演出/直接/在/上海路/的/弄堂/里 切分成Token

  • 使用python+whoosh实现全文检索

    whoosh的官方介绍:http://whoosh.readthedocs.io/en/latest/quickstart.html 因为做的是中文的全文检索需要导入jieba工具包以及whoosh工具包 直接上代码吧 from whoosh.qparser import QueryParser from whoosh.index import create_in from whoosh.index import open_dir from whoosh.fields import * from

  • Python轻量级搜索工具Whoosh的使用教程

    目录 Whoosh简介 Index & query 示例代码 数据 字段 创建索引文件 查询 本文将简单介绍Python中的一个轻量级搜索工具Whoosh,并给出相应的使用示例代码. Whoosh简介 Whoosh由Matt Chaput创建,它一开始是一个为Houdini 3D动画软件包的在线文档提供简单.快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源. Whoosh纯由Python编写而成,是一个灵活的,方便的,轻量级的搜索引擎工具,现在同时支持Python2.3,其优点如

  • 最详细的python工具Anaconda+Pycharm安装教程

    一.介绍 Python:python代码解释器,用于编译.py代码,python可以单独安装,本次环境配置目的用于解决计算机视觉处理,因此选用安装Anaconda,Anaconda中包含python.exe以及常用的工具包. Opencv:包含大量的图像处理工具,需要配置相关环境. Pycharm:python代码常用的IDE,python开发常用工具. 本文示范安装版本如下:(在配置python+pycharm中,版本兼容性较强,没有特定的版本配合要求) Anaconda Anaconda3-

  • Python测试开源工具splinter安装与使用教程

    splinter介绍   Splinter是一个使用Python测试Web应用程序的开源工具,可以自动化浏览器操作,例如访问URL和与它们的项进行交互.例如,我们使用百度引擎搜索内容,需要再搜索框内输入关键字,再按百度一下即可以搜索想要的内容,使用Splinter可以使用pyhton脚本来实现上述过程. Splinter安装   Splinter的使用需要依赖python环境,因此首先需要装python(python安装可以直接安装anaconda集成环境,网上一搜教程很多~),并且python

  • Python通过90行代码搭建一个音乐搜索工具

    下面小编把具体实现代码给大家分享如下: 之前一段时间读到了这篇博客,其中描述了作者如何用java实现国外著名音乐搜索工具shazam的基本功能.其中所提到的文章又将我引向了关于shazam的一篇论文及另外一篇博客.读完之后发现其中的原理并不十分复杂,但是方法对噪音的健壮性却非常好,出于好奇决定自己用python自己实现了一个简单的音乐搜索工具-- Song Finder, 它的核心功能被封装在SFEngine 中,第三方依赖方面只使用到了 scipy. 工具demo 这个demo在ipython

  • python 制作本地应用搜索工具

    一.准备工作 请确保已经安装tkinter.pyperclip.threading 二.预览 1.启动 这是程序启动的主界面. 2.运行 搜索之后的界面. 3.结果 选择应用,右击鼠标复制它的下载链接. 三.设计思路 四.源代码 本次还是将GUI和搜索引擎分离开来,只要下面两个py文件在一个文件夹,结合已有的数据库就能实现上述功能. 4.1 GUI.py from tkinter import * from tkinter import ttk from tkinter import messa

  • python 制作磁力搜索工具

    不知不觉已经到了 大年三十,在此祝大家 牛年大吉,恭喜发财!今天还是要发一篇博客,是关于tkinter的一款磁力搜索GUI工具,可以帮助我们检索网络 资源. 一.准备工作 装库,主要有tkinter os threading win32 pillow 二.预览 预览我们的软件 1.启动 2.运行 3.结果 可以选择保存链接到本地,也可以选择复制链接倒剪切板. 3.1保存到本地: 保存格式为txt 3.2复制链接: 复制以后,如果存在第三方下载工具,就能在工具中打开. 三.tk源代码 设计流程就不

  • Python可视化工具Plotly的应用教程

    目录 一.简介 二.各图运用 1.柱状图 2.散点图 3.冒泡散点图 4.旭日图 5.地图图形 三.实战案例 一.简介 发展由来: 随着信息技术的发展和硬件设备成本的降低,当今的互联网存在海量的数据,要想快速从这些数据中获取更多有效的信息,数据可视化是重要的一环.对于Python语言来说,比较传统的数据可视化模块是Matplotlib,但它存在不够美观.静态性.不易分享等缺点,限制了Python在数据可视化方面的发展. 为了解决这个问题,新型的动态可视化开源模块Plotly应运而生.由于Plot

  • 用python实现一个文件搜索工具

    目录 前言 步骤 操作如下: 完整代码: 总结 前言 经常使用电脑自带的搜索很慢很卡,今天做一个搜索工具,可以搜索到隐藏的文件,而且速度也很快 步骤 导入模块 import os 检测一下输入的路径最后一位有没有/,如果没有则添加,是为了方便操作 if DIR.endswith('/') == True: pass else: DIR = DIR+'/' 用来循环检测文件,进入文件目录然后检测,再次进入检测,循环往复 def iterbrowse(path): for home, dirs, f

  • Python排序搜索基本算法之归并排序实例分析

    本文实例讲述了Python排序搜索基本算法之归并排序.分享给大家供大家参考,具体如下: 归并排序最令人兴奋的特点是:不论输入是什么样的,它对N个元素的序列排序所用时间与NlogN成正比.代码如下: # coding:utf-8 def mergesort(seq): if len(seq)<=1: return seq mid=int(len(seq)/2) left=mergesort(seq[:mid]) right=mergesort(seq[mid:]) return merge(lef

  • Python排序搜索基本算法之堆排序实例详解

    本文实例讲述了Python排序搜索基本算法之堆排序.分享给大家供大家参考,具体如下: 堆是一种完全二叉树,堆排序是一种树形选择排序,利用了大顶堆堆顶元素最大的特点,不断取出最大元素,并调整使剩下的元素还是大顶堆,依次取出最大元素就是排好序的列表.举例如下,把序列[26,5,77,1,61,11,59,15,48,19]排序,如下: 基于堆的优先队列算法代码如下: def fixUp(a): #在堆尾加入新元素,fixUp恢复堆的条件 k=len(a)-1 while k>1 and a[k//2

随机推荐