Elasticsearch笔记(10)

245 阅读4分钟

这是我参与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页,如下:

5e01c61308dbaf8507010063.jpg

提升搜索量

通过设置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"}}