乐趣区

关于python:WhooshPython-的轻量级搜索工具

本文将简略介绍 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…。相比于 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 编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩 Python 电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

退出移动版