默认情况下,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" : "胖丫"
        }
      }
    ]
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐