基础操作
索引
http
# 创建索引
PUT /shopping
# 查询索引
GET /shopping
# 查询全部的索引
GET /_cat/indices?v
# 删除索引
DELETE /shopping
- 如果使用POST创建索引,会提示错误,因为即不能存在同样名称的索引,不满足幂等要求。
- 使用curl命令时,如果希望展示美化格式,那么需要加上?pretty,默认是将结果展示为一行。
文档
http
# 创建文档
POST /{index}/_doc {body}
# 创建指定id的文档
PUT /{index}/_create/{id} {body}
# 查询指定id的文档
GET /{index}/_doc/{id}
# 查询索引下全部的文档
GET /{index}/_search
# 更新文档(局部)
POST /{index}/_update/{id} {"doc":{"field":"value"}}
# 更新文档(全量)
PUT/POST /{index}/_doc/{id} {body}
# 删除文档
DELETE /{index}/_doc/{id}
# 删除索引下的全部文档
DELETE /{index}/_delete_by_query {"query":{"match_all": {}}}
- 创建文档(不指定id)时并不要求是幂等的操作,多次创建返回的id并不相同,所以创建文档需要使用POST请求。
- 如果创建指定id的文档,那么这个请求是幂等的(即相同id的文档只能创建一次),所以需要使用PUT请求。
- ES中默认的脚本是
painless
,也支持expression、mustache
。
脚本
http
# 脚本查询:将文档中所有的age增加2
GET /{index}/_search
{
"script_fields": {
"my_doubled_field": {
"script": {
"source": "doc['age'].value * params['multiplier']",
"lang": "painless",
"params": {
"multiplier": 2
}
}
}
}
}
# 存储脚本
POST /_scripts/{script_name}
{
"script": {
"lang": "painless",
"source": "doc['age'].value * params['multiplier']"
}
}
# 查询脚本
GET /_scripts/{script_name}
# 查询时使用脚本
GET /{index}/_search
{
"query": {
"script_score": {
"query": {
"match_all": {
}
},
"script": {
"id": {script_name},
"params": {
"multiplier": 3
}
}
}
}
}
- 如果脚本对应的字段没有文档数据,那么会提示错误。
- 在search查询中使用脚本id查询的话,脚本执行的结果在
max_core
这个参数中。
索引定义
索引定义(mapping) 类似于数据库中的表结构定义 schema
,用于定义index中的字段名称,类型等相关设置。
http
# 创建索引同时指定mapping
PUT /{index}
{
"mappings": {
"properties": {
"category": {
"type": "text"
}
}
}
}
PUT /{index}/_mapping
{
"properties":{
"name": {
"type": "text", // 可以被分词
"index": true, // 可以被索引查询(默认true)
"analyzer":"ik_max_word", // 指定文档存储时为ik分词器
"search_analyzer": "standard" // 搜索时对输入按照标准分词器分词
"copy_to": "nick_name" // copy_to 在搜索时使用nick_name也可以实现搜索
},
"sex": {
"type": "boolean", // 布尔类型
},
"phone": {
"type": "keyword", // 不能被分词,完整匹配
"index": false, // 不能被索引查询
"ignore_above": 256 // 超过此值的数据不会被索引
},
"age": {
"type": "byte/short/long/double/float/int" // 数值型
},
"birthday": {
"type":"date" // 日期类型
"format": "basic_date"
}
}
}
# 为已存在的mapping添加新的字段(已经存在的mapping字段无法修改只能新增!)
PUT /{index}/_mapping
{
"properties": {
"address": {
"type": "text",
"index": true
}
}
}
- 与其他类型新增保持一致,因为是幂等的(不能重复),所以需要基于PUT创建。
text
为文本类型会被分词,keyword
为关键字类型不会分词,需要完全匹配(区分大小写)
,index
表示能否被索引,如果设置false,查询时使用该字段会报错。- ES默认为整数值分配long,浮点数值分配double。ES date类型支持多种format格式(也支持
yyyy-MM-dd
形式)。- text、keyword、number、date都可以用来定义数组,我们只需要在传参的时候传入数组,ES会自动转换。
- copy_to可以将多个字段都赋值给代理字段,查询支持使用代理字段查询。比如使用nick_name也能匹配到name的数据。
- 更多mapping参数定义请点击查看→官网文档←。
批量操作
http
# 批量新增
POST /_bulk
{"create": {"_index":{index1},"_id": {id1}}}
{"field1": "value1", "field2": "value2"}
{"create": {"_index":{index2},"_id": {id2}}}
{"field1": "value1", "field2": "value2"}
# 批量修改
POST /_bulk
{"update": {"_index":{index1}, "id": {id1}}}
{"doc": {"field1":"value1"}}
{"update": {"_index":{index2},"_id": {id2}}}
{"doc": {"field1":"value2"}}
#批量删除
POST /_bulk
{"delete": {"_index":{index1},"_id": {id1}}}
{"delete": {"_index":{index2},"_id": {id2}}}
- 批量修改,不是全量覆盖,如果字段存在那么替换,如果不存在就新增。
- 如果操作的是同一个index,那么可以直接写在url路径中,在body中就不要传递index参数。