Elasticsearch教程(17) 返回结果过滤 _source_includes和_source_excludes使用

本文介绍Elasticsearch中如何使用_source_includes和_source_excludes参数来优化查询结果,仅返回所需字段或排除不需要的字段,提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


默认情况下,ES查询时返回所有字段的,但是有时,我们只想返回个别字段,或者不想返回某几个字段,这个时候就可以用到_source_includes和_source_excludes。
从字面上看_source_includes就是包含的字段,_source_excludes就是屏蔽的字段。

1. 造点测试数据

PUT /pigg_test/_doc/1
{
  "name": "冬哥",
  "age": 33,
  "interest": ["music", "food"]
}

PUT /pigg_test/_doc/2
{
  "name": "珣爷",
  "age": 28,
  "interest": ["music", "sleep"],
  "about": "I am a tester"
}

PUT /pigg_test/_doc/3
{
  "name": "胖丫",
  "age": 3,
  "interest": ["food", "sleep"],
  "about": "I am a girl"
}

2. _source参数

2.1 根据id查询时,只返回_source

先看下默认查询id=1时的返回

GET /pigg_test/_doc/1

返回:
{
  "_index" : "pigg_test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "冬哥",
    "age" : 33,
    "interest" : [
      "music",
      "food"
    ]
  }
}

再看下加了_source参数的返回

GET /pigg_test/_doc/1/_source

ES版本到7.x后,得这么写
GET /pigg_test/_source/1

只是返回了_source里的内容,不返回_index,_type,_version等信息
{
  "name" : "冬哥",
  "age" : 33,
  "interest" : [
    "music",
    "food"
  ]
}

2.2 设置_source=false,则不返回_source

默认情况下_source=true,如果不想返回_source,需要指定_source=false

GET /pigg_test/_doc/1?_source=false

返回如下,结果中没有了_source
{
  "_index" : "pigg_test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true
}

3. 在请求体中设置_source_includes和_source_excludes

3.1 _source_includes:只返回部分字段

GET pigg_test/_search
{
  "query": {
    "term": {
      "interest": {
        "value": "food"
      }
    }
  },
  "_source": {
    "includes": ["name", "interest"]
  }
}

返回的_source中只包含 “music”, “food”

...省略别的信息...
    "hits" : [
      {
        "_index" : "pigg_test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.4700036,
        "_source" : {
          "interest" : [
            "music",
            "food"
          ],
          "name" : "冬哥"
        }
      },
      {
        "_index" : "pigg_test",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.4700036,
        "_source" : {
          "interest" : [
            "food",
            "sleep"
          ],
          "name" : "胖丫"
        }
      }
    ]

3.2 如果只是_source_includes可以简写如下


GET pigg_test/_search?_source=false
{
  "query": {
    "term": {
      "interest": {
        "value": "food"
      }
    }
  },
  "_source": ["name", "interest"]
}

3.3 _source_excludes:屏蔽部分字段

GET pigg_test/_search
{
  "query": {
    "term": {
      "interest": {
        "value": "food"
      }
    }
  },
  "_source": {
    "excludes": ["age", "about", "interest"]
  }
}

返回结果中,_source就屏蔽了"age", “about”, “interest”

...省略别的信息...
 "hits" : [
      {
        "_index" : "pigg_test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.4700036,
        "_source" : {
          "name" : "冬哥"
        }
      },
      {
        "_index" : "pigg_test",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.4700036,
        "_source" : {
          "name" : "胖丫"
        }
      }
    ]

3.4 都有时,excludes优先级>includes优先级

GET pigg_test/_search
{
  "query": {
    "term": {
      "interest": {
        "value": "food"
      }
    }
  },
  "_source": {
    "includes": ["interest", "name"],
    "excludes": ["interest", "about"]
  }
}

includes包含了interest,但excludes也包含了excludes。
返回结果中只有name。

...省略别的信息...
"hits" : [
      {
        "_index" : "pigg_test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.4700036,
        "_source" : {
          "name" : "冬哥"
        }
      },
      {
        "_index" : "pigg_test",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.4700036,
        "_source" : {
          "name" : "胖丫"
        }
      }
    ]
### Elasticsearch 中 `fetch_source` 的用法与配置 在 Elasticsearch 查询中,`_source` 参数用于控制返回文档时是否包含 `_source` 字段的内容。通过设置 `_source` 或 `_source.includes` `_source.excludes`,可以进一步优化查询性能并减少不必要的数据传输。 以下是关于 `fetch_source` 配置的具体说明: #### 基本语法 可以通过以下方式指定需要返回的字段或排除某些字段: ```json GET /index_name/_search { "_source": { "includes": ["field1", "field2"], "excludes": ["field3"] }, "query": { "match_all": {} } } ``` 上述示例展示了如何仅获取特定字段 (`field1`, `field2`) 并排除其他字段 (`field3`) [^2]。 #### 使用场景 当执行大规模查询时,如果不需要完整的文档内容,则可以通过限制 `_source` 来提高效率。例如,在日志分析系统中,可能只需要时间戳错误消息而无需整个上下文信息。 #### 默认行为 如果不显式定义 `_source` 参数,默认情况下会返回存储于索引中的全部原始 JSON 文档作为响应的一部分 [^3]。 #### 示例代码 下面是一个实际应用的例子,展示如何利用 `_source` 进行更精确的数据检索: ```json GET /users/_search { "_source": ["name.first", "name.last"], "query": { "bool": { "must": [ {"term": {"age": 30}} ] } } } ``` 此请求将只返回年龄为30岁的用户的名姓氏部分 [^4]。 #### 性能考虑 合理使用 `_source` 可显著降低网络流量消耗以及客户端解析负担;然而过度细分也可能增加服务器端处理复杂度,因此需权衡利弊后决定最佳实践方案 [^5]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑟王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值