≫ 向表添加文档
如果您正在查找有关向普通表添加文档的信息,请参阅从外部存储添加数据部分。
实时添加文档仅支持实时表和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 模式)端点支持分块传输编码。您可以使用它来传输大型批次。它:
- 减少峰值内存使用,降低 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);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"}');