文章目录
- 一,119-全文检索-ElasticSearch-映射-mapping创建
-
- 1,Elasticsearch7开始不支持类型type。
- 2,mapping
-
- [2.1 Elasticsearch的Mapping](#2.1 Elasticsearch的Mapping)
- 二,120-全文检索-ElasticSearch-映射-添加新的字段映射
- 三,121-全文检索-ElasticSearch-映射-修改映射&数据迁移
一,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支持多种字段类型,包括
text
、keyword
、date
、integer
、float
、boolean
等。 - 分析器:Elasticsearch是为全文搜索优化的,字段可以指定不同的分析器来处理文本数据,如标准分析器、简单分析器等。
- 动态映射:Elasticsearch支持动态映射,即在索引新类型的数据时,可以自动推断字段类型并创建映射。
示例:在创建索引时指定mapping:
json
PUT /my-index
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"date": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
}
二,120-全文检索-ElasticSearch-映射-添加新的字段映射
这一节的主要内容是如何修改索引的mapping。
但我们要修改一个已经存在的索引的mapping时,可用使用如下方式。
dart
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
dart
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,将旧索引数据迁移到新索引
dart
POST /_reindex
{
"source": {
"index": "bank",
"type": "acount"
},
"dest": {
"index": "newbank"
}
}
3,为新索引指定别名
dart
POST /_aliases
{
"actions": [
{
"remove": {
"index": "bank",
"alias": "bank_alias"
}
},
{
"add": {
"index": "newbank",
"alias": "bank_alias"
}
}
]
}
首先移除旧索引的别名,同时为新索引指定别名,这样在通过别名访问索引数据时,实际上访问的是新索引,这个变更的过程无需更新使用索引的引用程序。
当然,前提是旧索引有别名,且应用程序使用的是别名。