Python搜索神器:轻量级Whoosh助力搜索体验

原文标题:Whose,一个 Python 的轻量级搜索工具!

原文作者:机器学习算法与Python学习

冷月清谈:

**Whoosh轻量级搜索引擎介绍**

Whoosh是由Python编写的一个轻量级、灵活且易用的搜索引擎工具,适合小型搜索项目,其优点包括:

  • 纯Python实现,无需编译器。
  • 默认使用Okapi BM25F排序算法(支持其他算法)。
  • 创建更小的索引文件。
  • 支持存储任意Python对象。

Whoosh使用入门

Whoosh的主要操作包括构建索引(index)和查询(query)。index用于建立字段索引,query用于执行搜索并返回结果。

示例代码

本例展示了如何使用Whoosh创建索引并进行查询。我们以poem.csv数据集为例,包含标题、朝代、作者和内容等字段。

from whoosh.index import create_in
from whoosh.fields import Schema, TEXT, ID
from jieba.analyse import ChineseAnalyzer

schema = Schema(
    title=TEXT(stored=True, analyzer=ChineseAnalyzer()),
    dynasty=ID(stored=True),
    poet=ID(stored=True),
    content=TEXT(stored=True, analyzer=ChineseAnalyzer())
)

# 创建索引
ix = create_in('indexdir', 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()

# 查询
searcher = ix.searcher()
results = searcher.find("content", "明月")

互动讨论

  1. Whoosh与其他搜索引擎(如ElasticSearch、Solr)相比有哪些优缺点?
  2. Whoosh在哪些场景下更适合使用?
  3. 除了示例代码中演示的全文搜索外,Whoosh还支持哪些高级搜索功能?



怜星夜思:


1、Whoosh与其他搜索引擎(如ElasticSearch、Solr)相比有哪些优缺点?
2、Whoosh在哪些场景下更适合使用?
3、除了示例代码中演示的全文搜索外,Whoosh还支持哪些高级搜索功能?

原文内容

转自Python编程时光

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


往期推荐






商务合作 | 交流学习 | 送书活动

添加vx:yuliang-bj(备注姓名-单位)

整理不易,点赞

Whoosh支持多种高级搜索功能,包括:

  • **短语搜索:**搜索特定的词组或短语,将这些词组合在一起匹配。
  • **通配符搜索:*使用通配符(如星号)匹配搜索词的不同变体。
  • **范围搜索:**按指定范围搜索数值或日期字段。
  • **布尔搜索:**使用AND、OR、NOT等布尔运算符组合搜索词。

**Whoosh的长处在于其轻量级和易用性,**适用于小型搜索项目或资源受限的环境。**ElasticSearch和Solr则功能更强大,**适合大型搜索系统或需要复杂搜索功能的场景。

Whoosh适合以下场景:

  • **小型的个人或团队项目:**Whoosh简单易用,开发成本低。
  • **嵌入式搜索功能:**Whoosh可以轻松集成到其他应用程序中,提供搜索功能。
  • **教育和研究:**Whoosh可用于演示搜索引擎的基本原理或 进行小规模文本检索实验。

**用一个例子来说明短语搜索,**你可以搜索“李白 月亮”来查找包含“李白”和“月亮”这两个词的文档。

优点:

  • 轻量级,对资源消耗较低。
  • 纯Python实现,便于集成和部署。
  • 快速,建立索引和查询速度较快。

缺点:

  • 功能性相对较弱,缺少一些高级搜索功能。
  • 并发能力较差,不适合高并发场景。

一个简单的例子就是,在一个本地计算机上建立个人博客或网站的搜索功能。