默认地,Elasticsearch 在 _source
字段存储代表文档体的JSON字符串。和所有被存储的字段一样, _source
字段在被写入磁盘之前先会被压缩。
这个字段的存储几乎总是我们想要的,因为它意味着下面的这些:
-
搜索结果包括了整个可用的文档——不需要额外的从另一个的数据仓库来取文档。
-
如果没有
_source
字段,部分update
请求不会生效。 -
当你的映射改变时,你需要重新索引你的数据,有了_source字段你可以直接从Elasticsearch这样做,而不必从另一个(通常是速度更慢的)数据仓库取回你的所有文档。
-
当你不需要看到整个文档时,单个字段可以从
_source
字段提取和通过get
或者search
请求返回。 -
调试查询语句更加简单,因为你可以直接看到每个文档包括什么,而不是从一列id猜测它们的内容。
然而,存储 _source
字段的确要使用磁盘空间。如果上面的原因对你来说没有一个是重要的,你可以用下面的映射禁用 _source
字段:
PUT /my_index
{
"mappings": {
"my_type": {
"_source": {
"enabled": false
}
}
}
}
在一个搜索请求里,你可以通过在请求体中指定 _source
参数,来达到只获取特定的字段的效果:
GET /_search
{
"query": { "match_all": {}},
"_source": [ "title", "created" ]
}
这些字段的值会从 _source
字段被提取和返回,而不是返回整个 _source
。
Stored Fields 被存储字段
为了之后的检索,除了索引一个字段的值,你 还可以选择 存储
原始字段值。有 Lucene 使用背景的用户使用被存储字段来选择他们想要在搜索结果里面返回的字段。事实上, _source
字段就是一个被存储的字段。
在Elasticsearch中,对文档的个别字段设置存储的做法通常不是最优的。整个文档已经被存储为 _source
字段。使用 _source
参数提取你需要的字段总是更好的。