⚠️ 此页面为自动翻译,翻译可能不完美。
blog-post

Manticore Search 29.9.0:分块自动嵌入和 mmap 列式访问

author image
View as markdown

Manticore Search 29.9.0 已发布。最大的变化在自动嵌入:长文档现在可以拆分为可搜索的块,一个文档也可以保留多个向量,而不是把全部内容压缩成一个向量。本版本还将 mmap 设为列式属性的默认访问模式,新增了更安全的嵌入工作负载控制、UTF-8 标识符、更好的备份支持,并修复了混合搜索、KNN、批量写入、分组搜索和模式变更中的问题。

本文涵盖 29.0.3 到 29.9.0 之间,也就是 29.0.2 之后发布的全部内容。

❤️ 感谢 @tudorvasincaPR #4857PR #4859PR #4873 中所做的工作。


升级说明

本版本没有覆盖整个发布的强制数据迁移。现有表和配置可以正常升级,但如果早期行为已经影响了你的数据,下面几项修复需要后续处理:

  • 德语 sharp-s 规范化需要显式启用。将现有表切换到 lemmatize_de_v2lemmatize_de_v2_all 会改变已索引的词项,因此需要重建普通表,或将文档重新写入新的 RT 表。
  • 经过认证的 BACKUP 引入了 backup 授权操作。降级到 29.3.12 或更早版本之前,请移除所有 backup 授权。
  • 列式属性现在默认使用 mmap,而不是缓冲式 file 读取。如果需要保留之前的访问模式,请显式设置 access_columnar_attrs='file'

长文档可以保留多个嵌入

旧的自动嵌入路径会为每个文档生成一个向量,并截断无法放入模型输入窗口的文本。这对标题和短描述有效,但也意味着长文章末尾附近的相关段落可能永远进不了索引。

Manticore Search 现在支持五种分块策略

  • truncate 保留之前的行为,并仍然是默认值。
  • mean 会嵌入每个块,并将结果平均为一个向量。
  • fixed 按固定大小的词元窗口拆分文本。
  • recursive 会按段落、行、句子和空格的顺序优先选择边界。
  • sentence 将完整句子分组到配置的限制以内。

多向量策略使用 float_vector_array 。每个块在 KNN 搜索中独立竞争,但 Manticore 只返回一次文档,并用其最近的块计算 knn_dist()

CREATE TABLE articles (
  title text,
  content text,
  chunks float_vector_array knn_type='hnsw' hnsw_similarity='cosine'
    model_name='Xenova/all-MiniLM-L6-v2' from='title,content'
    chunk_strategy='sentence' max_tokens='256' overlap_tokens='32'
);

INSERT INTO articles (id, title, content)
VALUES (1, 'Rotating certificates', 'A long guide with many sections ...');

SELECT id, knn_dist()
FROM articles
WHERE knn(chunks, 5, 'how do I rotate a certificate');

MAX_TOKENSOVERLAP_TOKENSMAX_CHUNKS 分别控制块大小、边界处共享的上下文以及最大向量数量。创建表时请声明由模型支持的 float_vector_array:目前还不支持之后通过 ALTER TABLE ... ADD COLUMN 添加并重建其嵌入。

为本地嵌入工作设置上限

长上下文模型可能让单个大输入的成本意外升高,尤其是在 CPU 上。新的 MAX_INPUT_TOKENS 列选项可以限制发送给本地嵌入模型的每个输入的规模:

ALTER TABLE articles
MODIFY COLUMN chunks MAX_INPUT_TOKENS='512';

该变更适用于之后生成的嵌入;现有向量保持不变。可以在 CREATE TABLE 时设置,也可以之后修改而不重新嵌入整张表。值为 0 或省略该选项时,会使用模型自身的限制。

本版本还修复了这一路径上两个不太明显的问题。修改嵌入列后,模型不再继续保留在缓存中;不同 API_TIMEOUTMAX_INPUT_TOKENS 值的配置也不再发生冲突并复用错误的缓存模型。


UTF-8 标识符和更好的德语匹配

表名、字段名和属性名现在遵循统一的安全 UTF-8 标识符语法 。RT、percolate、分布式、模板和普通表都可以在 DDL、表达式、字段选择器和推断的源模式中使用本地化名称,例如中文或西里尔字母标识符。

德语 AOT 词形还新增了可选的 sharp-s 规范化。使用 charset_table=non_cont,german,并设置 morphology=lemmatize_de_v2lemmatize_de_v2_all 时,StraßeStrasseSTRAẞE 等形式会在普通整词搜索中匹配。如果启用了 index_exact_words=1,精确词查询仍然可以区分 ßss 形式。


更好的负载测试和备份

manticore-load 现在可以通过 HTTP JSON API 使用 --http 进行基准测试。写入使用 /bulk,搜索使用 /search--table 选择目标表。其报告现在会包含运行期间本地 searchd RSS,以及结束时的峰值 RSS、磁盘和 CPU 统计信息,并支持多命令工作负载的聚合监控。

Manticore Backup 现在可以通过用户名/密码或 bearer token 凭据,在启用认证的 Manticore Search 安装中工作。SQL BACKUP 拥有专用的授权操作,并会检查所选表的读取权限。

当未设置静态密钥时,S3 备份和恢复也可以使用 AWS SDK 凭据提供者链。这包括 IRSA、共享凭据、ECS 任务角色和 EC2 实例配置文件。临时凭据可以提供 AWS_SESSION_TOKEN

列式属性默认使用 mmap

Manticore Search 现在将 access_columnar_attrs 默认设为 mmap。操作系统会按需映射并缓存 *.spc 列式属性文件,而不需要在启动时预读整个文件。之前的缓冲路径仍可通过 access_columnar_attrs='file' 使用。

ALTER TABLE 也会使用配置的访问模式重新打开被替换的列式存储,因此修改后的表不再回退到与请求不一致的读取器。


向量和分组搜索修复

多项修复针对的是原本有效、但在特定表布局下可能返回不完整结果或失败的查询:

  • 带有本地分片的分布式和分片 KNN 查询不再对合并后的 1-bit 量化结果重复重新打分,避免协调节点崩溃或返回错误的最近邻。(Issue #4791 )
  • 带有额外过滤器的 KNN 查询会避免在 HNSW 已经排除没有向量的文档时再执行冗余的 knn_dist 预过滤。(PR #4861 )
  • float_vector_array 使用 LENGTH() 时,现在返回向量数量,而不是其内部存储词数量。(PR #4879 )
  • GROUP BY 的混合搜索会保留所有分桶,包括 MVA 分组,并同时遵循最终排序和组内排序。(Issue #4639 )
  • 针对 weight() 以及由其派生的表达式或别名的混合过滤器,现在会在融合后基于最终文本权重执行,而不是被忽略。OR 树内部依赖权重的过滤器仍不受支持,并会返回明确错误。(Issue #4889 )
  • 多块 RT 分组不再有重复分组、错误拆分计数,或在对 COUNT(DISTINCT ...) 结果排序时挂起的风险。(Issue #4856 )
  • 有符号表示为负数的文档 ID 过滤器,现在会遵循查找索引的无符号排序。(Issue #4774 )

这里也包含崩溃修复:多语句请求中的第二条混合搜索语句(PR #4864 )、按字符串属性排序的分布式 JSON 聚合(Issue #4822 ),以及在自动嵌入预提交期间删除表(Issue #4860 )现在都能安全处理。

批量写入行为更可预测

Elasticsearch 兼容的 /_bulk 请求现在会在批次处理完成后返回 HTTP 200,而单项失败仍可通过 errors: true 和逐项状态查看。重复的 create 操作会返回逐项 409 version_conflict_engine_exception 错误,包括同一批次内的重复项。这可以防止 Fluent Bit 等客户端重试已经成功的写入。

固定长度、gzip 压缩的 /bulk 请求体在跨多次 socket 读取到达时也能正确解码。此外,如果原生批量处理因目标表不存在而失败,请求可以再次携带有效 NDJSON 进入 Manticore 的自动模式回退,同时保留预期的批量响应封装。


更多可靠性修复

本版本其余部分修复了一系列运维和兼容性问题:

  • 节点重新加入后,分片表正在重新均衡时,searchd --stopwait 不再挂起。(Issue #3905 )
  • 升级期间兼容的旧 binlog 可以安全重放,已完成的 RT 块会在干净关闭前发布。(Issue #4808 ) 致命重放诊断也会指出相关的恢复标志。(Issue #4811 )
  • 当最近的现有父目录可写时,indexer 会为普通表路径创建缺失的父目录。(Issue #4793 )
  • UUID 文档 ID 不再导致存储的文本字段返回为空。(Issue #4833 )
  • ALTER TABLE ... RENAME 会保留隐藏的远程嵌入 API 密钥,并且不会在 SHOW CREATE TABLE 中暴露。(Issue #4842 )
  • Sequel Ace 5.3.1+ 兼容性探测恢复正常。(Issue #4828 )
  • JSON /search 会为否定的 NEAR 和邻近操作符保留距离。(Issue #4784 )
  • 内部字符串排序辅助列不再从 LEFT JOIN 结果中泄漏。(Issue #4788 )
  • 格式错误的二进制 API SEARCH 元素数量现在会被拒绝,而不是终止 searchd。(PR #4790 )

完整列表请参阅 Version 29.9.0 changelog


获取 Manticore Search 29.9.0

按照安装指南 安装或升级 Manticore Search。如果你使用列式属性、德语 AOT 词形或经过认证的备份,请查看上面的升级说明。

需要帮助或想交流?

安装Manticore Search

在 Linux 或 macOS 上用一条命令安装 Manticore Search:

curl https://manticoresearch.com | sh

有关高级安装选项,请参阅完整安装指南手册

安装Manticore Search