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

news2024/11/19 18:37:34

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

Whoosh 简介

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

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

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,下图为该数据集的前十行:

 图片

 字段

根据数据集的特征,我们创建四个字段(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 >

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字人的新革命,BAT的“冲高”战场

配图来自Canva可画 ChatGPT横空出世&#xff0c;让人们看到了数字人的另一种可能&#xff0c;将ChatGPT与虚拟数字人融合&#xff0c;研发出更加智能化、拟人化的虚拟数字人成为数字人厂商的新命题、新方向。 2月份&#xff0c;岭南股份、风语筑、开普云等10多家公司&#xf…

java设备台账管理系统myeclipse定制开发mysql数据库网页模式java编程jdbc

一、源码特点 java设备台账管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 mysql数据库&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 java设备台账管理系统myeclipse定制开发mysql 二、功能介绍 此次系统…

3D控件Aspose.3D入门教程(11):通过简单的步骤生成条形码

Aspose.3D 是一个功能丰富的游戏软件和计算机辅助设计&#xff08;CAD&#xff09;的API&#xff0c;可以在不依赖任何3D建模和渲染软件的情况下操作文档。API支持Discreet3DS, WavefrontOBJ, FBX (ASCII, Binary), STL (ASCII, Binary), Universal3D, Collada, glTF, GLB, PLY…

JetsonNano学习(七)Nginx 搭建 HLS 直播服务器

文章目录 一、使用 Nginx-rtmp-module 编译 Nginx下载 Nginx-rtmp-module安装 Nginx 依赖下载 Nginx编译 Nginx 二、Nginx 配置文件三、启动 Nginx 服务方式一安装nginx初始化脚本、获取nginx初始化脚本 方式二直接调用 四、使用 RTMP 将视频推送到 Nginx安装FFmpeg捕获网络摄像…

行业分析——半导体行业

半导体行业是现代高科技产业和新兴战略产业&#xff0c;是现代信息技术、电子技术、通信技术、信息化等产业的基础之一。我国政府先后制定了《中国集成电路产业发展规划》和《中国人工智能发展规划》&#xff0c;明确提出要支持半导体和人工智能等产业的发展&#xff0c;为半导…

xs _webmsxyw 纯算法还原盗用代码请注明出处搬来搬去真的很下头!

本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 最新版 x-s 没露任何版权请审核员认真对待谢谢。 【2023.05.22】 更新全站接口通用 …

【ARM位段地址分配】STM32 struct 位段内存分配位置问题

因为需要将 7位地址位 和 1位读写标志位 进行组合&#xff0c;想到了用 struct 和 union 的方法。 说明&#xff1a;作为自己测试用&#xff0c;使用硬件STM32F407ZET6 本篇文章仅对位段操作再ARM芯片上存储空间位置分配的探究&#xff0c;供给作为需要确定位段操作分配内存…

我出版了一本关于TikTok电商运营的书

回首2020年初&#xff0c;第一次在手机上下载TikTok的那个下午&#xff0c;我并没有意识到&#xff0c;未来三年多这个词会充满我的工作与生活。 那其实是非常幸福的一段时间&#xff0c;对TikTok的期待没有那么功利&#xff0c;每天刷一刷TikTok中的视频&#xff0c;再随手拍…

【1080. 根到叶路径上的不足节点】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你二叉树的根节点 root 和一个整数 limit &#xff0c;请你同时删除树中所有 不足节点 &#xff0c;并返回最终二叉树的根节点。 假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小…

『手撕 Mybatis 源码』04 - 创建 sqlSession

创建 sqlSession 创建 openSession 对象 当获取 SqlSessionFactory 之后&#xff0c;就可以开始获取 SqlSession 对象 public class MybatisTest {Testpublic void test1() throws IOException {...// 3.问题&#xff1a;openSession()执行逻辑是什么&#xff1f;// 3. (1) …

c++学习——引用

引用 **引用的语法****引用的注意事项****数组的引用****引用的本质****尽量用const来代替define****指针的引用** 1.引用是做什么:和C语言的指针一样的功能,并且使语法更加简洁 2.引用是什么∶引用是给空间取别名 引用的语法 #define _CRT_SECURE_NO_WARNINGS #include <i…

星戈瑞Sulfo-CY7 NHS ester标记带氨基的荧光Cyanine7-NHS

Sulfo-CY7 NHS ester是一种常用的蛋白质标记试剂&#xff0c;是一种高度稳定的荧光染料&#xff0c;能够被用于各种细胞成像实验中。利用这种染料&#xff0c;科学家们可以标记细胞膜、细胞核、细胞器等&#xff0c;从而观察细胞的各种结构和功能。 产品名称&#xff1a;水溶性…

似然(likelihood)、极大似然、对数似然、最大后验等

1 似然 设总体X服从分布P(x&#xff1b;θ)&#xff08;当X是连续型随机变量时为概率密度&#xff0c;当X为离散型随机变量时为概率分布&#xff09;&#xff0c;θ为待估参数&#xff08;或者说系统参数&#xff09;&#xff0c;X1,X2,…Xn是来自于总体X的样本&#xff0c;x1…

互联网医院|互联网医院系统开发|互联网医疗平台搭建

随着互联网的快速普及&#xff0c;互联网医院成为解决医疗资源分布不平衡、基层医疗服务短缺等问题的有效途径。互联网医院系统的优势主要体现在以下几个方面&#xff1a;   1.在线挂号预约   互联网医院系统可以方便快捷地进行在线预约挂号。患者可以通过小程序或网站实现…

BI大数据分析平台,精细化分析的必备工具

在日常的工作中&#xff0c;经常会遇到要做经营决策时&#xff0c;数据分析却掉链子的情况&#xff0c;比如当老板临时提出要进一步分析某类商品的销售情况时&#xff0c;得重新开发报表。BI大数据分析平台能不能随时随地实现精细化数据分析&#xff0c;避免数据分析跟不上运营…

Python实现ACO蚁群优化算法优化Catboost分类模型(CatBoostClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

Java | 一分钟掌握定时任务 | 7 - ElasticJob分布式定时任务

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案。 它通过…

pointNet、pointNet++算法学习笔记

算法结构 原理解析 已知&#xff1a; N个点&#xff0c;每个点的信息x,y,z。 MLP:全连接网络&#xff0c;输入层&#xff0c;隐藏层&#xff0c;输出层。 原理&#xff1a; &#xff08;1&#xff09;第一步 MLP 对每个点进行MLP操作&#xff0c;即&#xff1a;3–>MLP(3,C…

Spring MVC文件上传处理详解

Spring MVC文件上传处理详解 Spring MVC是Java Web开发中非常常用的框架之一&#xff0c;它提供了许多方便的功能。其中&#xff0c;文件上传是Web开发中常用的功能之一&#xff0c;本文将介绍如何使用Spring MVC处理文件上传以及相关代码实现。 文件上传的基本原理 在Web开发…

HTML-iconfont动态图标SVG效果--阿里巴巴图标矢量库

给北大打工&#xff0c;实现官网首页动态图标效果_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ys4y1c7oh/?spm_id_from333.1007.top_right_bar_window_default_collection.content.click&vd_source924f5dad6f2dcb0a3e5dca4604287ecd&#xff08;本篇笔记操作方法…