一,119-全文检索-ElasticSearch-映射-mapping创建

1,Elasticsearch7开始不支持类型type。

这意味着,在创建索引时,不需要指定type

2,mapping

索引就像是MySQL等关系数据库的表一样,而表是有表结构的,表结构有字段名词和自动类型组成。

Elasticsearch的索引也有类似的概念,但和MySQ的表结构有些区别:

  • 索引的结构称之为mapping
  • mapping不必提前创建,Elasticsearch会在导入数据时,依据具体的数据进行类型推断,自动创建mapping

2.1 Elasticsearch的Mapping

  • 定义:映射是Elasticsearch中定义索引的模式,它指定了索引中每个字段的数据类型和属性,如分析器(Analyzers)、是否可索引(index)、是否可存储(store)等。
  • 目的:映射用于优化搜索性能和定义数据如何被索引和搜索。
  • 类型:Elasticsearch支持多种字段类型,包括textkeyworddateintegerfloatboolean等。
  • 分析器:Elasticsearch是为全文搜索优化的,字段可以指定不同的分析器来处理文本数据,如标准分析器、简单分析器等。
  • 动态映射:Elasticsearch支持动态映射,即在索引新类型的数据时,可以自动推断字段类型并创建映射。

示例:在创建索引时指定mapping

PUT /my-index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "date": {
        "type": "date",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

二,120-全文检索-ElasticSearch-映射-添加新的字段映射

这一节的主要内容是如何修改索引的mapping。

但我们要修改一个已经存在的索引的mapping时,可用使用如下方式。

PUT /my_index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}
  • PUT /my_index/_mapping:这是一个HTTP PUT请求,用于指定名为my_index的索引的映射。如果索引不存在,这个请求将创建索引并定义其映射;如果索引已经存在,它将更新现有的映射。

  • properties:这是映射定义中的一个关键部分,它包含了索引中所有字段的定义。

  • 'employee-id:这是字段的名称。

  • type:指定字段的数据类型。在这个例子中,keyword类型被指定,这意味着这个字段将用于精确匹配,并且不会进行全文搜索的分析。

  • index:这个属性指定字段是否应该被索引。在这个例子中,index被设置为false,表示employee-id字段的数据将不会被索引,因此不能被搜索,也即是这个字段不能作为搜索条件。这通常用于存储元数据或在文档中作为唯一标识符,但不需要进行搜索。

需要注意的是,对于mapping的更新,仅限于增加新的字段,不能修改已有字段的任何属性。

三,121-全文检索-ElasticSearch-映射-修改映射&数据迁移

正如前面所说,index索引的mapping是不能修改的。

如果一定要修改,只能重新创建一个索引,再把数据迁移到新索引。步骤如下:

  • 创建一个新索引,指定所需的mapping
  • 通过reindex将数据从旧索引迁移到新索引
  • 为新索引指定索引别名

以前面自动创建的索引bank为例,基于我们想要的mapping创建一个新的索引newbank

1,创建新索引newbank

PUT newbank
{
  "mappings" : {
      "properties" : {
        "account_number" : {
          "type" : "long"
        },
        "address" : {
          "type" : "text"
        },
        "age" : {
          "type" : "long"
        },
        "balance" : {
          "type" : "long"
        },
        "city" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "email" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "employer" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "firstname" : {
          "type" : "keyword"
        },
        "gender" : {
          "type" : "keyword"
        },
        "lastname" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "state" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
}

2,将旧索引数据迁移到新索引

POST /_reindex
{
  "source": {
    "index": "bank",
    "type": "acount"
  },
  "dest": {
    "index": "newbank"
  }
}

3,为新索引指定别名

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "bank",
        "alias": "bank_alias" 
      }
    },
    {
      "add": {
        "index": "newbank",
        "alias": "bank_alias"
      }
    }
  ]
}

首先移除旧索引的别名,同时为新索引指定别名,这样在通过别名访问索引数据时,实际上访问的是新索引,这个变更的过程无需更新使用索引的引用程序。

当然,前提是旧索引有别名,且应用程序使用的是别名。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部