您现在的位置是:首页 > 编程 > 

Whose:轻量级搜索引擎工具

2025-07-21 11:14:33
Whose:轻量级搜索引擎工具 # Whoosh 简介Whoosh 由 Matt Chaput 创建,它一开始是一个为 Houdini D 动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。 Whoosh 纯由 Python 编写而成,是一个灵活的,方便的,轻量级的搜索引擎工具,现在同时支持 Python2、,其优点如下:Whoosh 纯由 Py

Whose:轻量级搜索引擎工具

# Whoosh 简介

Whoosh 由 Matt Chaput 创建,它一开始是一个为 Houdini D 动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。 Whoosh 纯由 Python 编写而成,是一个灵活的,方便的,轻量级的搜索引擎工具,现在同时支持 Python2、,其优点如下:

  • Whoosh 纯由 Python 编写而成,但很快,只需要 Python 环境即可,不需要编译器;
  • 默认使用 Okapi BM25F 排序算法,也支持其他排序算法;
  • 相比于其他搜索引擎,Whoosh 会创建更小的 index 文件;
  • Whoosh 中的 index 文件编码必须是 unicode;
  • Whoosh 可以储存任意的 Python 对象。

Whoosh 的官方介绍网站为:.html 。相比于 ElasticSearch 或者 Solr 等成熟的搜索引擎工具,Whoosh 显得更轻便,操作更简单,可以考虑在小型的搜索项目中使用。

# Index & query

对于熟悉 ES 的人来说,搜索的两个重要的方面为 mapping 和 query,也就是索引的构建以及查询,背后是复杂的索引储存、query 解析以及排序算法等。如果你有 ES 方面的经验,那么,对于 Whoosh 是十分容易上手的。 按照笔者的理解以及 Whoosh 的官方文档,Whoosh 的入门使用主要是 index 以及 query。搜索引擎的强大功能之一在于它能够提供全文检索,这依赖于排序算法,比如 BM25,也依赖于我们怎样储存字段。因此,index 作为名词时,是指字段的索引,index 作为动词时,是指建立字段的索引。而 query 会将我们需要查询的语句,通过排序算法,给出合理的搜索结果。 关于 Whoosh 的使用,在官文文档中已经给出了详细的说明,笔者在这里只给出一个简单的例子,来说明 Whoosh 如何能方便地提升我们的搜索体验。

# 示例代码

字段

根据数据集的特征,我们创建四个字段(fields):title, dynasty, poet, content。创建的代码如下:

代码语言:javascript代码运行次数:0运行复制
# -*- 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 选择结巴中文分词器。

创建索引文件

接着,我们需要创建索引文件。我们利用程序先解析 文件,并将它转化为 index,写入到 indexdir 目录下。Python 代码如下:

代码语言:javascript代码运行次数:0运行复制
# 解析文件
with open('', '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.(indexdir):
    (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)
writermit()

index 创建成功后,会生成 indexdir 目录,里面含有上述 数据的各个字段的索引文件。

查询

index 创建成功后,我们就利用进行查询。 比如我们想要查询 content 中含有明月的诗句,可以输入以下代码:

代码语言:javascript代码运行次数:0运行复制
# 创建一个检索器
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))

输出结果如下:

代码语言:javascript代码运行次数:0运行复制
一共发现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": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-05-09,如有侵权请联系 cloudcommunity@tencent 删除搜索引擎工具排序算法搜索索引

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1169964.html

相关标签:无
上传时间: 2025-07-21 07:28:43
留言与评论(共有 19 条评论)
本站网友 雁栖湖农家院
21分钟前 发表
schema) # 按照schema定义信息
本站网友 哈尔滨远大购物中心
6分钟前 发表
搜索的两个重要的方面为 mapping 和 query
本站网友 温水煮青蛙是什么意思
4分钟前 发表
Whoosh 会创建更小的 index 文件;Whoosh 中的 index 文件编码必须是 unicode;Whoosh 可以储存任意的 Python 对象
本站网友 骗子公布
8分钟前 发表
Whoosh 纯由 Python 编写而成
本站网友 咬住下唇
18分钟前 发表
"title"
本站网友 哪里网页建设便宜
0秒前 发表
ensure_ascii=False))输出结果如下:代码语言:javascript代码运行次数:0运行复制一共发现44份文档
本站网友 ca4126
28分钟前 发表
常用于文件路径
本站网友 山东药品集中采购平台
27分钟前 发表
并作南楼一味凉
本站网友 淘乐网
1分钟前 发表
"唐代"
本站网友 普大喜奔
17分钟前 发表
关于 Whoosh 的使用
本站网友 保税区二手房网
21分钟前 发表
"title"
本站网友 中央海岸
9分钟前 发表
可以考虑在小型的搜索项目中使用
本站网友 艾克里里
10分钟前 发表
dynasty
本站网友 整车贴膜
4分钟前 发表
比如 BM25
本站网友 ogi
18分钟前 发表
比如 BM25
本站网友 产后抑郁症的治疗
4分钟前 发表
Whoosh 纯由 Python 编写而成
本站网友 反其道而行
20分钟前 发表
texts = [_.strip().split('
本站网友 寺院晚课
26分钟前 发表
poet=ID(stored=True)