Elasticsearch:Simulate index API

2022年8月25日   |   by mebius

tgcode

从现有 index template 返回将应用于指定索引的索引配置。如果你对 index template 还没有什么理解的话,请阅读我之前的文章 “Elasticsearch:可组合的 Index templates – 7.8 版本之后”。它的使用例子:

POST /_index_template/_simulate_index/my-index-000001

警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将尽最大努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 约束。

前提条件:如果启用了 Elasticsearch 安全功能,你必须拥有 manage_index_templates 或 manage cluster 权限才能使用此 API。

在下面,我将在 Elastic Stack 8.3.3 的安装中来进行展示。

例子

我们首先来创建两个component templates:

PUT /_component_template/ct1                    
{
  "template": {
    "settings": {
      "index.number_of_shards": 2
    }
  }
}

PUT /_component_template/ct2                    
{
  "template": {
    "settings": {
      "index.number_of_replicas": 0
    },
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        }
      }
    }
  }
}

在上面,我们创建了两个分别称作 ct1 及 ct2 的 component template。我们接下来使用如下的命令把上面的两个 component template 组合为一个 index template:

PUT /_index_template/final-template             
{
  "index_patterns": ["my-index-*"],
  "composed_of": ["ct1", "ct2"],
  "priority": 5
}

在上面,我们创建了 final-template。它定义了一个 index_patterns 为 my-index-*,也就是任何以 my-index- 为开头的索引的 settings,alias 及 mappings 由这个 template 里的 component template 来决定。在之前,我们可以通过这样的方法来验证我们的 template 是否正确:

PUT my-index-1
GET my-index-1

上面的最后一个命令显示的结果为:

{
  "my-index-1": {
    "aliases": {},
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        }
      }
    },
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        },
        "number_of_shards": "2",
        "provided_name": "my-index-1",
        "creation_date": "1659596411728",
        "number_of_replicas": "0",
        "uuid": "O6jrWHb-Rp-5ABA4v8hjdw",
        "version": {
          "created": "8030399"
        }
      }
    }
  }
}

很显然,上面的结果显示了我们想要的结果,但是我们也看到它含有一些其它我们并不想要的信息。我们在创建 template 时,只是想验证最终的 template 是否正确。在实际的很多例子中,我们可能会有很多的 cotgcodemponent template,它们的设置可能还会有重叠,它们的 priority 也会有不同,那么最终的索引的设置是出自哪一个呢?我们其实不需要创建一个索引来验证,相反,我们只需要使用如下的命令来查看:

POST /_index_template/_simulate_index/my-index-000001

上面的命令返回的结果如下:

{
  "template": {
    "settings": {
      "index": {
        "number_of_shards": "2",
        "number_of_replicas": "0",
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        }
      }
    },
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        }
      }
    },
    "aliases": {}
  },
  "overlapping": []
}

它很清晰地表明了我们最终的 my-index-000001 的定义。

假如我们增加一个新的 component template 如下:

PUT /_component_template/ct3                    
{
  "template": {
    "settings": {
      "index.number_of_shards": 4
    },
    "mappings": {
      "properties": {
        "text": {
          "type": "text"
        }
      }
    }
  }
}

请注意:在上面,我们定义的index.number_of_shards 和 ct1 中的有重复,并且值是不同的。我们也添加了一个新的字段 text。

我们同时也修改之前的 index template 的定义如下:

PUT /_index_template/final-template             
{
  "index_patterns": ["my-index-*"],
  "composed_of": ["ct1", "ct2", "ct3"],
  "priority": 5
}

那么我们使用如下命令:

POST /_index_template/_simulate_index/my-index-000001

而得到的最终的 my-index-000001的定义如下:

{
  "template": {
    "settings": {
      "index": {
        "number_of_shards": "4",
        "nutgcodember_of_replicas": "0",
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        }
      }
    },
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "text": {
          "type": "text"
        }
      }
    },
    "aliases": {}
  },
  "overlapping": []
}

显然,在我们没有创建my-index-000001 的情况下,我们模拟测试了它最终的索引定义。

文章来源于互联网:Elasticsearch:Simulate index API

Tags: