Skip to content

基础操作

索引

http
# 创建索引
PUT /shopping
# 查询索引
GET /shopping
# 查询全部的索引
GET /_cat/indices?v
# 删除索引
DELETE /shopping
  1. 如果使用POST创建索引,会提示错误,因为即不能存在同样名称的索引,不满足幂等要求。
  2. 使用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": {}}}
  1. 创建文档(不指定id)时并不要求是幂等的操作,多次创建返回的id并不相同,所以创建文档需要使用POST请求。
  2. 如果创建指定id的文档,那么这个请求是幂等的(即相同id的文档只能创建一次),所以需要使用PUT请求。
  3. 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
        }
      }
    }
  }
}
  1. 如果脚本对应的字段没有文档数据,那么会提示错误。
  2. 在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
		}
	}
}
  1. 与其他类型新增保持一致,因为是幂等的(不能重复),所以需要基于PUT创建。
  2. text为文本类型会被分词,keyword为关键字类型不会分词,需要完全匹配(区分大小写)index表示能否被索引,如果设置false,查询时使用该字段会报错。
  3. ES默认为整数值分配long,浮点数值分配double。ES date类型支持多种format格式(也支持yyyy-MM-dd形式)。
  4. text、keyword、number、date都可以用来定义数组,我们只需要在传参的时候传入数组,ES会自动转换。
  5. copy_to可以将多个字段都赋值给代理字段,查询支持使用代理字段查询。比如使用nick_name也能匹配到name的数据。
  6. 更多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}}}
  1. 批量修改,不是全量覆盖,如果字段存在那么替换,如果不存在就新增。
  2. 如果操作的是同一个index,那么可以直接写在url路径中,在body中就不要传递index参数。