美文网首页
Elastichsearch分页

Elastichsearch分页

作者: Anson_1f2a | 来源:发表于2020-08-31 11:03 被阅读0次

    在项目中我用到ES的两种分页方式,这里记录一下。

    Pageable深度分页

    GET my_index/_search
    {
      "size": 10, // 每页数量
      "from": 0, // 第几页
      "query": {
        "match_all": {}
      }
    }
    

    Spring data实现
    接口接收Map对象和spring pageableStringQuery载入检索条件和分页参数,使用ElasticsearchRestTemplate进行检索。

    @PostMapping("/_search")
    fun search(@RequestBody body: Map<String, Any>, pageable: Pageable): Mono<SearchHits<Any>> {
        val json = Gson().toJson(body)
        val query = StringQuery(json)
        query.setPageable<StringQuery>(pageable)
        return mono {
            esTemplate.search(query, Any::class.java)
        }
    }
    

    Scroll游标分页

    GET my_index/_search?scroll=1m
    {
      "size": 100,
      "query": {
        "match_all": {}
      }
    }
    

    1m表示scroll_id在一分钟内有效。

    返回结果

    {
      "_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAA3j8YWNXNZY212SFJRd0N3bUlzU1paSVVnZw==",
      "took" : 23,
       \\ 以下省略几百行
    }
    

    使用返回结果中的_scroll_id进行下次搜索。

    GET _search/scroll
    {"scroll":"1m","scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAA3gekWNXNZY212SFJRd0N3bUlzU1paSVVnZw=="}
    

    Spring data实现

    // 首次进行搜索
    @PostMapping("/_search")
    fun searchStart(@RequestBody body: Map<String, Any>): Mono<SearchHits<Any>> {
        val json = Gson().toJson(body)
        val query = StringQuery(json)
        query.setMaxResults(100)
        return mono {
            esTemplate..searchScrollStart(
                    Duration.ofMinutes(5).toMillis(),
                    query,
                    Any::class.java,
                    IndexCoordinates.of("my_index")
            )
        }
    }
    // 再次搜索
    @GetMapping("/_search/{scrollId}")
    fun continueSearch(@PathVariable scrollId: String): Mono<SearchHits<Any>> {
        return mono {
            esTemplate..searchScrollContinue(
                    scrollId,
                    Duration.ofMinutes(5).toMillis(),
                    Any::class.java,
                    IndexCoordinates.of("my_index")
            )
        }
    }
    

    需要注意:

    1. Durationscroll_id的有效时间
    2. scroll搜索不能使用分页参数,只能设置最大返回结果数量setMaxResults,因为from参数已被删除。若使用pageable则会报以下错误,官网给出的解释
    Validation Failed: 1: using [from] is not allowed in a scroll context;
    

    相关文章

      网友评论

          本文标题:Elastichsearch分页

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