ARTICLE DETAIL

资讯详情

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

Zvec全文检索(FTS)完全指南:BM25、jieba中文分词与N-gram分词器

Zvec全文检索(FTS)完全指南:BM25、jieba中文分词与N-gram分词器 Zvec全文检索FTS完全指南BM25、jieba中文分词与N-gram分词器【免费下载链接】zvecA lightweight, lightning-fast, in-process vector database项目地址: https://gitcode.com/GitHub_Trending/zve/zvecZvec 是一款轻量、极速的进程内向量数据库除了向量相似度检索它还内置了原生的**全文检索Full-Text Search, FTS**能力基于BM25算法的相关性打分、jieba 中文分词、N-gram 分词器以及一套 Lucene 风格的查询语法让关键词精确搜索和语义向量搜索能在同一个引擎里共存、混合查询。这篇指南将带你从零理解 Zvec 全文检索的每个核心部件新手也能快速上手。一、什么是 Zvec 全文检索FTS传统向量检索擅长意思相近的召回但面对精确关键词型号、订单号、报错代码、人名等往往力不从心。Zvec 的 FTS 正是为此设计关键词检索支持自然语言或结构化表达式搜索字符串字段BM25 相关性排序命中的文档按经典 IR信息检索打分排序而不仅是命中/未命中多分词器可插拔standard默认、jieba中文、ngram短文本/代码/短语、whitespace四种内置分词器与向量检索混合同一次查询中可以融合 FTS、向量语义与标量过滤。核心实现集中在src/db/index/column/fts_column/目录按职责清晰分层fts_column/ ├── bm25_scorer.h / .cc # BM25 打分与 WAND 优化 ├── tokenizer/ # 分词器与过滤器 │ ├── jieba_tokenizer.h # 中文分词 │ ├── ngram_tokenizer.h # N-gram 分词 │ ├── standard_tokenizer.h # 标准分词 │ └── tokenizer_factory.cc # 分词器工厂 ├── iterator/ # 倒排迭代器AND/OR/短语 └── posting/ # 位压缩倒排表 SIMD 加速二、BM25 相关性打分结果为什么这样排序BM25Best Matching 25是信息检索领域的经典打分函数Zvec 在 bm25_scorer.h 中完整实现了标准公式核心思想一个词在某篇文档里出现得越多词频 tf且在整个语料中越罕见逆文档频率 IDF这篇文档的相关性就越高同时用文档长度归一化避免长文档占便宜。Zvec 的关键工程细节设计点说明经典默认参数k1 1.2词频饱和、b 0.75长度归一化符合 IR 通用最佳实践分段统计BM25 统计量文档总数、总词数、平均文档长度按 segment 独立维护读写线程安全WAND 剪枝用词的最大词频预计算分数上界TopK 检索时提前跳过不可能进入前列的文档显著减少无效打分增量统计写入时实时更新统计量保证搜索立刻使用最新语料状态新手理解你不需要手动调参——默认参数已经过基准调优绝大多数场景开箱即用。三、分词器怎么选jieba、N-gram 与 standard分词器决定了什么算一个词直接决定检索质量。Zvec 在 tokenizer_factory.cc 中提供四种分词器1️⃣standard默认——通用英文/混合文本按 Unicode 边界切分单词适合英文为主的场景。可以叠加 token 过滤器在FtsIndexParam的filters中配置lowercase统一小写ascii_folding去掉重音字符café → cafestemmer基于 Snowball 的词干还原running → run。2️⃣jieba—— 中文分词的可靠选择中文没有天然空格分词standard分词器会把整句当一个词。jieba 分词器jieba_tokenizer.h内置了 cppjieba 引擎默认使用CutForSearch搜索引擎模式产出更细粒度的词——既切出中华人民共和国也切出中华人民保证索引与查询两侧都能命中四种切分模式可配search默认、mix、full、hmm支持用户自定义词典user_dict_path注入领域术语支持指定词典目录jieba_dict_dir初始化后线程安全可并发调用 tokenize。全文检索 --jieba-- [ 全文, 检索, 全文检索 ]3️⃣ngram—— 短语、代码与短文本的利器N-gram 分词器ngram_tokenizer.h把文本切成连续字符的 n 元组默认 2-gram是 Zvec v0.7.0 新增的能力特别适合短语与子串匹配vector 能匹配 vectorize、vector_db代码检索函数名、路径等没有空格边界的标识符短文本标题、标签、命令。配置项ngram_min/ngram_max默认均为 2差值不超过 1、token_chars可选限定参与切分的字符类别如letter、digit。4️⃣whitespace—— 按空格切分最简单直接以空白为界不改变词形。适合内容本身已有明确分隔符的场景。选型口诀中文文档 →jieba英文/通用 →standardfilters代码/短语/子串匹配 →ngram日志、键值类 →whitespace四、快速上手定义 FTS 索引与发起查询第 1 步为字段声明 FTS 索引在 Python SDK 中给字段挂上FtsIndexParam即可类型定义见python/zvec/model/param/from zvec.model.schema import FieldSchema from zvec.model.param import FtsIndexParam # 中文字段用 jieba 分词 content FieldSchema( namecontent, data_typezvec.DataType.STRING, index_paramFtsIndexParam(tokenizer_namejieba), ) # 代码/短文本字段用 ngramextra_params 传 JSON 配置 code FieldSchema( namecode, data_typezvec.DataType.STRING, index_paramFtsIndexParam( tokenizer_namengram, extra_params{ngram_min: 2, ngram_max: 3}, ), )字段 Schema 的类型定义在 field_schema.py。第 2 步用 FTS 查询查询参数Fts支持两种互斥输入定义见 query.py①match_string宽松匹配——分词后任一词命中即返回适合普通搜索框from zvec.model.param import Fts, Query query Query(field_namecontent, ftsFts(match_string向量数据库 性能)) results collection.query(query, topk10)②query_string结构化表达式——Lucene 风格支持完整布尔逻辑语法含义示例词必须包含BM25 分词-词必须排除python -爬虫短语精确短语保持词序相邻全文检索and / or / not显式布尔组合召回 and not 排序query Query( field_namecontent, ftsFts(query_string向量 -向量库 BM25 分词), )查询表达式由内置解析器编译语法文件见src/db/index/column/fts_column/FtsLexer.g4与FtsParser.g4支持 AND、OR 与短语迭代的执行计划性能远优于应用层字符串过滤。五、Zvec FTS 的性能黑科技新手也值得知道位压缩倒排表posting list 采用 bit-packing 压缩存储并提供 SSE4.1 / AVX2 SIMD 加速实现fts_column/posting/内存与 CPU 双友好WAND 剪枝如前所述TopK 检索只计算有希望的文档分数RocksDB 承载倒排索引落在 RocksDB 之上fts_rocksdb_reducer.cc多 segment 合并时统计量正确重算保证 BM25 打分在数据合并后依然准确进程内零部署所有检索发生在你的进程里没有网络往返延迟毫秒级。对应的质量保障也值得放心单元测试覆盖倒排表、索引器、多 segment 召回tests/db/sqlengine/fts_recall_test.cc以及 Python 层的查询校验python/tests/test_fts_query.py。六、混合检索让 FTS 与向量各展所长Zvec 的核心卖点是混合检索——FTS 负责精确词命中向量负责语义相似两者可同场协作单次查询融合FTS 召回 向量召回 标量过滤在查询计划层融合排序稀疏向量路线SDK 提供 BM25EmbeddingFunction把文本编码为 BM25 稀疏向量与稠密向量做加权混合检索重排Rerank粗召回后接 reranker 精排src/db/reranker/reranker.cc进一步提升头部结果质量。实践建议关键词强约束型号、ID、报错文本→ 字段挂 FTS 索引用query_string精确控制语义泛化问题怎么提升检索效果→ 向量索引两者都重要 → 混合查询让引擎替你融合。七、核心路径速查表 模块路径BM25 打分器src/db/index/column/fts_column/bm25_scorer.hjieba 中文分词src/db/index/column/fts_column/tokenizer/jieba_tokenizer.hN-gram 分词器src/db/index/column/fts_column/tokenizer/ngram_tokenizer.h分词器工厂src/db/index/column/fts_column/tokenizer/tokenizer_factory.ccFTS 查询语法src/db/index/column/fts_column/FtsParser.g4Python 索引参数python/zvec/model/param/Python FTS 查询python/zvec/model/param/query.pyBM25 稀疏嵌入python/zvec/extension/bm25_embedding_function.py八、总结Zvec 的 FTS 把BM25 相关性打分、可插拔分词器与布尔查询语法装进了一个进程内数据库无需独立搜索引擎中文场景首选jieba 分词搜索引擎切分模式 用户词典代码/短语场景选N-gram英文场景用standard 过滤器match_string做宽松召回query_string做精确控制再与向量检索混合即可获得又准又全的搜索体验。现在打开 Python SDK给你的下一个文本字段挂上FtsIndexParam吧——全文检索一分钟就位 ✅【免费下载链接】zvecA lightweight, lightning-fast, in-process vector database项目地址: https://gitcode.com/GitHub_Trending/zve/zvec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表