本文发布于Cylon的收藏册,转载请著名原文链接~
索引管理
创建索引
直接创建索引 PUT newindex1
,创建索引可以通过 number_of_shares
和 number_of_replicas
数量来修饰分片和副本的数量。
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
关闭的索引无法进行【增删改查】操作
{
"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-fields
与 field of properties
meta-fields
:为文档的源数据,如 _index
(索引的名称)、_type
(文档的类型,7.0+弃用)、_id
(索引的ID)和 _source
(用于关联文档源数据)字段
field of properties
:字段属性,包含文档的字段或属性列表。
字段的数据类型
常见类型
binary
:二进制或Base64字符串。boolean
: 布尔值true
和false
。keywords
:keyword
,constant_keyword
, 和wildcard
.Numbers
:数值类型,例如long
和double
dates
:日期类型,date
和date_nanos
。alias
: 为以有字段定义别名。
对象嵌套类型
object
:JSON对象。flattened
:整个JSON对象作为单个字段值。nested
:嵌套,与子字段之间保留关系的json对象。join
:为同一索引中的文档定义父/子关系。
结构化类型
range
:,long_range
,double_range
,date_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
字段 | 说明 |
---|---|
analyzer | 仅text 字段支持 analyzer 映射参数。 |
index | 选项控制是否对字段值建立索引。默认为true 。未索引的字段不可查询。 |
index_prefixes | 启用术语前缀的索引,以加快前缀搜索的速度 |
ignore_above | 长度大于 ignore_above设置的字符串将不会被索引或存储 |
映射的元字段
文档的元字段是保证系统正常运转的内置字段,如 _index
索引的字段 _type
映射类型(7.0后取消),_id_
文档主键。
动态映射 dynamic
在关系型数据库中,需要事先创建好数据库,并在库中插入表。而ES中需要事先创建好索引结构(Mapping),在插入文档到索引中,系统会根据文档内容进行索引的动态映射。自动检测添加新类型和字段,被成为动态映射。
禁用动态映射:{index_name}/_mapping
dynamic
为false
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:
{
"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
}
}
}
}
}
]
}
}
可以使用正则表达式来匹配字段
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"
}
查看映射后的类型
{
"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
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中的对象类型不匹配所以不成功
PUT test1/_doc/1
{
"document": {
"firstname": "John",
"middlename": "Winston",
"address": {
"city": "beijing",
"province": "beijing",
"District": "haidian"
}
}
}
模板变量
{name} {dynamic_type} 占位符,在映射中会替换为字段名和检测到的动态类型
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
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之后版本可以不需要
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
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}
后面。
POST /student/_update/1
{
"doc": {
"user_name": "lisi"
}
}
GET /student/_search
本文发布于Cylon的收藏册,转载请著名原文链接~
链接:https://www.oomkill.com/2021/11/elasticsearch-mapping/
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。