Elasticsearch——从搜索中检索选定字段

默认情况下,搜索响应中的每个命中都包括document _source,这是在索引文档时提供的整个JSON对象。建议使用两种方法从搜索查询中检索选定字段:

  • 使用 fields 选项提取索引映射中存在的字段的值

  • 如果需要访问在索引时传递的原始数据,请使用_source选项

我们可以同时使用这两种方法,但首选fields选项,因为它同时参考文档数据和索引映射。在某些情况下,我们可能希望使用其他方法检索数据。

The fields option 

要检索搜索响应中的特定字段,请使用fields参数。因为它参考索引映射,所以fields参数提供了几个优于直接引用_source的优点。具体而言,字段参数:

  • 以与映射类型匹配的标准化方式返回每个值

  • 接受多个字段和字段别名

  • 格式化日期和空间数据类型

  • 检索运行时字段值

  • 返回脚本在索引时计算的字段

还考虑了其他映射选项,包括上面的ignore_above、ignore_malformed和null_value。

fields选项返回值的方式与Elasticsearch索引值的方式相匹配。对于标准字段,这意味着fields选项在_source中查找值,然后使用映射解析并格式化它们。

Search for specific fields  

搜索特定的字段,以下搜索请求使用fields参数检索user.id字段、以http.response.开头的所有字段和@timestamp字段的值。

使用对象表示法,可以传递format参数以自定义返回日期或地理空间值的格式。

POST my-index-000001/_search
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  },
  "fields": [
    "user.id",
    "http.response.*",         (1)
    {
      "field": "@timestamp",
      "format": "epoch_millis" (2)
    }
  ],
  "_source": false
}

(1)接受完整字段名和通配符模式。

(2)使用format参数为字段值应用自定义格式。

Response always returns an array

响应总是返回一个数组。

fields响应始终为每个字段返回一个值数组,即使_source中只有一个值。这是因为Elasticsearch没有专用的数组类型,任何字段都可能包含多个值。fields参数也不能保证数组值按特定顺序返回。

响应将值作为一个平面列表包含在每个命中的字段部分中。因为fields参数不获取整个对象,所以只返回页字段。

{
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_id" : "0",
        "_score" : 1.0,
        "_type" : "_doc",
        "fields" : {
          "user.id" : [
            "kimchy"
          ],
          "@timestamp" : [
            "4098435132000"
          ],
          "http.response.bytes": [
            1070000
          ],
          "http.response.status_code": [
            200
          ]
        }
      }
    ]
  }
}

检索nested字段

nested字段的字段响应与常规对象字段的字段响应略有不同。常规对象字段中的叶值以平面列表的形式返回,而嵌套字段中的值则分组以保持原始嵌套数组中每个对象的独立性。对于嵌套字段数组中的每个条目,值将再次以平面列表的形式返回,除非父嵌套对象中存在其他嵌套字段,在这种情况下,对更深的嵌套字段再次重复相同的过程。

给定以下映射,其中user是嵌套字段,在为以下文档编制索引并检索用户字段下的所有字段后:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "group" : { "type" : "keyword" },
      "user": {
        "type": "nested",
        "properties": {
          "first" : { "type" : "keyword" },
          "last" : { "type" : "keyword" }
        }
      }
    }
  }
}

PUT my-index-000001/_doc/1?refresh=true
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

POST my-index-000001/_search
{
  "fields": ["*"],
  "_source": false
}

响应将把名字和姓氏分组,而不是将它们作为一个简单的列表返回。

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [{
      "_index": "my-index-000001",
      "_id": "1",
      "_score": 1.0,
      "_type": "_doc",
      "fields": {
        "group" : ["fans"],
        "user": [{
            "first": ["John"],
            "last": ["Smith"],
          },
          {
            "first": ["Alice"],
            "last": ["White"],
          }
        ]
      }
    }]
  }
}

嵌套字段将按其嵌套路径分组,而不管用于检索它们的模式如何。例如,如果仅查询上一示例中的user.first字段:

POST my-index-000001/_search
{
  "fields": ["user.first"],
  "_source": false
}

响应仅返回用户的名字,但仍保持嵌套用户数组的结构:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [{
      "_index": "my-index-000001",
      "_id": "1",
      "_score": 1.0,
      "_type": "_doc",
      "fields": {
        "user": [{
            "first": ["John"],
          },
          {
            "first": ["Alice"],
          }
        ]
      }
    }]
  }
}

但是,当fields模式直接以嵌套用户字段为目标时,不会返回任何值,因为该模式与任何页字段都不匹配。

Retrieve unmapped fields

检索未映射的字段

默认情况下,“fields”参数仅返回映射字段的值。但是,Elasticsearch允许在_source中存储未映射的字段,例如将动态字段映射设置为false,或者使用enabled : false的对象字段。这些选项禁用对象内容的解析和索引。

要从_source检索对象中未映射的字段,请使用“fields”部分中的“include_unmapped”选项:

PUT my-index-000001
{
  "mappings": {
    "enabled": false   (1)
  }
}

PUT my-index-000001/_doc/1?refresh=true
{
  "user_id": "kimchy",
  "session_data": {
     "object": {
       "some_field": "some_value"
     }
   }
}

POST my-index-000001/_search
{
  "fields": [
    "user_id",
    {
      "field": "session_data.object.*",
      "include_unmapped" : true   (2)
    }
  ],
  "_source": false
}

(1)禁用所有映射。

(2)包括与此字段模式匹配的未映射字段。

响应将包含session_data.object.*路径下的字段结果,即使字段未映射。user_id字段也未映射,但它不会包含在响应中,因为对于该字段模式,include_unmapped未设置为true。

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_id" : "1",
        "_score" : 1.0,
        "_type" : "_doc",
        "fields" : {
          "session_data.object.some_field": [
            "some_value"
          ]
        }
      }
    ]
  }
}

The _source option

我们可以使用_source参数选择返回源的哪些字段。这称为源过滤。

以下搜索API请求将_source request body参数设置为false。响应中不包括文档源。

GET /_search
{
  "_source": false,
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

若要仅返回源字段的子集,请在_source参数中指定通配符(*)模式。以下搜索API请求仅返回obj字段及其属性的源。

GET /_search
{
  "_source": "obj.*",
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

我们还可以在_source字段中指定通配符模式数组。以下搜索API请求仅返回obj1和obj2字段及其属性的源。

GET /_search
{
  "_source": [ "obj1.*", "obj2.*" ],
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

对于更精细的控制,可以在_source参数中指定包含 includes和 excludes模式数组的对象。

如果指定了includes属性,则只返回与其模式之一匹配的源字段。可以使用excludes属性从该子集中排除字段。

如果未指定includes属性,则返回整个文档源,不包括与excludes属性中的模式匹配的任何字段。

以下搜索API请求仅返回obj1和obj2字段及其属性的源,不包括任何子description字段。

GET /_search
{
  "_source": {
    "includes": [ "obj1.*", "obj2.*" ],
    "excludes": [ "*.description" ]
  },
  "query": {
    "term": {
      "user.id": "kimchy"
    }
  }
}

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论
<p> <br /> </p> <p style="color:#333333;"> <strong>Elasticsearch 简介</strong> </p> <p style="color:#333333;"> ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 </p> <p style="color:#333333;"> <br /> </p> <p style="color:#333333;"> <strong>elasticSearch 的使用场景</strong> </p> <p style="color:#333333;"> 1、在海量数据前提下,对数据进行检索。比如:京东,淘宝等电商项目 </p> <p style="color:#333333;"> <br /> </p> <p style="color:#333333;"> <strong>课程目标:</strong> </p> <p style="color:#333333;"> 1. 了解企业级搜索引擎 </p> <p style="color:#333333;"> 2. 安装elasticsearch {linux 系统} </p> <p style="color:#333333;"> 3. 安装kibana并利用kibana对Elasticsearch 索引的数据进行搜索、查看、交互操作 </p> <p style="color:#333333;"> 4. 项目实战{ELK} </p> <p style="color:#333333;"> <br /> </p> <p style="color:#333333;"> <strong>课程目录:</strong> </p> <p style="color:#333333;"> 01 课程介绍<br /> 02 elasticsearch 简介<br /> 03 elasticsearch 使用场景<br /> 04 安装elasticsearch 之前先安装jdk<br /> 05 安装elasticsearch<br /> 06 测试elasticsearch是否安装成功 <br /> 07 安装kibana<br /> 08 elasticsearch 基本认识 以及添加索引和删除索引<br /> 09 elasticsearch 添加查询数据<br /> 10 elasticsearch 修改删除数据<br /> 11 elasticsearch 有条件的查询<br /> 12 分词子属性fuzzy查询<br /> 13 elasticsearch 过滤使用<br /> 14 elasticsearch 排序与分页<br /> 15 elasticsearch 如何查询指定的字段<br /> 16 elasticsearch 高亮显示<br /> 17 elasticsearch 聚合<br /> 18 elasticsearch mapping 概念<br /> 19 elasticsearch文词库<br /> 20 elasticsearch 文词库安装测试<br /> 21 elasticsearch 文词库的使用案例<br /> 22 elasticsearch 自定义词库配置<br /> 23 安装nginx 配置文词库<br /> 24 测试elasticsearch 自定义文词库<br /> 25 搭建项目父工程<br /> 26 搭建项目bean-interface-common<br /> 27 搭建search 的service web 项目<br /> 28 测试项目是否能与elasticsearch联通<br /> 29 创建数据库并搭建首页<br /> 30 数据上传功能的实现类完成<br /> 31 数据上传控制器完成<br /> 32 dubbo 介绍以及安装zookeeper<br /> 33 将数据从mysql 上传到elasticsearch <br /> 34 elasticsearch查询功能分析<br /> 35 编写业务需求的dsl 语句<br /> 36 编写输入参数返回结果集的实体类<br /> 37 实现类编写<br /> 38 编写实现类dsl 语句<br /> 39 返回集结果转换<br /> 40 结果测试<br /> 41 测试通过输入查询条件并将数据显示到页面 </p>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

java编程小帅

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值