≫ 向表添加文档

向实时表添加文档

如果您正在查找有关向普通表添加文档的信息,请参阅从外部存储添加数据部分。

实时添加文档仅支持实时表Percolate表。相应的 SQL 命令、HTTP 端点或客户端函数会将新行(文档)插入到表中,并提供字段值。添加文档之前不必先创建表。如果表不存在,Manticore 会尝试自动创建它。更多信息请参见自动模式

您可以插入单个或多个文档,为表的所有字段或部分字段提供值。在这种情况下,其他字段将填充其默认值(标量类型为 0,文本类型为空字符串)。

INSERT 目前不支持表达式,因此必须显式指定值。

ID 字段/值可以省略,因为 RT 和 PQ 表支持自动 ID功能。您也可以使用 0 作为 id 值以强制自动生成 ID。具有重复 ID 的行不会被 INSERT 覆盖。相反,您可以使用REPLACE来实现该目的。

使用 HTTP JSON 协议时,您可以选择两种不同的请求格式:通用 Manticore 格式和类似 Elasticsearch 的格式。下面的示例中演示了这两种格式。

此外,使用 Manticore JSON 请求格式时,请注意必须包含 doc 节点,所有值都应包含在其中。

‹›
  • SQL
  • JSON
  • Elasticsearch
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋

通用语法:

INSERT INTO <table name> [(column, ...)]
VALUES (value, ...)
[, (...)]
INSERT INTO products(title,price) VALUES ('Crossbody Bag with Tassel', 19.85);
INSERT INTO products(title) VALUES ('Crossbody Bag with Tassel');
INSERT INTO products VALUES (0,'Yellow bag', 4.95);
‹›
Response
Query OK, 1 rows affected (0.00 sec)
Query OK, 1 rows affected (0.00 sec)
Query OK, 1 rows affected (0.00 sec)

自动模式

注意:自动模式需要Manticore Buddy。如果无法使用,请确保已安装 Buddy。

Manticore 具有自动创建表的机制,当插入查询中指定的表尚不存在时会激活。该机制默认启用。要禁用它,请在 Manticore 配置文件的Searchd部分设置 auto_schema = 0

默认情况下,VALUES 子句中的所有文本值都被视为 text 类型,除非值表示有效的电子邮件地址,则视为 string 类型。

如果尝试插入多行且同一字段的值类型不同且不兼容,自动创建表将被取消,并返回错误消息。但如果不同的值类型兼容,结果字段类型将是能容纳所有值的类型。可能发生的一些自动数据类型转换包括:

  • mva -> mva64
  • uint -> bigint -> float(这可能导致一定的精度损失)
  • string -> text

自动模式机制不支持创建带有用于KNN(K 最近邻)相似度搜索的向量字段(float_vector 类型)的表。要在表中使用向量字段,必须显式创建定义这些字段的表模式。如果需要在普通表中存储向量数据但不具备 KNN 搜索功能,可以使用标准 JSON 语法将其存储为 JSON 数组,例如:INSERT INTO table_name (vector_field) VALUES ('[1.0, 2.0, 3.0]')

此外,以下日期格式将被识别并转换为时间戳,所有其他日期格式将被视为字符串:

  • %Y-%m-%dT%H:%M:%E*S%Z
  • %Y-%m-%d'T'%H:%M:%S%Z
  • %Y-%m-%dT%H:%M:%E*S
  • %Y-%m-%dT%H:%M:%s
  • %Y-%m-%dT%H:%M
  • %Y-%m-%dT%H

请注意,/bulk HTTP 端点不支持自动创建表(自动模式)。只有 /_bulk(类似 Elasticsearch)HTTP 端点和 SQL 接口支持此功能。

‹›
  • SQL
  • JSON
📋
MySQL [(none)]> drop table if exists t; insert into t(i,f,t,s,j,b,m,mb) values(123,1.2,'text here','test@mail.com','{"a": 123}',1099511627776,(1,2),(1099511627776,1099511627777)); desc t; select * from t;
‹›
Response
--------------
drop table if exists t
--------------
Query OK, 0 rows affected (0.42 sec)
--------------
insert into t(i,f,t,j,b,m,mb) values(123,1.2,'text here','{"a": 123}',1099511627776,(1,2),(1099511627776,1099511627777))
--------------
Query OK, 1 row affected (0.00 sec)
--------------
desc t
--------------
+-------+--------+----------------+
| Field | Type   | Properties     |
+-------+--------+----------------+
| id    | bigint |                |
| t     | text   | indexed stored |
| s     | string |                |
| j     | json   |                |
| i     | uint   |                |
| b     | bigint |                |
| f     | float  |                |
| m     | mva    |                |
| mb    | mva64  |                |
+-------+--------+----------------+
8 rows in set (0.00 sec)
--------------
select * from t
--------------
+---------------------+------+---------------+----------+------+-----------------------------+-----------+---------------+------------+
| id                  | i    | b             | f        | m    | mb                          | t         | s             | j          |
+---------------------+------+---------------+----------+------+-----------------------------+-----------+---------------+------------+
| 5045949922868723723 |  123 | 1099511627776 | 1.200000 | 1,2  | 1099511627776,1099511627777 | text here | test@mail.com | {"a": 123} |
+---------------------+------+---------------+----------+------+-----------------------------+-----------+---------------+------------+
1 row in set (0.00 sec)

自动 ID

Manticore 为插入或替换到实时表或Percolate 表的文档的 ID 列提供自动 ID 生成功能。该生成器为文档生成唯一 ID 并提供一定保证,但不应视为自增 ID。

生成的 ID 值在以下条件下保证唯一:

  • 当前服务器的 server_id 值在 0 到 127 范围内,并且在集群节点中唯一,或者使用从 MAC 地址生成的默认值作为种子
  • Manticore 节点在服务器重启之间系统时间不变
  • 在搜索服务器重启之间,自动 ID 生成次数少于每秒 1600 万次

自动 ID 生成器为文档 ID 创建一个 64 位整数,并使用以下方案:

  • 位 0 到 23 形成一个计数器,每次调用自动 ID 生成器时递增
  • 位 24 到 55 表示服务器启动的 Unix 时间戳
  • 位 56 到 63 对应 server_id

该方案确保生成的 ID 在集群所有节点中唯一,并且插入到不同集群节点的数据不会在节点之间产生冲突。

因此,自动 ID 生成器生成的第一个 ID 不是 1,而是一个更大的数字。此外,如果在调用之间对其他表进行插入,插入到表中的文档流可能具有非连续的 ID 值,因为 ID 生成器在服务器中是唯一的,并且在其所有表之间共享。

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋
INSERT INTO products(title,price) VALUES ('Crossbody Bag with Tassel', 19.85);
INSERT INTO products VALUES (0,'Yello bag', 4.95);
select * from products;
‹›
Response
+---------------------+-----------+---------------------------+
| id                  | price     | title                     |
+---------------------+-----------+---------------------------+
| 1657860156022587404 | 19.850000 | Crossbody Bag with Tassel |
| 1657860156022587405 |  4.950000 | Yello bag                 |
+---------------------+-----------+---------------------------+

UUID_SHORT 多 ID 生成

CALL UUID_SHORT(N)

CALL UUID_SHORT(N) 语句允许在一次调用中生成 N 个唯一的 64 位 ID,而无需插入任何文档。当您需要在 Manticore 中预生成 ID 以供其他系统或存储解决方案使用时,这非常有用。例如,您可以在 Manticore 中生成自动 ID,然后在另一个数据库、应用程序或工作流中使用它们,确保不同环境中的标识符一致且唯一。

‹›
  • Example
Example
📋
CALL UUID_SHORT(3)
‹›
Response
+---------------------+
| uuid_short()        |
+---------------------+
| 1227930988733973183 |
| 1227930988733973184 |
| 1227930988733973185 |
+---------------------+

批量添加文档

您不仅可以向实时表插入单个文档,还可以插入任意数量的文档。向实时表插入数万个文档的批次是完全可以接受的。但需要注意以下几点:

  • 批次越大,每次插入操作的延迟越高
  • 批次越大,索引速度越快
  • 您可能需要增加 max_packet_size 的值以允许更大的批次
  • 通常,每个批量插入操作被视为一个具有原子性保证的单个 事务,因此您要么一次性拥有表中的所有新文档,要么在失败时一个都不会添加。有关空行或切换到另一张表的更多细节,请参见“JSON”示例。

请注意,/bulk HTTP 端点不支持自动创建表(自动模式)。只有 /_bulk(类似 Elasticsearch)HTTP 端点和 SQL 接口支持此功能。/_bulk(类似 Elasticsearch)HTTP 端点允许表名包含集群名称,格式为 cluster_name:table_name

/_bulk 端点接受与 Elasticsearch 相同格式的文档 ID,您也可以在文档本身中包含 id

{ "index": { "table" : "products", "_id" : "1" } }
{ "title" : "Crossbody Bag with Tassel", "price": 19.85 }

{ "index": { "table" : "products" } }
{ "title" : "Crossbody Bag with Tassel", "price": 19.85, "id": "1" }

/bulk 中的分块传输

/bulk(Manticore 模式)端点支持分块传输编码。您可以使用它来传输大型批次。它:

  • 减少峰值内存使用,降低 OOM 风险
  • 缩短响应时间
  • 允许您绕过 max_packet_size 限制,传输远大于最大允许值(128MB)的批次,例如一次传输 1GB。
‹›
  • SQL
  • JSON
  • Elasticsearch
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋

对于批量插入,只需在 VALUES() 后提供更多文档。语法为:

INSERT INTO <table name>[(column1, column2, ...)] VALUES(value1[, value2 , ...]), (...)

可选的列名列表允许您显式指定表中某些列的值。所有其他列将填充默认值(标量类型为 0,字符串类型为空字符串)。

例如:

INSERT INTO products(title,price) VALUES ('Crossbody Bag with Tassel', 19.85), ('microfiber sheet set', 19.99), ('Pet Hair Remover Glove', 7.99);
‹›
Response
Query OK, 3 rows affected (0.01 sec)

INSERT 目前不支持表达式,值应显式指定。

插入多值属性(MVA)值

多值属性(MVA)作为数字数组插入。

‹›
  • SQL
  • JSON
  • Elasticsearch
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋
INSERT INTO products(title, sizes) VALUES('shoes', (40,41,42,43));

插入 JSON

JSON 值可以作为转义字符串插入(通过 SQL 或 JSON),也可以作为 JSON 对象插入(通过 JSON 接口)。

‹›
  • SQL
  • JSON
  • Elasticsearch
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋
INSERT INTO products VALUES (1, 'shoes', '{"size": 41, "color": "red"}');
Last modified: August 28, 2025