文章目录
- 一、操作索引库
- 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
小结: