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


默认情况下,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

只是返回了_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" : "胖丫"
        }
      }
    ]

猜你喜欢

转载自blog.csdn.net/winterking3/article/details/108235285