尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Whoosh 全文搜索存储与编码扩展:自定义 Codec 与存储后端完整指南

Whoosh 全文搜索存储与编码扩展:自定义 Codec 与存储后端完整指南 Whoosh 全文搜索存储与编码扩展自定义 Codec 与存储后端完整指南【免费下载链接】whooshPure-Python full-text search library项目地址: https://gitcode.com/gh_mirrors/who/whooshWhoosh 是一个纯 Python 实现的全文搜索库无需编译、无需外部服务几行代码就能为你的应用加上强大的全文检索能力。很多使用 Whoosh 的开发者都知道它搜索快、索引方便但很少有人深入它的引擎盖之下——其实 Whoosh 的设计非常优雅它把索引的存储位置存储后端和索引的读写格式Codec 编码器彻底解耦。这意味着你可以把索引存进内存、存成单文件、甚至存进数据库也可以自定义底层的编码格式。本文就带你从零理解 Whoosh 的存储与编码扩展机制学会自定义 Codec 与存储后端。为什么需要理解 Whoosh 的存储与编码机制绝大多数教程都教你这样创建索引from whoosh.index import create_in ix create_in(indexdir, schema)一行代码搞定但这背后隐藏了两个关键问题索引文件放在哪里索引内容用什么格式写入默认情况下Whoosh 会把索引写成磁盘目录下的一组文件并用内置的 W3Codec 编码。当你遇到以下需求时就必须深入了解这两层架构 索引量很大希望减少磁盘占用或提升读写速度 希望把索引完全放在内存中如内存搜索引擎、临时测试 希望把整个索引打包成一个文件方便分发和移动 希望接入数据库、对象存储等自定义存储介质 希望自定义索引文件的二进制格式压缩、加密、加密格式等理解了Codec与Storage这两个扩展点上述需求都能轻松实现。Codec 是什么一文看懂 Whoosh 编码器架构Codec编码器负责定义索引数据在磁盘/存储上的读写格式包括词项倒排表、向量、列存储、文档元数据等所有内容的序列化与反序列化。Whoosh 内置的三种 CodecWhoosh 在 codec 模块中提供了三类编码器各有用途Codec位置特点适用场景W3Codecwhoosh3.py默认编码器压缩与块式倒排磁盘索引的标准格式绝大多数生产场景MemoryCodecmemory.py纯内存实现零落盘内存索引、临时测试自定义 Codec你的代码完全自定义读写格式特殊压缩、加密、兼容旧数据在 codec/init.py 中default_codec()返回的就是W3Codec它也是所有磁盘索引的默认选择。W3Codec 的三大可调参数默认编码器 W3Codec 初始化时支持三个性能相关参数对新手来说非常实用blocklimit倒排表分块大小默认 128影响读取时的跳跃粒度compression压缩级别默认 3数值越大压缩率越高但写入更慢inlinelimit小倒排表直接内联进词项信息默认 1减少随机 IO想知道自己用的格式W3Codec 在文件头写入了WHOOSH3_HEADER_MAGIC b(W3Bl)魔数用于标识版本见 whoosh3.py倒排表文件使用.trm词项索引、.pst倒排表、.vps向量倒排、.col列存储等扩展名。Codec 接口核心方法一览所有编码器都要继承 Codec 基类核心抽象方法包括per_document_writer()按文档写入器存储字段、向量、列field_writer()倒排索引写入器postings_writer()/postings_reader()倒排表读写terms_reader()词项字典读取per_document_reader()按文档读取new_segment()创建新段Segment更妙的是Whoosh 还提供了 WrappingCodec 这个包装器基类你只需要继承它并覆写个别方法就能在不重写整个编码器的前提下给默认格式加一层自定义逻辑比如写入前加密、统计日志。这是自定义 Codec 最快捷的入口。存储后端Whoosh 索引到底放在哪里如果说 Codec 决定怎么写那么 Storage存储后端就决定写在哪。Whoosh 把存储抽象成虚拟扁平文件系统所有的文件读写、锁、改名、删除都通过Storage对象完成。基类定义在 filestore.py。Whoosh 内置的四种存储后端存储后端位置特点典型场景FileStoragefilestore.py磁盘目录支持 mmap 内存映射默认选择持久化索引RamStoragefilestore.py纯内存存储内存搜索引擎、快速测试CompoundStoragecompound.py把多个文件打包成单文件索引分发、移动、压缩包OverlayStoragefilestore.py叠加两层存储读优先第一层写走第二层只读基索引 增量覆盖最常用的两个存储FileStorage 与 RamStorage磁盘目录存储 FileStorage是最常用的后端核心用法from whoosh.filedb.filestore import FileStorage from whoosh.fields import Schema, TEXT schema Schema(titleTEXT(storedTrue), contentTEXT) st FileStorage(indexdir).create() # 创建目录 ix st.create_index(schema) # 建索引注意FileStorage支持supports_mmapTrue默认开启会用内存映射方式打开文件读索引更快网络文件系统如 NFS上建议设为False。内存存储 RamStorage则完全把索引放在 RAM 中读写都在内存完成适合不需要持久化的临时场景from whoosh.filedb.filestore import RamStorage st RamStorage() ix st.create_index(schema)内存索引的速度优势非常明显但重启即失请勿用于需要长期保存数据的场景。单文件索引CompoundStorage 的妙用如果你希望把整个索引变成一个文件方便拷贝可以用compound模块from whoosh.filedb.compound import CompoundStorage它把多个索引文件合并打包生成一个可整体移动的单一文件非常适合作为附件、缓存或分发包。自定义 Codec 的快速上手方法对于大多数开发者自定义 Codec 最常见的方式是继承WrappingCodec包装默认编码器只覆写关心的部分。核心流程如下继承WrappingCodec传入被包装的W3Codec实例覆写需要定制的读写方法例如postings_writer增加压缩逻辑在写入器writer中传入你的 codecWhoosh 的写入器在 writing.py 中通过default_codec()获取编码器你可以在创建 writer 时手动指定from whoosh.codec.whoosh3 import W3Codec # 自定义参数更高压缩、更小块 my_codec W3Codec(blocklimit64, compression9, inlinelimit2) w ix.writer() # 具体传入方式见写作 API 文档如果你是高级用户还可以参考 MemoryCodec 的实现——它演示了一个完整 Codec 如何与存储配合是学习自定义编码器格式的绝佳范例。自定义存储后端的完整思路自定义存储后端需要继承 Storage 基类并实现以下方法create_file()/open_file()创建/打开文件对象list()列出所有文件名file_exists()/file_length()文件查询delete_file()/rename_file()文件管理lock()返回锁对象多进程安全create()/destroy()资源创建与销毁实现后把它传给FileIndex见 index.py即可使用。你可以基于这套接口把索引存进 Redis、MongoDB、对象存储或任何自定义介质——Whoosh 不关心底层是什么只要实现了统一的文件接口。如何选择场景对照指南持久化搜索服务FileStorage 默认W3Codec无需任何定制⚡高性能临时检索 / 测试RamStorage速度最快索引体积敏感调高W3Codec(compression...)压缩级别索引分发部署CompoundStorage单文件打包需要加密 / 特殊格式继承WrappingCodec包装默认编码器多存储融合OverlayStorage叠加只读层与写入层写在最后Whoosh 的Codec与Storage双层架构是它作为纯 Python 全文搜索库最灵活的资本。理解编码器管格式、存储管位置这两个概念后你不仅能更自信地调优现有索引压缩级别、块大小、mmap还能在需要时写出完全自定义的存储与编码方案。如果你还没有 Whoosh 源码可以通过git clone https://gitcode.com/gh_mirrors/who/whoosh获取对照 codec/base.py 和 filestore.py 这两个文件阅读你会对全文搜索的内部实现有全新的认识。【免费下载链接】whooshPure-Python full-text search library项目地址: https://gitcode.com/gh_mirrors/who/whoosh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表