【Elastic Engineering】Elasticsearch:动态创建 Runtime fields - 7.11 发行版

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch:动态创建 Runtime fields - 7.11 发行版

作者:刘晓国


我们知道在动态 mapping 启动后,一个索引的字段可能会随着导入文档字段数的增加而自动增加,在有些情况下会发生 “映射爆炸”,也就是说字段数超过我们容忍的范围,而且另外一个坏处是,随着字段的增加,导入的速度会变慢,这是因为更多的字段需要被分词。更多被分词的字段意味着更多的磁盘空间。这种情况在很多的情况下是不允许的。在这种情况下,我们可以动态创建 runtime fields。这个方法的好处是:我们可以针对喜欢的字段在 mapping 中进行定义,而对于那么不那么重要的字段可以建立 runtime fields,虽然他们被搜索的速度会有所影响。为了平衡搜索效果和灵活性,你通常会搜索并过滤索引字段,例如时间戳。运行查询时,Elasticsearch image.png首先自动使用这些索引字段,从而缩短了响应时间。然后,你可以使用  runtime fields 来限制 Elasticsearch 计算其值所需的字段数。将索引字段与 runtime fields 一起使用可为你索引的数据以及如何定义其他字段的查询提供灵活性。

image.png

在今天的练习中,我们将通过一个例子来展示如何动态地创建 runtime fields。


例子


如果 dynamic 参数设置为 runtime 的情况下启用了 dynamic field mapping,则新字段将作为 runtime fields 自动添加到索引映射中。我们使用如下的命令来创建一个 index template:

PUT _index_template/my_dynamic_index
{
  "index_patterns": [
    "my_dynamic_index-*"
  ],
  "template": {
    "mappings": {
      "dynamic": "runtime",
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "yyyy-MM-dd"
        },
        "response_code": {
          "type": "integer"
        }
      }
    }
  }
}

在上面我们定义了一个叫做 my_dynamic_index-* 的 index pattern 的索引模板。但凡以 my_dynamic_index- 为开头的任何索引将具有的 mapping。在上面我们定义了两个字段: timestamp 及 response_code。同时我们也启动了dynamic 为 runtime。这意味着任何文档的字段名称不是 timestamp 和 response_code 的都将被定义为 runtime fields。它们在文档导入时,不会被分词,但是在搜索时,会自动被生成 runtime fields 而使用。


接下来,我们来创建一个如下的索引 my_dynamic_index-1:

POST my_dynamic_index-1/_bulk
{"index":{}}
{"timestamp": "2021-01-01", "response_code": 200, "new_data": "data-1", "another_data": "another1"}
{"index":{}}
{"timestamp": "2021-01-01", "response_code": 200, "new_data": "data-1", "another_data": "another2"}
{"index":{}}
{"timestamp": "2021-01-01", "response_code": 200, "new_data": "data-2", "another_data": "another3"}
{"index":{}}
{"timestamp": "2021-01-01", "response_code": 200, "new_data": "data-2", "another_data": "another4"}

在上面我们看到 timestamp 及 response_codeo 这两个字段,但是我们也看到 new_data 以及 another_data 两个字段。由于这两个字段没有在 mapping 中被定义,而 dynamic 也被设置为 runtime,那么这两个字段将被设置为 runtime fields。执行完上面的命令后,我们可以通过如下的命令来查看这个索引的 mapping:

GET my_dynamic_index-1/_mapping

上面的命令显示:

{
  "my_dynamic_index-1" : {
    "mappings" : {
      "dynamic" : "runtime",
      "runtime" : {
        "another_data" : {
          "type" : "keyword"
        },
        "new_data" : {
          "type" : "keyword"
        }
      },
      "properties" : {
        "response_code" : {
          "type" : "integer"
        },
        "timestamp" : {
          "type" : "date",
          "format" : "yyyy-MM-dd"
        }
      }
    }
  }
}

从上面我们可以看出来 new_data 及 another_data 都被设置为 runtime fields,而且他们的类型为 keyword。


我们可以通过如下的方式来进行查询:

GET my_dynamic_index-1/_search
{
  "query": {
    "match": {
      "new_data": "data-2"
    }
  }
}

上面命令的响应为:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_dynamic_index-1",
        "_type" : "_doc",
        "_id" : "xVhmmXcBQeGXF-ccp1Km",
        "_score" : 1.0,
        "_source" : {
          "timestamp" : "2021-01-01",
          "response_code" : 200,
          "new_data" : "data-2",
          "another_data" : "another3"
        }
      },
      {
        "_index" : "my_dynamic_index-1",
        "_type" : "_doc",
        "_id" : "xlhmmXcBQeGXF-ccp1Km",
        "_score" : 1.0,
        "_source" : {
          "timestamp" : "2021-01-01",
          "response_code" : 200,
          "new_data" : "data-2",
          "another_data" : "another4"
        }
      }
    ]
  }
}

从上面的结果中,我看可以看到有两个文档被搜索到。表明上看起来和我们正常的搜索没有什么不同,就好像一个正常的字段一样,但是必须指出的是针对大量的文档来说它的效率没有在 mapping 中定义的那些字段那么高。如果在以后的使用中,我们发现 new_data 这个字段需要在导入时被段,从而提高效率,你可以重新修改 index template 为:

PUT _index_template/my_dynamic_index
{
  "index_patterns": [
    "my_dynamic_index-*"
  ],
  "template": {
    "mappings": {
      "dynamic": "runtime",
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "yyyy-MM-dd"
        },
        "response_code": {
          "type": "integer"
        },
        "new_data": {
          "type": "keyword"
        }
      }
    }
  }
}


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
11月前
|
搜索推荐 C++
白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索
白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索
56 0
|
11月前
白话Elasticsearch12-深度探秘搜索技术之基于multi_match + best fields语法实现dis_max+tie_breaker
白话Elasticsearch12-深度探秘搜索技术之基于multi_match + best fields语法实现dis_max+tie_breaker
61 0
|
11月前
|
Java Apache 索引
白话Elasticsearch10-深度探秘搜索技术之基于dis_max实现best fields策略进行多字段搜索
白话Elasticsearch10-深度探秘搜索技术之基于dis_max实现best fields策略进行多字段搜索
51 0
|
存储 JSON 缓存
【Elastic Engineering】Elasticsearch:从搜索中获取选定的字段 fields
Elasticsearch:从搜索中获取选定的字段 fields
326 0
【Elastic Engineering】Elasticsearch:从搜索中获取选定的字段 fields
|
存储 测试技术 API
【Elastic Engineering】Elasticsearch:Runtime fields 入门, Elastic 的 schema on read 实现 - 7.11 发布
Elasticsearch:Runtime fields 入门, Elastic 的 schema on read 实现 - 7.11 发布
181 0
【Elastic Engineering】Elasticsearch:Runtime fields 入门, Elastic 的 schema on read 实现 - 7.11 发布
|
Web App开发 存储 数据可视化
【Elastic Engineering】Elasticsearch:使用 Runtime fields 对索引字段进行覆盖处理以修复错误 - 7.11 发布
Elasticsearch:使用 Runtime fields 对索引字段进行覆盖处理以修复错误 - 7.11 发布
151 0
【Elastic Engineering】Elasticsearch:使用 Runtime fields 对索引字段进行覆盖处理以修复错误 - 7.11 发布
|
数据采集 存储 API
Elasticsearch 运行时类型 Runtime fields 深入详解
1、实战问题 实战业务中,遇到数据导入后,但发现缺少部分必要字段,一般怎么解决? 比如:emotion 代表情感值,取值范围为:0-1000。 其中:300-700 代表中性;0-300 代表负面;700-1000 代表正面。 但实际业务中,我们需要:中性:0;负面:-1;正面:1。 如何实现呢?
535 0
Elasticsearch 运行时类型 Runtime fields 深入详解
|
17天前
|
数据可视化 索引
elasticsearch head、kibana 安装和使用
elasticsearch head、kibana 安装和使用
|
29天前
|
存储 负载均衡 索引
linux7安装elasticsearch-7.4.0集群配置
linux7安装elasticsearch-7.4.0集群配置
113 0
|
2月前
|
存储 监控 搜索推荐
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——安装篇(一)
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——安装篇(一)

相关产品

  • 检索分析服务 Elasticsearch版