索引管理

创建索引

直接创建索引 PUT newindex1,创建索引可以通过 number_of_sharesnumber_of_replicas 数量来修饰分片和副本的数量。

text
1
2
3
4
5
6
7
8
9
PUT newindex
{
  "settings": {
    "index" : {
      "number_of_shares" : 2,
      "number_of_replicas": 1
    }
  }
}

number_of_shares 分片数在创建索引后不能修改

number_of_replicas 副本数可以随时完成修改

删除索引

DEL index_name

打开/关闭索引

POST {index_name}/_close

POST {index_name}/_open

关闭的索引无法进行【增删改查】操作

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_closed_exception",
        "reason" : "closed",
        "index_uuid" : "3eCslZZ3Q9amlUyDtqTXWA",
        "index" : "newindex"
      }
    ],
    "type" : "index_closed_exception",
    "reason" : "closed",
    "index_uuid" : "3eCslZZ3Q9amlUyDtqTXWA",
    "index" : "newindex"
  },
  "status" : 400
}

索引的映射 mapping

mapping是定义文档及包含字段的存储与索引方式。可以理解为是elasticsearch的表结构,定义mapping,即在创建index时,自行判断每个字段的类型,而不是有ES自动自动判断每个纬度的类型。这种更贴合业务场景,如分词、存储。

每个索引仅有一个映射类型(elasticsearch6.x+,之前版本一个索引下有多个类型),它决定了文档将如何被索引。而映射类型分为两部分 meta-fieldsfield of properties

meta-fields :为文档的源数据,如 _index (索引的名称)、_type (文档的类型,7.0+弃用)、_id (索引的ID)和 _source(用于关联文档源数据)字段

field of properties:字段属性,包含文档的字段或属性列表。

字段的数据类型

常见类型
  • binary:二进制或Base64字符串。
  • boolean: 布尔值truefalse
  • keywordskeyword, constant_keyword, 和 wildcard.
  • Numbers:数值类型,例如longdouble
  • dates:日期类型,datedate_nanos
  • alias: 为以有字段定义别名。
对象嵌套类型
  • object :JSON对象。
  • flattened:整个JSON对象作为单个字段值。
  • nested:嵌套,与子字段之间保留关系的json对象。
  • join:为同一索引中的文档定义父/子关系。
结构化类型
  • range:,long_rangedouble_rangedate_range,和ip_range
  • ip:IPv4和IPv6地址。
  • version :软件版本号。支持 语义化版本号 优先规则。
  • murmur3:计算并存储值的散列。
汇总数据类型
  • aggregate_metric_double:预汇总的指标值。
  • histogram:以直方图形式预汇总的数值。
文字搜寻类型
  • text:分析的非结构化文本。
  • annotated-text:包含特殊标记的文本。用于标识命名实体。
  • completion:用于自动补全建议。
  • search_as_you_type text类似类型,用于按需输入完成。
  • token_count:计数令牌。

等等 reference

常用字段数据类型参数

更多参数可以参考官方文档:mapping-params

字段说明
analyzertext字段支持 analyzer 映射参数。
index选项控制是否对字段值建立索引。默认为true。未索引的字段不可查询。
index_prefixes启用术语前缀的索引,以加快前缀搜索的速度
ignore_above长度大于 ignore_above设置的字符串将不会被索引或存储

映射的元字段

文档的元字段是保证系统正常运转的内置字段,如 _index 索引的字段 _type映射类型(7.0后取消),_id_ 文档主键。

动态映射 dynamic

在关系型数据库中,需要事先创建好数据库,并在库中插入表。而ES中需要事先创建好索引结构(Mapping),在插入文档到索引中,系统会根据文档内容进行索引的动态映射。自动检测添加新类型和字段,被成为动态映射。

禁用动态映射:{index_name}/_mapping dynamic 为false

text
1
2
3
4
5
6
POST student/_mapping
{
  "dynamic":"false"
}

GET student/_mappings

显式映射

实现准备好映射关系,包含文档各字段类型,关系等,这种称之为显式映射 Explicit mapping

动态模板

动态映射会自动推断数据类型,但这种并不完全符合所有的业务需求,而动态模板可以再动态映射之外更好的控制ES如何映射的数据类型。

模板的匹配
  • match_mapping_type 对 Elasticsearch 检测到的数据类型进行操作
  • match unmatch match使用pattern匹配字段名称,unmatch 使用正则排除字段
  • path_match path_unmatch 使用与match一样,这里为全名称,path指的是多层json的路径。

如,需要将所有数字字段映射为integer而不是long,将所有字符串都映射为text与keyword:

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
  "mappings": {
    "dynamic_templates": [
      {
        "integers": {
          "match_mapping_type": "long",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "fields": {
              "raw": {
                "type":  "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    ]
  }
}

可以使用正则表达式来匹配字段

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PUT student12345
{
  "mappings": {
    "dynamic_templates": [
      {
        "longs_as_strings": {
          "match_mapping_type": "string",  // 捕获的类型
          "match":   "pass*", // 将以pass开头的string类型的映射为integer
          "unmatch": "user*", // 忽略以user开头的
          "mapping": {
            "type": "integer"  // 需要映射的类型
          }
        }
      }
    ]
  }
}

PUT student12345/_doc/1
{
  "username": "zhangsan", 
  "password": "123456" 
}

查看映射后的类型

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
  "student12345" : {
    "mappings" : {
      "dynamic_templates" : [
        {
          "longs_as_strings" : {
            "match" : "pass*",
            "unmatch" : "user*",
            "match_mapping_type" : "string",
            "mapping" : {
              "type" : "integer"
            }
          }
        }
      ],
      "properties" : {
        "password" : {
          "type" : "integer"
        },
        "username" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

path_match path_unmatch

json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PUT test1
{
  "mappings": {
    "dynamic_templates": [
      {
        "full_name": { 
          "path_match":   "document.*", // 将name下的所有对象复制到外部顶级字段
          "path_unmatch": "*.middlename", // 这个字段除外
          "mapping": {
            "type":       "text",
            "copy_to":    "full_name"
          }
        }
      }
    ]
  }
}

PUT test1/_doc/1
{
  "document": {
    "firstname":  "John",
    "middlename": "Winston",
    "lastname":   "Lennon"
  }
}

当插入下列时,不成功,这里映射类型为text,与address中的对象类型不匹配所以不成功

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
PUT test1/_doc/1
{
  "document": {
    "firstname":  "John",
    "middlename": "Winston",
    "address": {
    	"city": "beijing",
    	"province": "beijing",
 			"District": "haidian"
    }
  }
}
模板变量

{name} {dynamic_type} 占位符,在映射中会替换为字段名和检测到的动态类型

json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
PUT student1
{
  "mappings": {
    "dynamic_templates": [
      {
        "named_analyzers": {
          "match_mapping_type": "string",
          "match": "*",
          "mapping": {
            "type": "text",
            "analyzer": "{name}"
          }
        }
      },
      {
        "no_doc_values": {
          "match_mapping_type":"*",
          "mapping": {
            "type": "{dynamic_type}",
            "doc_values": false
          }
        }
      }
    ]
  }
}

PUT student1/_doc/1
{
  "name": "alex chow", 
  "age": 30
}
  PUT student1/_doc/1
  {
    "english": "Some English text", 
    "count":   5 
  }

reference template-variables

索引的类型

Elasticsearch7.x中,不在需要document的 type

schedule_for_removal_of_mapping_types

ElasticSearch在7.x版本之前 index 类似于数据库中的 database,而 type 等同于数据库中的 table

如:6.x API

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
PUT student # index(库)
{
  "mappings": {
    "_doc": { # type (表)
      "properties": {
        "type": { # filed (字段)
          "type": "keyword"
        },
        "name": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "email": {
          "type": "keyword"
        },
        "content": {
          "type": "text"
        },
        "tweeted_at": {
          "type": "date"
        }
      }
    }
  }
}

而在7.x之后版本可以不需要

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

PUT student
{
  "mappings": {
      "properties": {
        "type": {
          "type": "keyword"
        },
        "name": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "email": {
          "type": "keyword"
        },
        "content": {
          "type": "text"
        },
        "tweeted_at": {
          "type": "date"
        }
      }
    }
}

在7.0以上版本使用时,必须使用 /{index_name}/_doc/{_id} 进行调用。

_doc 为路由永久组成,可以理解为 _doc 替换之前的 type

text
1
2
3
4
5
6
7
8
9
PUT /student/_doc/1
{
  "name": "zhangsan",
  "user_name": "zhangsan",
  "email": "1@gmail.com",
  "content": "北京分行、天津分行、河北分行、山西分行、辽宁分行"
}

GET /student/_doc/1

对于7.0之前的/{index}/{type}/{action} ,的操作如_update_search 将紧跟{action}后面。

text
1
2
3
4
5
6
7
8
POST /student/_update/1
{
  "doc": {
    "user_name": "lisi"
  }
}

GET /student/_search