elsaticsearch中的源过滤,存储的字段和doc值之间有什么区别?

时间:2019-09-16 17:17:17

标签: elasticsearch

我已经阅读了source filteringstored fieldsdoc values的文档。

  

在某些情况下,存储字段可能很有意义。例如,如果您有一个包含标题,日期和很大内容字段的文档,则可能只想检索标题和日期,而不必从较大的_source字段中提取这些字段


  

stored_fields参数涉及显式标记为存储在映射中的字段,该字段默认情况下处于关闭状态,通常不建议这样做。而是使用源过滤来选择要返回的原始源文档的子集。


  

所有支持doc值的字段均默认启用。

示例1

我有title(短字符串)和content(> 1MB)的文档。我想搜索匹配的标题,然后返回标题。

  1. 使用源过滤
GET /_search
{ _source: "obj.title", ... }
  1. 具有存储的字段
GET /_search
{ _source: false, stored_fields: ["title"], ... }
  1. 具有文档值
GET /_search
{_source: false, stored_fields: "_none_", docvalue_fields: "title", ... }

好吧,

  • 源过滤的请求会从磁盘读取完整的_source,标题和内容,然后应用过滤器并仅返回标题,还是elasticsearch仅从磁盘读取标题?
  • 源过滤的请求会使用doc值吗?
  • 存储的字段是否存储分析的令牌或原始值?
  • 存储的字段或文档值是否比_source效率更高或更低?

1 个答案:

答案 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字段本身是一个包含整个文档的存储字段。