Store(存储)

store 映射参数决定字段值是否应独立于 _source 单独存储,并允许在搜索请求中使用 stored_fields 选项直接检索。

默认情况下,store 设置为 false,这意味着字段值不会单独存储,只能作为文档 _source 的一部分使用。如果 store 设置为 true,您可以禁用 _source 以节省磁盘空间,同时仍能 检索特定字段

示例:在字段上启用 store

以下请求创建一个名为 products 的索引,其中 model 字段独立于 _source 存储:

PUT /products
{
  "mappings": {
    "properties": {
      "model": {
        "type": "keyword",
        "store": true
      },
      "name": {
        "type": "text"
      }
    }
  }
}

将文档摄取到索引中:

PUT /products/_doc/1
{
  "model": "WM-1001",
  "name": "Wireless Mouse"
}

仅检索存储的字段:

POST /products/_search
{
  "query": {
    "match": {
      "name": "Mouse"
    }
  },
  "stored_fields": ["model"]
}

此查询返回单独存储的 model 字段,即使 _source 仍然可用。


示例:禁用 _source 后存储字段

如果您想节省磁盘空间,且后续不需要访问完整的原始文档(例如用于重新索引或更新),可以禁用 _source 并仅存储必要的字段:

PUT /products_no_source
{
  "mappings": {
    "_source": {
      "enabled": false
    },
    "properties": {
      "model": {
        "type": "keyword",
        "store": true
      },
      "name": {
        "type": "text"
      }
    }
  }
}

将文档摄取到索引中:

PUT /products_no_source/_doc/1
{
  "model": "KB-2002",
  "name": "Mechanical Keyboard"
}

检索存储的字段:

POST /products_no_source/_search
{
  "query": {
    "match": {
      "name": "Keyboard"
    }
  },
  "stored_fields": ["model"]
}

此查询返回从 stored_fields 检索的 model 字段,而无需访问 _source

如果您尝试如下检索 _source

GET /products_no_source/_doc/1

那么响应中的 _source 将为 null。这表明完整的文档不再可用,并且由于 _source 被禁用,只能检索存储的字段:

{
  "_index": "products_no_source",
  "_id": "1",
  "found": true,
  "_source": null
}