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

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

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

  


最后,小编也给大家分享一份Python学习资料和公开课,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂。

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。

点击免费领取《CSDN大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

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

相关推荐

Python全文搜索库:Whoosh和Haystack

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

AI天才研究院 1735

基于Whoosh实现的简单搜索引擎

Whoosh-WebSearching 基于Whoosh实现的简单搜索引擎。 数据来源:https://www.nankai.edu.cn/213/list.htm 实现功能:按域检索、site服务、filetype服务、热搜排行榜、Pagerank 效果展示:pic文件夹下

python写的小型搜索引擎

自己利用空闲时间写的一款再dos下运行的简单搜索引擎,可以再自己给定的网页范围内查找信息,并且下载指定网页上的内容。内中包含简单的工程文档,代码还算规范,所以不需要太多注释就基本能看懂。学习python没多久的同学可以看一下,对于学习python能够给出一定的启发

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

Python轻量级搜索工具 -- Whose

按照笔者的理解以及 Whoosh 的官方文档,Whoosh 的入门使用主要是 index 以及 query。因此,index 作为名词时,是指字段的索引,index 作为动词时,是指建立字段的索引。对于熟悉 ES 的人来说,搜索的两个重要的方面为 mapping 和 query,也就是索引的构建以及查询,背后是复杂的索引储存、query 解析以及排序算法等。关于 Whoosh 的使用,在官文文档中已经给出了详细的说明,笔者在这里只给出一个简单的例子,来说明 Whoosh 如何能方便地提升我们的搜索体验。

朱雀随云记的博客 1193

Whose一个 Python轻量级搜索工具

转自Python编程时光本文将简单介绍 Python 中的一个轻量级搜索工具 Whoosh,并给出相应的使用示例代码。# Whoosh 简介Whoosh 由 Matt Chaput 创建,它一开始是一个为 Houdini 3D 动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。Whoosh 纯由 Python 编写而成,是一个灵活的,方便的,轻量级的搜...

机器学习算法与Python学习 259

Python之利用Whoosh搭建轻量级搜索

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

山阴少年 1727

Whoosh教程

Whoosh 内置了一些分析器,但并不一定能够满足所有需求。我们可以使用自定义分析器来进行处理。以上代码为 Whoosh 提供了一个自定义的中文分析器,代替了默认的分析器。还可以通过自定义查询语法来扩展 Whoosh 的功能。以上代码为 Whoosh 提供了自定义的查询语法,允许在搜索时使用 ‘!’(非逻辑)、‘&’(与逻辑)、‘|’(或逻辑)进行条件的组合。本文介绍了 Whoosh 的基本概念、安装方法、建立索引、执行搜索以及自定义分析器和查询语法等内容。

m0_72410588的博客 1908

Whoosh:Python轻量级搜索工具

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

静觅 916

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

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

Saki_Python的博客 1280

python全文检索whoosh例子

Whoosh 是一个Python 实现的全文搜索框架,包括Analyzer、建索引、查询等功能。 先需要创建的就是 index 对象,index 对象是一个全局索引,需要先创建一个定义索引feild属性的 schema 对象。ix.writer() 获取IndexWriter 对象,IndexWriter 对象 add_document(**kwargs) 方法索引文档。 分词器和过滤器组合使用能实现复杂的分词效果。 from whoosh.qparser import QueryParser .

Jahson的专栏 1358
上一篇: 2024年华为正式员工工资一览表
下一篇: 保姆级 Stable Diffusion 教程,看完这篇就够了!
田野猫咪
博客等级 码龄3年 5012粉丝 502原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值