# Manticore Search 28.6.6：UUID 文档 ID、可排序的 GROUP_CONCAT() 和 16 个修复

Manticore Search 28.6.6 为实时表新增了 UUID 文档 ID，以及可排序、可限制数量的 GROUP_CONCAT()，并带来了覆盖备份、复制、查询处理、SQL 兼容性和二级索引的 16 项修复。

Manticore Search 28.6.6 已发布。本次重点新增的是实时表的 UUID 文档 ID，以及用于分组查询的可排序、可限制数量的 `GROUP_CONCAT()`。这个版本还包含针对备份、复制、查询处理、SQL 兼容性和二级索引的 16 项修复。

本文覆盖从 **28.4.5 到 28.6.6** 的全部内容。

---

## 升级说明

此版本没有新增必须执行的数据迁移。UUID ID 是一种可选的表定义：现有的数值 ID 表会继续按原样工作。如果你想使用 UUID 标识符，请创建一个 `id uuid` 的实时表；`ALTER TABLE` 不能把已有表从数值 ID 转换为 UUID ID。

有两项修复对生产环境尤其有用。成功的备份在完成后现在总会解冻实时表（此前在少数情况下不会），而不是让写入一直被阻塞。另外，经过认证的复制现在又可以通过 `ALTER CLUSTER ... ADD` 添加一个已有数据的 RT 表了。

---

## 实时表的 UUID 文档 ID

应用程序通常已经在系统记录中拥有 UUID 标识符。直到现在，把它们用于 Manticore Search 还意味着要维护一套单独的数值 ID 映射。现在，实时表可以直接使用 [UUID 文档 ID](https://manual.manticoresearch.com/Creating_a_table/Data_types#UUID-document-IDs)：

```sql
CREATE TABLE products_uuid(id uuid, title text, price int);
```

Manticore 可以接受显式的 UUID 字符串，也可以在 `insert` 或 `replace` 时省略 `id` 后自动生成一个。查询中支持 UUID 等值和 `IN` 过滤，UUID ID 也可用于 `REPLACE`、`UPDATE` 和 `DELETE`。

目前这是实时表能力，包括列式 RT 表和复制 RT 表。普通表、percolate 表和分片表仍然继续使用各自现有的 ID 模型。

## 可排序且可限制数量的 GROUP_CONCAT()

分组后的结果往往需要对每个组里最相关的值做一个简洁预览。现在，`GROUP_CONCAT()` 可以在显式的 SQL `GROUP BY` 查询中对值排序，并且只保留你指定数量的值：

```sql
SELECT category,
       GROUP_CONCAT(title ORDER BY price DESC SEPARATOR ', ' LIMIT 3)
FROM products
GROUP BY category;
```

新的 `ORDER BY`、`SEPARATOR` 和 `LIMIT` 选项让查询可以按指定顺序返回前几个值，而不必先拼接一大段无序结果，再在应用代码里重新排序。完整语法请参见 [GROUP_CONCAT() 参考](https://manual.manticoresearch.com/Searching/Grouping#GROUP_CONCAT%28field%29)。

---

## 更安全的表、备份和集群维护

下面这些改动消除了那些通常出现在日常运维而不是普通搜索中的故障：

- [Manticore Backup](https://github.com/manticoresoftware/manticoresearch-backup) 1.10.2 修复了一个问题：成功的备份可能会让 RT 表保持冻结状态，导致后续写入被阻塞。
- 经过认证的复制状态传输现在在使用 `ALTER CLUSTER ... ADD` 添加一个已有数据的 RT 表时可以正常工作。
- RT 生命周期操作现在会在 `ALTER`、`TRUNCATE`、chunk 移除和优化后清理过时的外部文件。同一版本还会在无关的 `ALTER TABLE` 操作中保留 Jieba 配置，并明确拒绝不受支持的有效设置变更。
- [OPTIMIZE TABLE](https://manual.manticoresearch.com/Securing_and_compacting_a_table/Compacting_a_table#OPTIMIZE-TABLE) 现在接受带限定名的 `system.<table>`，因此可以优化物理分片表。

---

## 查询处理和客户端兼容性

这些修复范围很广，但其中几项对高负载搜索服务尤其重要：

- 当启用 `boolean_simplify` 时，[CALL SNIPPETS](https://manual.manticoresearch.com/Searching/Highlighting#CALL-SNIPPETS) 在高亮前不再花费数秒去简化某些复杂的布尔查询。
- 超长的精确查询和短语类查询不再有查询栈低估的风险，从而避免内存损坏或 `searchd` 崩溃；对多块 RT 表和分布式表执行 `local_df` 时，重复的关键词统计也已去重。
- 更新后的列式库修复了一个 StreamVByte 解码器越界读取问题，该问题可能导致二级索引查询崩溃，包括在 JSON 字段上的 `GROUP BY`。现在 `indextool --check` 会报告损坏的二级索引文件，而不是直接崩溃。
- `USER()` 在 `USER` 变成认证关键字后仍然可用，恢复了与 MySQL 客户端 `status` 命令的兼容性。`SHOW INDEX ... STATUS` 也已受到保护，不会再受到并发百分位计算竞态的影响。
- 文档 ID 的 `IN(...)` 过滤器现在可以正确接受大于 `Long.MAX_VALUE` 的合法无符号 64 位 ID，而带有多个 `FACET` 子句的 `LEFT JOIN` 也不再崩溃。

此版本还修复了一个 SphinxQL SSL 连接处理竞态，该问题可能让 worker 以 100% CPU 运行；同时还修复了 PHP API 的响应解析问题以及 Ruby API 的 fixture，确保以 `"0"` 结尾的有效响应块会被保留。

完整列表请参见 [28.6.6 版本更新日志](https://manual.manticoresearch.com/Changelog#Version-28.6.6)。

---

## 获取 Manticore Search 28.6.6

使用 [安装指南](/install/) 安装或升级 Manticore Search。如果你正在升级一个已启用认证或复制的部署，请在切换生产流量前先查看现有的 [认证迁移检查清单](/blog/manticore-auth-migration-hardening-checklist/)。

## 需要帮助或想要联系我们？

- 加入我们的 [Slack](https://slack.manticoresearch.com)
- 访问 [论坛](https://forum.manticoresearch.com)
- 在 [GitHub](https://github.com/manticoresoftware/manticoresearch/issues) 上提交问题或建议新功能
- 给我们发送邮件：`contact@manticoresearch.com`
