≫ 向表中添加文档
如果您正在寻找有关将文档添加到普通表的信息,请参阅从外部存储添加数据部分。
实时添加文档仅支持实时和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);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;--------------
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)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;+---------------------+-----------+---------------------------+
| id | price | title |
+---------------------+-----------+---------------------------+
| 1657860156022587404 | 19.850000 | Crossbody Bag with Tassel |
| 1657860156022587405 | 4.950000 | Yello bag |
+---------------------+-----------+---------------------------+CALL UUID_SHORT(N)
CALL UUID_SHORT(N) 语句允许在一次调用中生成 N 个唯一的 64 位 ID,无需插入任何文档。它在需要在 Manticore 中预生成 ID 以供其他系统或存储方案使用时尤其有用。比如,你可以在 Manticore 中生成自动 ID,然后将它们用于另一个数据库、应用程序或工作流程,确保不同环境中的标识符一致且唯一。
- Example
CALL UUID_SHORT(3)+---------------------+
| 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(Manticore 模式)端点支持分块传输编码。你可以用它来传输大批量数据。它能够:
- 降低峰值内存使用,减少内存溢出风险
- 缩短响应时间
- 允许绕过 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);Query OK, 3 rows affected (0.01 sec)当前 INSERT 不支持表达式,值应明确指定。
- SQL
- JSON
- Elasticsearch
- PHP
- Python
- Python-asyncio
- Javascript
- Java
- C#
- Rust
INSERT INTO products(title, sizes) VALUES('shoes', (40,41,42,43));- SQL
- JSON
- Elasticsearch
- PHP
- Python
- Python-asyncio
- Javascript
- Java
- C#
- Rust
INSERT INTO products VALUES (1, 'shoes', '{"size": 41, "color": "red"}');