博客

如何显示 Elasticsearch 索引的字段

了解如何使用 _mapping 和 _search API、子字段、合成 _source 和运行时字段显示 Elasticsearch 索引的字段。

Check out the different ways to ingest data into Elasticsearch and dive into practical examples to try something new.

Elasticsearch is packed with new features to help you build the best search solutions for your use case. Start a free cloud trial or try Elastic on your local machine now.

本文将讨论如何显示 Elasticsearch 索引的字段。这对了解数据结构、识别特定字段和排除故障非常有用。我们将讨论以下主题

  1. 使用_mapping API 获取字段信息

  2. 使用_search API 显示字段值

  3. 显示子字段

  4. 合成 _source

  5. 运行时字段

1.使用 _mapping API 获取字段信息

_mapping API 允许您检索一个或多个索引的映射定义。这包括有关字段、其数据类型和其他属性的信息。要检索特定索引的映射,请使用以下请求:

GET /<index_name>/_mapping

例如,如果有一个名为my_index 的索引,可以通过以下请求检索其映射:

GET /my_index/_mapping

响应将包括索引的映射定义,其中包含有关字段及其属性的信息。

还可以检索某一特定字段的映射。如果您的映射范围很大,而您只想专注于某一特定领域,这将非常有用。要检索特定字段的映射,请使用以下请求:

GET /my_index/_mapping/field/my_field

您还可以检索多个字段的映射,方法是用逗号分隔字段名,如下面的请求:

GET /my_index/_mapping/field/my_field_1,my_field_2,my_field_3

2.使用 _search API 显示字段值

要显示 Elasticsearch 索引中字段的值,可以使用_search API。_search API 为您提供了多种控制返回字段的方法,主要有两种:

  1. _source:_source 字段包含的原始 JSON 文档正文与索引中的一模一样,包括摄取管道或预处理步骤所做的任何更改。要显示源文件中的特定字段,请执行源过滤,如下所示。

  2. fields:fields 参数可让您在执行搜索时,根据索引映射从文档中检索特定字段。与_source 不同,fields 也可以从存储字段、文档值或运行时字段中返回值,而无需引用_source ,不过对于没有文档值或存储设置的标准字段,它会返回_source 。这将带来许多好处,如性能等,我们将在下文中看到。

使用 _source 字段

默认情况下, _search API 返回_source 字段,该字段包含被索引的原始 JSON 文档。要显示特定字段,可以在搜索请求的_source 参数中添加筛选器;这称为源筛选。

下面是一个搜索请求示例,它返回my_index 索引中文档的title author 字段的值:

GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["title", "author"]
}

在本例中,_source 参数指定了要返回的字段。

如果需要更多控制,可以使用_source 对象的includesexcludes 属性。例如,下面的查询返回顶层title 字段和author 的所有子字段,但author.description 除外。

GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "_source": {
     “includes”: [“title”, “author.*],
     “excludes”: [“author.description”]
  }
}

在本例中,我们使用author.* 模式检索author 对象的每个直接子字段。然后,我们明确排除author.description ,这样就只返回其他作者字段。请注意,这并不能提高性能,因为它仍然需要加载和解析源 JSON,但可以减少通过网络发送的响应大小。

使用字段参数

您可以使用fields 参数过滤搜索响应中返回的字段。使用fields 而不是_source 有几个好处,包括

  • 提高性能: fields 可以直接从存储字段doc 值返回值,而无需加载完整的_source ,从而减小了响应有效载荷的大小。

  • 格式化输出:对于标准字段, fields 可能会回到_source 抓取值,但它会查看索引映射,以正确格式化输出,如格式化日期,使其与用于聚合和排序的内容保持一致。

  • 访问运行时字段: fields 可以返回运行时字段,这些字段在原始_source 上并不存在。

  • 更多好处请点击此处

例如,要只返回my_index 索引中的titleauthor 字段,可以使用以下搜索请求:

GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "fields": ["title", "author"],
  "_source": false
}

在上述查询中,我们将_source 字段设置为 false,这样就不会返回源文件。这可以大大减小响应的有效载荷大小,但请记住,这只是因为titleauthor 字段属于keyword 字段类型,默认情况下已启用doc_values 。如果字段未启用doc_values_source 设置为 false,Elasticsearch 将无法检索它们,并在响应中跳过它们。

值得注意的是,fields 响应总是为每个字段返回一个值数组,即使只有一个值。这是因为 Elasticsearch 没有专用的数组类型,任何字段都可能有多个值。有关 Elasticsearch 中数组的更多信息,请单击此处

检索字段的其他方法

虽然使用_sourcefields 检索字段是推荐的方法,但也有针对特定用例的不同方法,例如

文档值字段:如果想完全避免使用_source ,可以使用docvalue_fields 参数进行搜索。Doc 值存储的字段值与_source 相同,但采用磁盘数据结构,优化了排序和聚合。

由于它与_source 中存储的值是分开的,因此可以请求特定字段,而无需加载整个_source 。如果您要查询大型文档,但只需要几个支持文档值的小字段,这将非常有用。使用docvalue_fields 的另一个用例是在datenumeric 字段上使用自定义格式,我们将在下面的示例中看到这一点。

请注意,这只适用于启用doc_values 的字段或默认已启用 的字段类型,如keyworddate 、数字类型和boolean ,不适用于textannotated_text

在本例中,我们使用docvalue_fields 参数检索titleauthorpublished 字段,而无需加载完整的_source 文档:

GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "docvalue_fields": [
    "title",
    "author",
    {
      "field": "published",
      "format": "epoch_millis"
    }
  ],
  "_source": false
}

运行该查询时,Elasticsearch 会直接从磁盘上的列存储中抓取值,而不是为每个文档引用_source 。由于查询中提供了format 参数,published 字段将以epoch_millis 格式返回,而不是默认格式。

存储字段:如果在映射中明确标记了存储的特定字段,则可以使用stored_fields 参数过滤这些字段。如果您只想使用这些特定字段或您特意存储以备日后检索的字段进行轻量级回复,这将非常有用。它与_source 分开存储,因此这种方法还可以避免加载_source

需要注意的是,该选项默认为关闭,一般不推荐使用。而使用源过滤则可返回原始源文件的某些子集。

在下面的示例查询中,我们使用stored_fields 参数来检索summary 字段,该字段的索引映射配置为 "store”: true

GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "stored_fields": ["summary"]
}

运行该查询时,Elasticsearch 会查看该字段是否被标记为”store”: true ,如果没有找到,则会完全跳过该字段。

3.显示子字段

如果索引包含子字段,可以使用点符号在fields 参数中指定字段路径。请注意,子字段不同于嵌套字段类型。例如,如果您有一个名为address.city 的子字段,您可以像这样将其包含在搜索响应中:

GET /my_index/_search
{
  "query": {
    "match_all": {}
  },
  "fields": ["title", "author", "address.city"],
  "_source": false
}

在此示例中,搜索响应将包括titleauthoraddress.city 字段的值。

4.合成_来源

如果既想保留 _source 的功能,又想节省磁盘空间,可以选择在索引映射中使用合成_source合成 _source 是一项允许 Elasticsearch 从存储字段和 doc 值等现有数据重建_source 的功能,即使_source 已禁用。这样可以节省大量存储空间,但查询时的速度会稍低,因为重建是即时进行的。在索引设置中使用以下值来启用此功能:

PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  }
}

使用合成_source 的一些好处包括:在使用_search API 时显示完整文档、源过滤以及与其他功能和工具(如希望_source 可用的 Kibana)的兼容性,所有这些都避免了存储完整_source 文档的需要。

5.运行时字段

运行时字段可让你在查询时或在运行时块下的索引映射中定义脚本字段。这些字段从未编入索引,因此添加运行时字段不会增加索引大小,但也不会显示在_source 中。在映射中定义的运行时字段是持久的,可用于所有查询,而在查询时定义的运行时字段是临时的,仅在该搜索请求中可用。

使用运行时字段的主要好处是,可以在摄取文档后将字段添加到文档中,从而简化映射决策。运行时字段也非常适合用原始文档中不存在但使用脚本生成的值来丰富文档,例如格式化字符串或计算分数。

还值得注意的是,运行时字段会损害性能,因为需要为结果集中的每个文档运行脚本。要检索运行时字段,还可以使用_search API 上的fields 参数。

结论

显示 Elasticsearch 索引的字段可以是使用索引映射或_source 简单检索值,也可以是使用fieldsdocvalue_fields 或运行时字段的更高级方法,以获得更强的控制力和更高的效率。了解不同方法之间的权衡是优化搜索体验的关键。无论您是要优化有效载荷、丰富文档内容,还是使用合成_source 来节省存储空间,Elasticsearch 都能为您提供多种工具和功能,让您以所需的方式找到所需的数据。这些技术可以帮助您了解数据结构、识别特定字段并排除故障。

相关内容

当 TSDS 遇到 ILM:设计不会拒绝延迟数据的时序数据流

Bret Wortman

作为代码的弹性开放式网络爬虫

Gustavo Llermaly

在 Logstash 中使用 Ruby 脚本

Dai Sugimori

显示 Elasticsearch 索引中的字段

Kofi Bartlett

从索引中排除 Elasticsearch 字段

Kofi Bartlett