分享Python 的轻量级搜索工具 -- Whoosh

python全文检索库:whoosh Schema 定义了索引的结构,包括字段名称和类型。我的理解就是相当于数据库的建表操作其中stored用于指明是否存储该项的具体值如果为True可以再搜索结果中直接访问到这个字段如果为False的话就只能进行搜索,但是在结果中是无法直接访问具体内容的。原因是倒排索引本身只会建立词元到记录之间的映射关系,并不会保存记录本身。要显示保存记录才能在搜索结果中访问。 阅读详情

本文将简单介绍 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": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,  

---------------------------END---------------------------

题外话

感谢你能看到最后,给大家准备了一些福利!

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img

二、Python兼职渠道推荐*

学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
在这里插入图片描述

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

PythonWhoosh:全流程自建搜索引擎 在创建索引之前,首先需要定义架构。这可以通过模块来实现。FieldType描述使用场景TEXT存储文本内容,支持分词和搜索文章内容、评论、描述等文本字段ID存储唯一标识符,通常用于标识文档文档ID、路径、用户ID等NUMERIC存储数字值,可以用于范围查询年龄、价格、评分等数值字段BOOLEAN存储布尔值(True/False)标记状态、启用/禁用等DATETIME存储日期和时间,支持日期范围查询创建时间、更新时间等KEYWORD存储单一值的关键字,适合用于精确匹配。 阅读详情

相关推荐

Python轻量级搜索方案:Whoosh+Jieba打造个人知识库全文检索(附避坑指南)

本文详细介绍了如何利用PythonWhoosh库结合Jieba中文分词,构建一个轻量级的本地全文搜索引擎,用于个人知识库管理。文章提供了从环境配置、索引构建到高级查询优化的完整实践指南,并分享了性能调优和实战避坑经验,帮助开发者快速实现高效的中文全文检索功能。

weixin_29048309的博客 354

Python全文搜索库:Whoosh和Haystack

Python全文搜索库:Whoosh和Haystack 1.背景介绍 1.1 什么是全文搜索? 全文搜索(Full-Text Search)是一种在大量非结构化或半结构化的数据中查找相关信息的技术。与传统的数据库查询不

AI天才研究院 1735

Python轻量级搜索神器Whoosh实战:5分钟搞定中文全文检索(附Jieba分词配置)

本文介绍了如何使用Python轻量级搜索引擎Whoosh快速构建中文全文检索系统。通过集成Jieba分词器解决中文分词难题,文章详细展示了从环境配置、索引创建到实战搜索的完整流程,并对比了Whoosh与传统SQL模糊查询的性能优势,为中小型项目提供了高效、易用的搜索解决方案。

weixin_29100399的博客 403

python的全文检索库Whoosh使用示例

pip install whoosh 首先,我有一个xiaoshuo文件夹,装了几部小说 直接上代码: 首先是创建索引的文件 from whoosh.filedb.filestore import FileStorage from whoosh.fields import * from jieba.analyse import ChineseAnalyzer import os analy...

李孟笛的博客 2356

一个Python轻量级搜索工具--Whose

Whoosh 由 Matt Chaput 创建,它一开始是一个为 Houdini 3D 动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。Whoosh 纯由 Python 编写而成,是一个灵活的,方便的,轻量级搜索引擎工具,现在同时支持 Python2、3,其优点如下:Whoosh 纯由 Python 编写而成,但很快,只需要 Python 环境即可,不需要编译器;默认使用 Okapi BM25F 排序算法,也支持其他排序算法;

Python栈_基的博客 1170

WhooshPython轻量级搜索工具

这是「进击的Coder」的第 695篇技术分享来源:恋习 Python“ 阅读本文大概需要 8 分钟。 ”本文将简单介绍 Python 中的一个轻量级搜索工具 Whoosh,并给出相应的使用示例代码。Whoosh 简介  Whoosh 由 Matt Chaput 创建,它一开始是一个为 Houdini 3D 动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成...

静觅 916

json schema生成工具_WhooshPython轻量级搜索工具

?“Python猫” ,一个值得加星标的公众号花下猫语:周末愉快啊!今天还是给大家分享一篇文章。既然你已点进来看了,那说明你对此话题应该是感兴趣的,希望你读后有所收获吧。Best wishes!来源:Python爬虫与算法作者:jclian《犬夜叉》| 请支持B站正版本文将简单介绍Python中的一个轻量级搜索工具Whoosh,并给出相应的使用示例代码。Whoosh简介   Whoo...

weixin_39576294的博客 386

PythonWhoosh:从零构建轻量级搜索引擎实战指南

本文详细介绍了如何使用PythonWhoosh库从零构建轻量级搜索引擎,涵盖索引构建、查询优化、中文搜索处理等实战技巧。Whoosh作为纯Python实现的搜索库,具有零依赖、内存友好和开发效率高等优势,特别适合中小型项目快速实现站内搜索功能。

weixin_29042035的博客 154

Python Whoosh实战:5分钟搭建你的第一个本地搜索引擎(附完整代码)

本文详细介绍了如何使用PythonWhoosh库快速搭建本地搜索引擎。通过5分钟实战教程,从环境配置、索引创建到中文分词集成,手把手教你构建一个功能完整的搜索应用,并附有完整的Flask API示例代码,是Python开发者实现轻量级全文检索的理想选择。

o5p6q的博客 447

有没有可以搜索python程序的软件-python搜索功能

广告关闭2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品。未来,我们一起乘风破浪,创造无限可能。ios开发如果之前没接触过除了c和c++(c++太难了,不花个十来年基本不可能精通)的语言,第二门语言最好的选择就是python.原因就是1. 语法简单2. 库太多,随便想要什么功能的库都找得到,简直编程界的哆啦a梦. 3.语法优美,不信? 你去看看python超过两千行的代...

weixin_37988176的博客 984

【亲测免费】 推荐项目:Kerko —— 构建强大文献搜索界面的利器

推荐项目:Kerko —— 构建强大文献搜索界面的利器 在学术研究和知识管理领域,高效地分享和探索文献库是至关重要的。今天,我们向您隆重推介一款开源神器——Kerko,它完美结合了Zotero参考管理器的力量与现代网页应用的便捷性,为您提供了一站式的文献搜索与浏览解决方案。 项目介绍 Kerko是一个轻量级的web组件,旨在为使用Zotero管理的文献库提供直观且功能强大的在线检索和导航界面。通...

gitblog_00161的博客 548

1小时搭建BM25搜索引擎原型

善用现有库:不要重复造轮子,成熟的库能节省大量时间聚焦核心功能:原型阶段不必追求完美,够用就行保持简单:简洁的代码和界面更容易维护和扩展提供示例:帮助用户快速理解和使用整个过程从零开始到完成,大约花了1小时左右。这让我深刻体会到,借助现代开发工具和库,实现一个可用的原型可以如此高效。如果你想尝试这个BM25搜索引擎原型,或者有类似的项目需求,可以试试InsCode(快马)平台。它提供了在线的开发环境,无需配置本地环境就能快速实现和测试这类项目。

SilverfoxOwl19的博客 294

自己电脑搭建个人知识库,一般电脑也能玩(支持通义千问、GPT等)。零基础入门到精通,看这篇就够了!赶紧收藏!

既不花钱,一般电脑又能玩的方案,一句话总结:本地大模型(qwen:7b)+ 文档搜索工具whoosh)使用此方案搭建的LLM+个人知识库,网页界面demo如下:若提问内容在我们的文档系统中,输出哪些文档命中,包括内容,然后大模型Qwen自动对内容进行深度分析。总体来说,这种模式充分发挥了高性能检索+LLM问答的两者优势,用起来还是挺舒服的。

bagell的博客 2646

BM25算法解析:AI如何优化搜索排序

下面我会拆解整个实现过程,特别适合想了解搜索原理或需要快速搭建简易搜索系统的朋友。上开发特别顺畅,它的在线编辑器可以直接运行调试Python代码,还能一键部署成可访问的Web服务。我测试时将包含10万条数据的索引构建时间从本地环境的15秒缩短到平台上的8秒,搜索响应基本在200ms内完成。对于想快速验证搜索算法效果的同学,这种免配置的开发环境确实省心。特别是部署环节,传统方式需要自己折腾服务器和Nginx配置,在InsCode上点击按钮就能生成可分享的演示链接,连前端界面都能实时预览修改效果。

SilverMoon18的博客 387

比直接访问更高效:Python官网内容本地化方案

作为一名Python开发者,经常需要查阅官方文档,但每次访问官网等待加载、网络延迟等问题实在影响效率。为了解决这个问题,我尝试开发了一个Python文档本地化系统,实现秒级搜索响应,体验比官网快10倍。下面分享我的实现思路和经验。的一键部署功能后,整个项目可以快速上线,不需要手动配置Python环境和数据库。平台提供了完整的运行环境,还能随时通过网页访问,非常方便。如果你也是Python开发者,不妨试试这个方案,相信能大幅提升你的开发效率。这个过程平均耗时约5-10秒,如果网络不好可能更久。

MoonbeamRaven28的博客 381

用快马 AI 轻松打造你的高效桌面:iTop Easy Desktop 替代方案

对于想DIY效率工具又不想折腾环境的开发者,这种全在线的方式确实能节省大量时间。从有个想法到产出可用的工具,前后只用了两个周末,这在传统开发模式下很难想象。不过作为开发者,我更想定制一个符合自己习惯的解决方案。如果你也受困于Windows桌面管理的低效,不妨试试用快马平台快速打造属于自己的解决方案。作为程序员和效率工具爱好者,我一直追求用技术优化日常工作流。开发了一个轻量级桌面管理工具分享下从构思到落地的全过程。在InsCode上完成开发后,最惊喜的是其。通过注册表持久化用户自定义布局。

IndigoNight21的博客 845

零基础搭建个人网盘搜索引擎

数据库选用轻量级的SQLite,不需要额外安装,直接通过Python内置模块就能操作。支持的文件类型包括常见的文档、图片、视频等格式,通过文件后缀名就能识别分类。作为一个非科班出身的新手,我摸索出了一个简单易行的方案,分享给同样有需求的朋友们。遇到卡壳时,平台内置的AI辅助能快速给出解决方案,比自己查资料效率高多了。过程中遇到的主要问题是中文搜索的准确性,后来发现需要确保数据库和Python代码使用统一的UTF-8编码。最惊喜的是可以一键部署,不用折腾服务器配置,生成链接就能分享给朋友测试。

SilvermistRaven28的博客 469

TinyTroupe:轻量级智能体协作范式实战指南

智能体(Agent)是当前AI工程化落地的核心范式,其本质是将复杂任务分解为可编排、可观测、可替换的角色协同流程。相比依赖大模型单点推理的传统方案,分工明确的多智能体架构显著提升可控性、可观测性与调试效率,尤其适用于边缘计算、教育实验、RAG原型验证等资源受限场景。TinyTroupe作为典型轻量级实现,不训练新模型,而是基于Python+Pydantic+LangChain构建静态契约式协作骨架,支持Planner/Retriever/Analyzer/Synthesizer四角色解耦运行,并内置双通道检

weixin_30617797的博客 293
上一篇: Python 的八个实用的“无代码”特性
下一篇: 详解5个Python自动化探索性数据分析库
Python_P叔
博客等级 码龄3年 5358粉丝 827原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值