美文网首页
ES DSL搜索 - 深度分页与优化

ES DSL搜索 - 深度分页与优化

作者: 小P聊技术 | 来源:发表于2021-03-14 10:02 被阅读0次

1 介绍

主要介绍索引请求的基础API操作,使用postman进行请求,接口请求的前缀地址统一为elasticsearch 部署IP地址+端口号(例如 http://192.168.51.4:9200 。

统一请求地址:

POST /search_demo/_doc/_search

2 深度分页弊端

深度分页其实就是搜索的 深浅度,比如第1页,第2页,第20页,都是比较浅的搜索;而第10000页,第20000页都是很深了。

传递JSON数据

{
    "query": {
        "match_all": {}
    },
    "from": 9999,
    "size": 10
}

请求结果有如下报错

Result window is too large, from + size must be less than or equal to: [10000] but was [10009].

在获取9999到10009条数据的时候,如果索引有三个分片的话,其实搜索是将从每个分片里面都获取10009条数据,然后集合在一起,总共是10009 * 3 = 30027条数据,针对30027条数据再次进行排序处理,最后得到最后的10条数据。

如此一来,搜索的越深入,就会造成性能问题,会耗费内存和占用CPU。es为了性能,它不支持超过一万条以上的分页查询。

3 优化深度分页

3.1 避免深度分页

避免深度分页操作可以通过限制分页页码,比如最多只能提供100页的展示,从101也开始就没了,针对一般用户搜索页码翻取不会太多的情况。

3.2 提升搜索量

设置 index.max_result_window 参数,自定义最大搜索数量

PUT /search_demo/_settings
{
   "index.max_result_window": 20000
}

3.3 滚动搜索

scroll 滚动搜索(游标查询),滚动搜索可以先查询出一些数据,然后再紧接着依次往下查询。在第一次查询的时候会有一个滚动ID,相当于一个 锚标记,随后再次滚动搜索会需要上次搜索的 锚标记,根据这个进行下一次的搜索请求。

每次搜索都是基于一个历史的数据快照,查询数据的期间,如果有数据变更,搜索的内容并不会发生改变。

  • scroll=1m,相当于是一个session会话时间,搜索保持的上下文时间为1分钟。

官方地址:

https://www.elastic.co/guide/cn/elasticsearch/guide/current/scroll.html

第一次请求

POST /search_demo/_search?scroll=1m
{
    "query": {
        "match_all": {}
    },
    "sort": ["_doc"],
    "size": 1
}
{
    "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAAAwFmt1RWVPY09BUm51RGZTMnF3VUE2bFEAAAAAAAAAMRZrdUVlT2NPQVJudURmUzJxd1VBNmxR",
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 2,
        "successful": 2,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 18,
            "relation": "eq"
        },
        "max_score": null,
        "hits": [
            {
                "_index": "search_demo",
                "_type": "_doc",
                "_id": "1001",
                "_score": null,
                "_source": {
                    "id": 1001,
                    "age": 18,
                    "username": "Tic",
                    "nickname": "飞翔的荷兰号",
                    "money": 88.8,
                    "desc": "我在p2pi网站解决项目中遇到的问题,学习到了很多知识",
                    "sex": 0,
                    "birthday": "1992-12-24",
                    "face": "http://www.p2pi.cn/static/img/1001_face.png"
                },
                "sort": [
                    0
                ]
            }
        ]
    }
}

第二次请求

  • scroll_id:第一次请求返回的 _scroll_id
POST /_search/scroll
{
   "scroll_id": "DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAAAwFmt1RWVPY09BUm51RGZTMnF3VUE2bFEAAAAAAAAAMRZrdUVlT2NPQVJudURmUzJxd1VBNmxR",
   "scroll": "1m"
}
{
    "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAAAwFmt1RWVPY09BUm51RGZTMnF3VUE2bFEAAAAAAAAAMRZrdUVlT2NPQVJudURmUzJxd1VBNmxR",
    "took": 5,
    "timed_out": false,
    "terminated_early": true,
    "_shards": {
        "total": 2,
        "successful": 2,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 18,
            "relation": "eq"
        },
        "max_score": null,
        "hits": [
            {
                "_index": "test",
                "_type": "_doc",
                "_id": "2001",
                "_score": null,
                "_source": {
                    "id": "2001",
                    "nickname": "test-2001"
                },
                "sort": [
                    0
                ]
            }
        ]
    }
}

4 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢

相关文章

网友评论

      本文标题:ES DSL搜索 - 深度分页与优化

      本文链接:https://www.haomeiwen.com/subject/dlhqcltx.html