Elasticsearch 2.3.0 索引映射管理

筅森魡賤 提交于 2019-12-07 15:34:47

增加映射

API允许你向索引(index)添加文档类型(type),或者向文档类型(type)中添加字段(field)。

PUT secisland
{
  "mappings": {
    "log": {
      "properties": {
        "message": {
          "type": "string"
        }
      }
    }
  }
}

添加索引名为secisland,文档类型为log,其中包含字段message,字段类型是字符串。

PUT secisland/_mapping/user 

{
  "properties": {
    "name": {
      "type": "string"
    }
  }
}

向已经存在的索引secisland添加文档类型为user,包含字段name,字段类型是字符串。

PUT secisland/_mapping/log

{
  "properties": {
    "user_name": {
      "type": "string"
    }
  }
}

已经存在的索引secisland,文档类型为log,添加新的字段user_name,字段类型是字符串。


多个索引设置映射,可以一次向多个索引添加文档类型

PUT /{index}/_mapping/{type}
{ body }

{index}可以有多种方式,逗号分隔,比如test1,test2,test3

_all,表示所有索引,通配符,*表示所有,test*表示以test开头

{type}需要添加或更新的文档类型

{body}需要添加的字段或字段类型

更新字段映射

在一般情况下,对现有字段的映射不会更新。对这个规则有一些例外。例如:

新的属性被添加到对象数据类型的字段。

新的多域字段被添加到现有的字段。

doc_values可以被禁用。

增加了ignore_above参数。

例如:

请求:PUT my_index

参数:

 {
  "mappings": {
    "user": {
      "properties": {
        "name": {
          "properties": {
            "first": {
              "type": "string"
            }
          }
        },
        "user_id": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
 }

user的第一个name属性是对象数据类型(Object datatype)字段,对上个索引进行修改:

请求:PUT my_index/_mapping/user

参数:

{
  "properties": {
    "name": {
      "properties": {
        "last": { 
          "type": "string"
        }
      }
    },
    "user_id": {
      "type": "string",
      "index": "not_analyzed",
      "ignore_above": 100 
    }
  }
}

修改映射,对第一个对象数据类型增加了一个熟悉是last。修改了user_id, 通过设置ignore_above使默认的更新为0。

不同类型之间的冲突

    在同一个索引的不同类型(type)中,相同名称的字段中必须有相同的映射,因为他们内部是在同一个领域内,如果试图在这种情况下更新映射参数,系统将会抛出异常。除非在更新的时候指定 update_all_types参数。在这种情况下它将更新在相同的指标参数在所有同名的字段。

例如:

请求:PUT my_index

参数:

{
  "mappings": {
    "type_one": {
      "properties": {
        "text": { 
          "type": "string",
          "analyzer": "standard"
        }
      }
    },
    "type_two": {
      "properties": {
        "text": { 
          "type": "string",
          "analyzer": "standard"
        }
      }
    }
  }
}

修改映射

请求:PUT my_index/_mapping/type_one

参数:

{
  "properties": {
    "text": {
      "type": "string",
      "analyzer": "standard",
      "search_analyzer": "whitespace"
    }
  }
}

这个时候会抛出异常,然后增加参数,update_all_types,这个时候会同时更新两个类型

请求:PUT my_index/_mapping/type_one?update_all_types

 {
  "properties": {
    "text": {
      "type": "string",
      "analyzer": "standard",
      "search_analyzer": "whitespace"
    }
  }
}

获取映射

获取文档映射接口允许通过索引或者索引和类型来检索。

curl -XGET 'http://localhost:9200/twitter/_mapping/tweet'

系统同时支持获取多个索引和类型的语法:

获取文档映射接口一次可以获取多个索引或文档映射类型。该接口通常是如下格式:

host:port/{index}/_mapping/{type},{index}和{type}可以接受逗号(,)分隔符,也可以使用_all来表示全部索引。如下所示:

curl -XGET 'http://localhost:9200/_mapping/twitter,kimchy'

curl -XGET 'http://localhost:9200/_all/_mapping/tweet,book'

第一个省略_all,第二个使用_all都是表示全部索引。也就是说,下面两个是等价的:

curl -XGET 'http://localhost:9200/_all/_mapping'

curl -XGET 'http://localhost:9200/_mapping'

获取字段映射

获取文档字段接口允许你检索一个或多个字段。这个用来检索想要检索的字段,而不是某个索引或者文档类型的全部内容。

这段请求只返回字段为text的内容:

curl -XGET 'http://localhost:9200/twitter/_mapping/tweet/field/text'

响应结果如下(假定text为String类型)

{
   "twitter": {
      "tweet": {
         "text": {
            "full_name": "text",
            "mapping": {
               "text": { "type": "string" }
            }
         }
      }
   }
}

获取多索引和类型的字段映射。

获取文档字段映射接口一次可以获取多个索引或文档映射类型。该接口通常是如下格式:host:port/{index}/{type}/_mapping/field/{field}

{index},{type},{field}可以使用逗号(,)分隔,也可以使用*作为通配符{type},{field}可以使用逗号(,)分隔。

其中{index}可以使用_all表示全部索引,示例如下:

curl -XGET 'http://localhost:9200/twitter,kimchy/_mapping/field/message'

curl -XGET 'http://localhost:9200/_all/_mapping/tweet,book/field/message,user.id'

curl -XGET 'http://localhost:9200/_all/_mapping/tw*/field/*.id'

指定字段

获取文档字段接口,可以使用逗号(,)分隔符或者通配符(*)。

如下文档示例,如果只使用字段名id会产生歧义。

{
     "article": {
         "properties": {
             "id": { "type": "string" },
             "title":  { "type": "string"},
             "abstract": { "type": "string"},
             "author": {
                 "properties": {
                     "id": { "type": "string" },
                     "name": { "type": "string" }
                 }
             }
         }
     }
 }

如果想要表示author中的id,name,使用author.id,author.name。请求如下:

curl -XGET "http://localhost:9200/publications/_mapping/article/field/

author.id,abstract,author.name"

返回结果如下:

{
   "publications": {
      "article": {
         "abstract": {
            "full_name": "abstract",
            "mapping": {
               "abstract": { "type": "string" }
            }
         },
         "author.id": {
            "full_name": "author.id",
            "mapping": {
               "id": { "type": "string" }
            }
         },
         "author.name": {
            "full_name": "author.name",
            "mapping": {
               "name": { "type": "string" }
            }
         }
      }
   }
}

判断类型是否存在

检查索引或文档类型是否存在

curl -XHEAD -i 'http://localhost:9200/twitter/tweet'

存在返回200,不存在返回404。

    赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。也欢迎加入secisland公众号进行关注

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!