ManticoreSearch 文档更新操作详解
概述
ManticoreSearch 提供了强大的文档更新功能,允许用户在不重新索引整个文档的情况下修改特定属性。本文将详细介绍如何使用 UPDATE
命令来修改文档属性,包括基本用法、多属性更新、JSON 数据操作等核心功能。
UPDATE 命令基础
UPDATE
命令用于修改指定表中现有文档的属性值,但需要注意以下几点限制:
- 只能更新存储在行式存储(row-wise)中的属性
- 无法更新全文检索字段内容
- 不能修改文档ID
- 更新操作会禁用该属性的二级索引
基本语法
UPDATE 表名 SET 属性名=新值 WHERE 条件;
简单示例
UPDATE products SET enabled=0 WHERE id=10;
这条语句将 products 表中 id 为 10 的文档的 enabled 属性设置为 0。
多属性更新
ManticoreSearch 支持在单个 UPDATE 语句中同时更新多个属性,这比单独更新每个属性更高效。
示例
UPDATE products
SET price=100000000000,
coeff=3465.23,
tags1=(3,6,4),
tags2=()
WHERE MATCH('phone') AND enabled=1;
这个例子会同时更新匹配条件的所有文档的四个属性:price、coeff、tags1 和 tags2。
数值处理注意事项
当给32位属性赋值超出范围的值时,ManticoreSearch 会自动截取低32位:
- 例如赋值 4294967297 (0x100000001) 给32位无符号整数属性
- 实际存储的值将是 1 (0x00000001)
JSON 数据操作
ManticoreSearch 提供了对 JSON 类型属性的灵活操作支持。
部分更新 JSON
可以对 JSON 中的数值类型或数值数组进行部分更新:
-- 插入包含JSON数组的文档
INSERT INTO products (id, title, meta)
VALUES (1,'title','{"tags":[1,2,3]}');
-- 更新JSON数组中的特定元素
UPDATE products SET meta.tags[0]=100 WHERE id=1;
完整更新 JSON
如果需要更新非数值类型或改变属性类型,必须进行完整 JSON 更新:
-- 插入初始文档
INSERT INTO products VALUES (1,'title','{"tags":[1,2,3]}');
-- 完整更新JSON内容
UPDATE products SET data='{"tags":["one","two","three"]}' WHERE id=1;
编程语言接口示例
ManticoreSearch 支持多种编程语言接口进行文档更新操作:
PHP 示例
// 更新单个属性
$index->updateDocument(['enabled'=>0], 10);
// 更新多个属性
$query = new BoolQuery();
$query->must(new Match('phone','*'));
$query->must(new Equals('enabled',1));
$index->updateDocuments([
'price' => 100000000000,
'coeff' => 3465.23,
'tags1' => [3,6,4],
'tags2' => []
], $query);
Python 示例
# 更新文档
indexApi.update({
"table": "products",
"id": 1,
"doc": {
"price": 100000000000,
"coeff": 3465.23,
"tags1": [3,6,4],
"tags2": []
}
})
Java 示例
// 创建更新请求
UpdateDocumentRequest updateRequest = new UpdateDocumentRequest();
Map<String, Object> doc = new HashMap<>();
doc.put("price", 10);
doc.put("coeff", 3465.23);
doc.put("tags1", new int[]{3,6,4});
doc.put("tags2", new int[]{});
updateRequest.index("products").id(1L).setDoc(doc);
// 执行更新
indexApi.update(updateRequest);
最佳实践
- 批量更新:尽可能批量更新多个属性,减少操作次数
- 条件精确:确保 WHERE 条件足够精确,避免意外更新不需要修改的文档
- 索引影响:注意更新操作会禁用属性的二级索引,必要时考虑使用 REPLACE
- 数据类型:确保更新值的数据类型与属性定义匹配
- 性能监控:对大表进行大量更新时,监控系统性能
通过合理使用 UPDATE 命令,可以高效地维护 ManticoreSearch 中的数据,确保搜索结果的准确性和实时性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考