文章目录
- 一、操作索引库
- 1、mapping映射属性
- 2、索引库的CRUD
 
- 二、文档操作
- 1、新增文档
- 2、查询文档
- 3、删除文档
- 4、修改文档
- 5、注意点
 
一、操作索引库

1、mapping映射属性
mapping是对索引库中文档的约束,常见的mapping属性包括:
- type:字段数据类型
# 常见的简单类型有:
字符串: 又可细分为text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址,即拆开就没意义了)
数值: long、integer、short、byte、double、float、
布尔: boolean
日期: date
对象: object
- index:是否创建(倒排)索引,默认为true
- analyzer:使用哪种分词器
- properties:该字段的子字段
举例:
{
    "age": 23,
    "weight": 52.1,
    "isMarried": false,
    "info": "难说",
    "email": "9527@csdn.cn",
    "score": [99.1, 99.5, 98.9],
    "name": {
        "firstName": "哈",
        "lastName": "哈"
    }
}
注意ES中并没有数组类型,"score": [99.1, 99.5, 98.9] ,但是允许某个类型的字段有多个值,只管括号里元素的类型,即这里的score是double类型。
2、索引库的CRUD
创建索引库:
ES中通过Restful请求操作索引库、文档。请求内容用DSL语句来表示。创建索引库和mapping的DSL语法如下:
PUT /索引库名称
{
  "mappings": {
    "properties": {
      "字段名1":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "字段名2":{
        "type": "keyword",
        "index": "false"
      },
      "字段名3":{
        "properties": {
          "子字段": {
            "type": "keyword"
          }
        }
      },
      // ...略
    }
  }
}
示例:
PUT /code9527
{
  "mappings": {
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"  #index用默认的,这里不写了
      },
      "email":{
        "type": "keyword",  #email肯定不能分词,类型为字符串下的keyword
        "index": "false"  # keyword不用指定分词器
      },
      "name":{
        "properties": {   # name字段有嵌套
          "firstName": {
            "type": "keyword"
          },
          "lastName": {
            "type": "keyword"
          }
        }
      },
      // ... 略
    }
  }
}

 创建的这一整个索引,也就像MySQL中的一张表了。
查询索引库:
GET /索引库名 
举例:
 
删除索引库:
 
DELETE /索引库名 
举例:

修改索引库:
ES不支持修改索引库,但可以添加新的字段,如:
PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{   # 注意一定是新字段,否则ES会认为你在修改索引库,会拒绝
      "type": "integer"
    }
  }
}
示例:
PUT /code9527/_mapping
{
  "properties": {
    "age":{
      "type": "integer"
    }
  }
}

 小结:

二、文档操作
1、新增文档
类比往MySQL的table里insert数据,语法:
# 文档id不写自动生成,但不建议这么写
POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
    // ...
}
举例:
POST /code9527/_doc/1
{
    "info": "code9527",
    "email": "9527@csdn.cn",
    "name": {
        "firstName": "code",
        "lastName": "9527"
    }
}

2、查询文档
语法:
GET /索引库名/_doc/文档id 
举例:
 
3、删除文档
语法:
DELETE /索引库名/_doc/文档id 
举例:
 
4、修改文档
全量修改:
根据传入的id,删除旧文档,再添加新文档(delete from where xx=文档id + insert table …):
PUT /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}
# 和新增文档语法一样,只是请求方式从POST变成了PUT
举例:
PUT /code9527/_doc/1
{
    "info": "code9527+++",
    "email": "9527@csdn.cn",
    "name": {
        "firstName": "code",
        "lastName": "9527"
    }
}

注意,当传入的文档id不存在,先删后改就成了空删,相当于增加文档了,是个新增操作了。
增量修改:
修改指定字段值,语法:
POST /索引库名/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}
举例:
POST /code9527/_update/1
{
  "doc": {
    "email": "code9527@csdn.cn"
  }
}

5、注意点
当向ES插入的文档中,字段没有对应的mapping,如:
POST /code9527/_doc/2
{
    "info": "code9527",
    "email": "9527@csdn.cn",
    "name": {
        "firstName": "code",
        "lastName": "9527"
    },
    "city":"天津",  # 没有mapping的字段
    "birtyday":"2000-01-28"  # 多了字段
}
结果:
 
 GET一下:

 即:**插入文档时,es会检查文档中的字段是否有mapping,如果没有则按照默认mapping规则来创建索引。**规则如下:
 
 如果默认mapping规则不符合你的需求,一定要自己设置字段mapping
小结:




















