我已经阅读了source filtering,stored fields和doc values的文档。
在某些情况下,存储字段可能很有意义。例如,如果您有一个包含标题,日期和很大内容字段的文档,则可能只想检索标题和日期,而不必从较大的_source字段中提取这些字段
stored_fields参数涉及显式标记为存储在映射中的字段,该字段默认情况下处于关闭状态,通常不建议这样做。而是使用源过滤来选择要返回的原始源文档的子集。
所有支持doc值的字段均默认启用。
我有title
(短字符串)和content
(> 1MB)的文档。我想搜索匹配的标题,然后返回标题。
GET /_search
{ _source: "obj.title", ... }
GET /_search
{ _source: false, stored_fields: ["title"], ... }
GET /_search
{_source: false, stored_fields: "_none_", docvalue_fields: "title", ... }
好吧,
_source
,标题和内容,然后应用过滤器并仅返回标题,还是elasticsearch仅从磁盘读取标题?答案 0 :(得分:2)
源过滤的请求会从磁盘读取完整的_source,标题和内容,然后应用过滤器并仅返回标题,还是elasticsearch仅从磁盘读取标题?
您发送的用于索引到Elasticsearch的文档将存储在名为_source
的字段中(默认情况下)。因此,这意味着如果您的文档包含大量数据(例如您案例中的content
字段),则全部内容将存储在_source
字段中。使用源过滤时,首先必须从_source
字段中检索整个源文档,然后仅返回title
字段。您正在浪费空间,因为content
字段实际上什么都没有发生,因为您正在搜索title
并仅返回title
值。
对于您而言,最好不要存储_source
文档,而只存储title
字段(但它也有一些缺点,因此read this before you do) ,基本上是这样的:
PUT index
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"title": {
"type": "text",
"store": true
},
"content": {
"type": "text"
}
}
}
}
默认情况下,除分析的文本字段外,所有字段均启用源过滤的请求会使用doc值吗?
doc值。如果您使用_source
过滤,则不使用doc值,如上所述,_source
字段将被检索,您指定的字段将被过滤。
存储的字段是否存储分析的令牌或原始值?
存储的字段存储的是_source
文档中的确切值
存储的字段或文档值是否比_source效率更高或更低?
doc_values是另一种野兽,它更多地是一种优化,它以一种易于存储,分析和汇总这些值的方式来存储未分析字段的令牌。
如果您不想存储完整的源,而只存储几个重要的字段(如上所述),则存储的字段(默认为false)也是一种优化。
_source
字段本身是一个包含整个文档的存储字段。