这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战;
备注:继Elasticsearch笔记(9)
深度分页
分页查询
#POST /{index}/_doc/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 10
}
深度分页
深度分页其实就是搜索的深浅度,比如第1页,第2页,第10页,第20页,是比较浅的;第10000页,第20000页就是很深了。
使用如下操作:
{
"query": {
"match_all": {}
},
"from": 9990,
"size": 10
}
{
"query": {
"match_all": {}
},
"from": 9999,
"size": 10
}
我们在获取第9999条到10009条数据的时候,其实每个分片都会拿到10009条数据,然后集合在一起,总共是10009*3=30027条数据,针对30027数据再次做排序处理,最终会获取最后10条数据。
如此一来,搜索得太深,就会造成性能问题,会耗费内存和占用cpu。而且es为了性能,他不支持超过一万条数据以上的分页查询。那么如何解决深度分页带来的性能呢?其实我们应该避免深度分页操作(限制分页页数),比如最多只能提供100页的展示,从第101页开始就没了,毕竟用户也不会搜的那么深,我们平时搜索淘宝或者百度,一般也就看个10来页就顶多了。
譬如淘宝搜索限制分页最多100页,如下:
提升搜索量
通过设置index.max_result_window来突破10000数据
#GET /{index}/_settings
设置index.max_result_window
#PUT /{index}/_settings
{
"index.max_result_window": "20000"
}
scroll 滚动搜索
一次性查询1万+数据,往往会造成性能影响,因为数据量太多了。这个时候可以使用滚动搜索,也就是 scroll。 滚动搜索可以先查询出一些数据,然后再紧接着依次往下查询。在第一次查询的时候会有一个滚动id,相当于一个锚标记,随后再次滚动搜索会需要上一次搜索的锚标记,根据这个进行下一次的搜索请求。每次搜索都是基于一个历史的数据快照,查询数据的期间,如果有数据变更,那么和搜索是没有关系的,搜索的内容还是快照中的数据。
- scroll=1m,相当于是一个session会话时间,搜索保持的上下文时间为1分钟。
第一次查询
# POST /{index}/_search?scroll=1m
{
"query": {
"match_all": {
}
},
"sort" : ["_doc"],
"size": 5
}
第二次查询
# POST /_search/scroll
{
"scroll": "1m",
"scroll_id" : "your last scroll_id"
}
官文地址:www.elastic.co/guide/cn/el…
批量操作 bulk
基本语法
bulk操作和以往的普通请求格式有区别。不要格式化json,不然就不在同一行了,这个需要注意。
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
...
{ action: { metadata }}代表批量操作的类型,可以是新增、删除或修改\n是每行结尾必须填写的一个规范,每一行包括最后一行都要写,用于es的解析{ request body }是请求body,增加和修改操作需要,删除操作则不需要
批量操作的类型
action 必须是以下选项之一:
- create:如果文档不存在,那么就创建它。存在会报错。发生异常报错不会影响其他操作。
- index:创建一个新文档或者替换一个现有的文档。
- update:部分更新一个文档。
- delete:删除一个文档。
metadata 中需要指定要操作的文档的_index 、 _type 和 _id,_index 、 _type也可以在url中指定
实操
-
create新增文档数据,在metadata中指定index以及type
#POST /_bulk {"create": {"_index": "user", "_type": "_doc", "_id": "2001"}} {"id": "2001", "nickname": "name2001"} {"create": {"_index": "user", "_type": "_doc", "_id": "2002"}} {"id": "2002", "nickname": "name2002"} {"create": {"_index": "user", "_type": "_doc", "_id": "2003"}} {"id": "2003", "nickname": "name2003"} #返回结果 { "took": 973, "errors": false, "items": [ { "create": { "_index": "user", "_type": "_doc", "_id": "2001", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1, "status": 201 } }, { "create": { "_index": "user", "_type": "_doc", "_id": "2002", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1, "status": 201 } }, { "create": { "_index": "user", "_type": "_doc", "_id": "2003", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 2, "_primary_term": 1, "status": 201 } } ] } ##创建成功 -
create创建已有id文档,在url中指定index和type
#POST /{index}/_doc/_bulk #POST /user/_doc/_bulk {"create": {"_index": "user", "_id": "2001"}} {"id": "2001", "nickname": "name2001new"} {"create": {"_index": "user", "_id": "2004"}} {"id": "2002", "nickname": "name2004"} {"create": {"_index": "user", "_id": "2005"}} {"id": "2003", "nickname": "name2005"} -
index创建,已有文档id会被覆盖,不存在的id则新增
#POST /shop/_doc/_bulk {"index": {"_id": "2004"}} {"id": "2004", "nickname": "index2004"} {"index": {"_id": "2007"}} {"id": "2007", "nickname": "name2007"} {"index": {"_id": "2008"}} {"id": "2008", "nickname": "name2008"} -
update跟新部分文档数据
# POST /{index}/_doc/_bulk
{"update": {"_id": "2004"}}
{"doc":{ "id": "3004"}}
{"update": {"_id": "2007"}}
{"doc":{ "nickname": "nameupdate"}}
- delete批量删除
#POST /{index}/_doc/_bulk
{"delete": {"_id": "2004"}}
{"delete": {"_id": "2007"}}
- 综合批量各种操作
#POST /{index}/_doc/_bulk
{"create": {"_id": "8001"}}
{"id": "8001", "nickname": "name8001"}
{"update": {"_id": "2001"}}
{"doc":{ "id": "20010"}}
{"delete": {"_id": "2003"}}
{"delete": {"_id": "2005"}}