在 Elasticsearch 中,索引模板和索引别名是两个重要的功能,它们分别用于定义索引的默认设置和映射,以及为索引提供更灵活的访问方式。

 

索引模板(Index Templates)

索引模板用于在新索引创建时自动应用默认设置和映射。它们非常适合用于确保特定类型的索引具有一致的配置。索引模板可以包括设置、映射和别名。

 

示例:创建一个索引模板

PUT /_index_template/my_template
{
  "index_patterns": ["logs-*"],  // 匹配所有以 "logs-" 开头的索引
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1
    },
    "mappings": {
      "properties": {
        "timestamp": {
          "type": "date"
        },
        "message": {
          "type": "text"
        },
        "user_id": {
          "type": "keyword"
        }
      }
    },
    "aliases": {
      "logs": {}  // 为所有匹配的索引添加别名 "logs"
    }
  },
  "priority": 100  // 模板的优先级
}

 

解释

示例:应用模板创建新索引

当你创建一个匹配模板的索引时,模板会自动应用。

PUT /logs-2024-06-20
{
  "aliases": {
    "current_logs": {}  // 可以覆盖模板中的别名
  }
}

新索引 logs-2024-06-20 将自动应用 my_template 的设置和映射。

 

索引别名(Index Aliases)

索引别名为一个或多个索引提供一个逻辑名称,使得你可以通过别名而不是具体索引名称来访问索引。别名可以指向单个索引或多个索引,并且可以在读写操作中使用。

示例:创建和使用别名

  1. 创建别名

    POST /_aliases
    {
      "actions": [
        {
          "add": {
            "index": "logs-2024-06-20",
            "alias": "current_logs"
          }
        }
      ]
    }
    

     

  2. 使用别名进行查询

    GET /current_logs/_search
    {
      "query": {
        "match_all": {}
      }
    }
    

     

  3. 使用别名进行索引

    POST /current_logs/_doc
    {
      "user_id": "user1",
      "message": "User logged in",
      "timestamp": "2024-06-20T12:00:00"
    }
       

     

复杂别名:带过滤条件和路由

别名还可以带有过滤条件和路由,用于更细粒度地控制索引访问。

 

示例:创建带过滤条件的别名

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "logs-*",
        "alias": "user_logs",
        "filter": {
          "term": {
            "user_id": "user1"
          }
        }
      }
    }
  ]
}

此别名 user_logs 仅返回 user_id 为 "user1" 的文档。

 

示例:带路由的别名

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "logs-*",
        "alias": "user_logs",
        "routing": "user1"
      }
    }
  ]
}

此别名 user_logs 在路由为 "user1" 时使用。

 

组合使用模板和别名

通过组合使用索引模板和别名,可以简化索引管理和访问。例如,你可以为所有日志索引应用一个模板,然后使用别名来简化对这些索引的访问和操作。

示例:结合使用

PUT /_index_template/logs_template
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1
    },
    "mappings": {
      "properties": {
        "timestamp": {
          "type": "date"
        },
        "message": {
          "type": "text"
        },
        "user_id": {
          "type": "keyword"
        }
      }
    },
    "aliases": {
      "all_logs": {}
    }
  },
  "priority": 100
}

 

创建索引时,模板自动应用,别名 all_logs 自动添加:

PUT /logs-2024-06-20

 

现在可以通过 all_logs 别名来查询所有日志索引:

GET /all_logs/_search
{
  "query": {
    "match_all": {}
  }
}

 

通过这些功能,你可以有效管理和访问 Elasticsearch 索引,确保数据的组织和检索更加灵活和高效。