elasticsearch索引库操作二
elasticsearch索引库操作二
索引库就类似数据库表,mapping映射就类似表的结构。
我们要向es中存储数据,必须先创建“库”和“表”。
1、mapping映射属性
mapping是对索引库中文档的约束,常见的mapping属性包括:
- type:字段数据类型,常见的简单类型有:
- 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
- 数值:long、integer、short、byte、double、float、
- 布尔:boolean
- 日期:date
- 对象:object
- index:是否创建索引,默认为true
- analyzer:使用哪种分词器
- properties:该字段的子字段
列举json文档
{ "age": 21, "weight": 52.1, "isMarried": false, "info": "我是程序员Java讲师", "email": "zy@itcast.cn", "score": [99.1, 99.5, 98.9], "name": { "firstName": "云", "lastName": "赵" }}
对应的每个字段映射(mapping):
- age:类型为 integer;参与搜索,因此需要index为true;无需分词器
- weight:类型为float;参与搜索,因此需要index为true;无需分词器
- isMarried:类型为boolean;参与搜索,因此需要index为true;无需分词器
- info:类型为字符串,需要分词,因此是text;参与搜索,因此需要index为true;分词器可以用ik_smart
- email:类型为字符串,但是不需要分词,因此是keyword;不参与搜索,因此需要index为false;无需分词器
- score:虽然是数组,但是我们只看元素的类型,类型为float;参与搜索,因此需要index为true;无需分词器
- name:类型为object,需要定义多个子属性
- name.firstName;类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器
- name.lastName;类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器
2、创建索引库
需要借助
elastic
官网提供的工具来进行开发
2.1、创建索引库和映射关系
properties:是字段的意思,也可以多层的嵌套
基本语法:
- 请求方式:PUT
- 请求路径:/索引库名,可以自定义
- 请求参数:mapping映射
# 创建索引库PUT /chuangjian{ "mappings": { "properties": { "info":{ "type": "text", "analyzer": "ik_smart" }, "email":{ "type": "keyword", "index": false }, "name":{ "type": "object", "properties": { "firstName":{ "type": "keyword" }, "lastName":{ "type": "keyword" } } } } }}
运行结果
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "chuangjian"}
3、查询、删除索引库
-
查询索引库
# 查询索引库GET /[库名]
-
修改索引库(添加数据)
修改就是添加新的字段属性,如果是同名的字段就会以为是修改,那么就会报错
倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping。
虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。
# 修改索引库(添加数)PUT /[索引库名称]/_mapping{ "properties":{ "ages":{ "type" : "integer" } }}
如下是修改索引库的报错信息
{ "error" : { "root_cause" : [ { "type" : "mapper_parsing_exception", "reason" : "No handler for type [login] declared on field [ages]" } ], "type" : "mapper_parsing_exception", "reason" : "Failed to parse mapping [_doc]: No handler for type [login] declared on field [ages]", "caused_by" : { "type" : "mapper_parsing_exception", "reason" : "No handler for type [login] declared on field [ages]" } }, "status" : 400}
-
删除索引库
# 删除索引库DELETE /[索引库名称]
4、文档操作
chuangjian:代表的是一个索引库名
4.1、新增文档
# 插入文档POST /[索引库名]/_doc/[文档id]{ "info":"创建一个文档", "email":"4545@qq.com", "name":{ "firstName":"云", "loastName":"招" }}
4.2、查询文档
# 查看文档GET /[索引库名]/_doc/[文档id]
查询结果
{ "_index" : "chuangjian", "_type" : "_doc", "_id" : "1", "_version" : 5, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 4, "_primary_term" : 1}
每插入一次数据,那么
_version
版本的信息都会自增
4.3、删除文档
# 删除文档DELETE /[索引库名]/_doc/[文档id]
4.4、修改文档
-
全量修改文档
# 全量修改文档PUT /[索引库名]/_doc/[文档id]{ "info":"创建一个文档", "email":"454564ada@qq.com", "name":{ "firstName":"云", "loastName":"招" }}
-
局部修改文档字段
# 局部修改指定字段文档POST /[索引库名]/_update/1{ "doc": { "修改字段":"Zhangs@qq.com" }}
总结
文档操作有哪些?
- 创建文档:POST /{索引库名}/_doc/文档id { json文档 }
- 查询文档:GET /{索引库名}/_doc/文档id
- 删除文档:DELETE /{索引库名}/_doc/文档id
- 修改文档:
- 全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
- 增量修改:POST /{索引库名}/_update/文档id { “doc”: {字段}}