## 背景
ES优化有一个常用手段是将不需要返回的字段的source关闭掉,以此节省磁盘空间,同时也节省内存;比如向量字段一般关闭source;
## 疑问
ES 索引(部分字段 或者 全部字段)关闭source后是否可以更新?
## 测试
# 创建索引关闭source
PUT test_exclude
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"field": {
"type": "keyword"
}
}
}
}
# 新增测试数据
POST test_exclude/_doc/1
{
"field": 1
}
# 倒排索引查询
GET test_exclude/_search
{
"query": {
"terms": {
"field": [
"1"
]
}
}
}
可以查到结果
# 增量更新
POST test_exclude/_update/1
{
"doc": {
"field": "2"
}
}
异常,如下:
{
"error": {
"root_cause": [
{
"type": "document_source_missing_exception",
"reason": "[_doc][1]: document source missing",
"index_uuid": "FS4InI3pQoaXyxRWcFROLQ",
"shard": "2",
"index": "test_exclude"
}
],
"type": "document_source_missing_exception",
"reason": "[_doc][1]: document source missing",
"index_uuid": "FS4InI3pQoaXyxRWcFROLQ",
"shard": "2",
"index": "test_exclude"
},
"status": 400
}
# 全量更新(index API),直接覆盖 --- 成功
PUT test_exclude/_doc/1
{
"field": 2
}
# 查询
GET test_exclude/_search
{
"query": {
"terms": {
"field": [
"2"
]
}
}
}
可以查到结果,原有的查询 field=1,无法查询到
## 结论
全量更新(覆盖)可以;
增量更新会异常;