一、 概述
es的操作是基于 Restful 风格的 API 操作,请求体则是 Json 格式。
二、创建索引
格式: PUT /索引名称
索引命名规范:
- 以小写英文字母命名索引
- 不要使用驼峰命名法则
- 如过出现多个单词的索引名称,以全小写 + 下划线分隔的方式:如test_index。
ES 索引创建成功之后,以下属性将不可修改:
- 索引名称
- 主分片数量
- 字段类型
# 简单创建索引 PUT /es_db # 插入数据自动创建索引 PUT /user/_doc/1 { "name":"fox", "age":32, "address":"长沙麓谷" } # 静态映射创建索引 PUT /user { "settings": { "number_of_shards": "1", "number_of_replicas": "1" }, "mappings": { "properties": { "name": { "type": "keyword" }, "age" : { "type" : "long" }, "address" : { "type" : "text" } } } }
备注:es的索引并不像关系型数据库一样需要提前定义。它在PUT数据的过程中会动态生成索引的映射,如果后续PUT过程中有新的字段需要保存,它同样会动态添加新字段的映射
三、查询索引
格式: GET /索引名称
# 查询索引 GET /es_db # es_db是否存在 HEAD /es_db # match 匹配查询,会对查询文本分词后匹配 GET /es_db/_search { "query": { "match": { "address": "广州白云" } } } # term 词项查询,属于精确查询,不会对查询文本分词 GET /es_db/_search { "query": { "term": { "address": "广州白云" } } } #通过URI搜索,使用“q”指定查询字符串,“query string syntax” KV键值对 #条件查询, 如要查询age等于28岁的 _search?q=*:*** GET /es_db/_doc/_search?q=age:28 #范围查询, 如要查询age在25至26岁之间的 _search?q=***[** TO **] 注意: TO 必须为大写 GET /es_db/_doc/_search?q=age[25 TO 26] #查询年龄小于等于28岁的 :<= GET /es_db/_doc/_search?q=age:<=28 #查询年龄大于28前的 :> GET /es_db/_doc/_search?q=age:>28 #分页查询 from=*&size=* GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1 #对查询结果只输出某些字段 _source=字段,字段 GET /es_db/_doc/_search?_source=name,age #对查询结果排序 sort=字段:desc/asc GET /es_db/_doc/_search?sort=age:desc
四、删除索引
格式: DELETE /索引名称
DELETE /es_db
五、修改索引
格式: PUT /索引名称
# 创建索引es_db,指定其主分片数量为 3,每个主分片的副本数量为 2 PUT /es_db { "settings" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } # 创建索引时可以指定IK分词器作为默认分词器 PUT /es_db { "settings" : { "index" : { "analysis.analyzer.default.type": "ik_max_word" } } } # 填了id则是修改,不填即是新增 POST /es_db/_doc { "name": "张三", "sex": 1, "age": 25, "address": "广州天河公园", "remark": "java developer" } # 指定id新增数据,是全字段的更新,相当于删除旧文档,重新建新文档 PUT /es_db/_doc/1 { "name": "张三", "sex": 1, "age": 25, "address": "广州天河公园", "remark": "java developer" } # 部分更新:在原有文档上更新 # Update -文档必须已经存在,更新只会对相应字段做增量修改 POST /es_db/_update/1 { "doc": { "age": 28 } } # 使用 _update_by_query 更新文档 POST /es_db/_update_by_query { "query": { "match": { "_id": 1 } }, "script": { "source": "ctx._source.age = 30" } } # 并发场景下修改文档 # _seq_no和_primary_term是对_version的优化,7.X版本的ES默认使用这种方式控制版本,所以当在 # 高并发环境下使用乐观锁机制修改文档时,要带上当前文档的_seq_no和_primary_term进行更新: POST /es_db/_doc/2?if_seq_no=21&if_primary_term=6 { "name": "李四xxx" } # 删除文档 DELETE /es_db/_doc/1
注意: POST和PUT都能起到创建/更新的作用,PUT需要对一个具体的资源进行操作也就是要确定id才能进行更新/创建,而POST是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行创建新文档,如果填了id那就针对这个id的文档进行创建/更新
六、批量操作
批量操作可以减少网络连接所产生的开销,提升性能
- 支持在一次API调用中,对不同的索引进行操作
- 可以在URI中指定Index,也可以在请求的Payload中进行
- 操作中单条操作失败,并不会影响其他操作
- 返回结果包括了每一条操作执行的结果
6.1 批量写入
批量对文档进行写操作是通过_bulk的API来实现的
- 请求方式:POST
- 请求地址:_bulk
- 请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)
第一行参数为指定操作的类型及操作的对象(index,type和id)
第二行参数才是操作的数据
参数类似于:
{"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}} {"field1":"value1", "field2":"value2"}
actionName:表示操作类型,主要有create,index,delete和update
6.2 批量创建文档create
POST _bulk {"create":{"_index":"article", "_type":"_doc", "_id":3}} {"id":3,"title":"标题1","content":"内容1","tags":["java", "面向对象"],"create_time":1554015482530} {"create":{"_index":"article", "_type":"_doc", "_id":4}} {"id":4,"title":"标题2","content":"内容2","tags":["java", "面向对象"],"create_time":1554015482530}
6.3 普通创建或全量替换index
POST _bulk {"index":{"_index":"article", "_type":"_doc", "_id":3}} {"id":3,"title":"标题1","content":"内容1","tags":["java", "面向对象"],"create_time":1554015482530} {"index":{"_index":"article", "_type":"_doc", "_id":4}} {"id":4,"title":"标题2","content":"内容2","tags":["java", "面向对象"],"create_time":1554015482530}
- 如果原文档不存在,则是创建
- 如果原文档存在,则是替换(全量修改原文档)
6.4 批量删除delete
POST _bulk {"delete":{"_index":"article", "_type":"_doc", "_id":3}} {"delete":{"_index":"article", "_type":"_doc", "_id":4}}
6.5 批量修改update
POST _bulk {"update":{"_index":"article", "_type":"_doc", "_id":3}} {"doc":{"title":"ES大法必修内功"}} {"update":{"_index":"article", "_type":"_doc", "_id":4}} {"doc":{"create_time":1554018421008}}
6.6 组合应用
POST _bulk {"create":{"_index":"article", "_type":"_doc", "_id":3}} {"id":3,"title":"标题1","content":"内容1","tags":["java", "面向对 象"],"create_time":1554015482530} {"delete":{"_index":"article", "_type":"_doc", "_id":3}} {"update":{"_index":"article", "_type":"_doc", "_id":4}} {"doc":{"create_time":1554018421008}}
6.7 批量读取
es的批量查询可以使用mget和msearch两种。其中mget是需要我们知道它的id,可以指定不同的
index,也可以指定返回值source。msearch可以通过字段查询来进行一个批量的查找。
_mget
GET _mget { docs": [ { _index": "es_db", _id": 1, "_index": "article", "_id": 4 } ] } #可以通过ID批量获取es_db的数据 GET /es_db/_mget { "docs": [ { "_id": 1 }, { "_id": 4 } ] } #简化后 GET /es_db/_mget { "ids":["1","2"] }
_msearch
在_msearch中,请求格式和bulk类似。查询一条数据需要两个对象,第一个设置index和type,第二 个设置查询语句。查询语句和search相同。如果只是查询一个index,我们可以在url中带上index,这 样,如果查该index可以直接用空对象表示。
GET /es_db/_msearch {} {"query" : {"match_all" : {}}, "from" : 0, "size" : 2} {"index" : "article"} {"query" : {"match_all" : {}}}
本人近十年JAVA架构设计经验,长期从事IT技术资源整合。有志于自我技术提升、需要最新IT技术课程的小伙伴,可私信联系我 ,粉丝一律白菜价