美文网首页
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分页

    在项目中我用到ES的两种分页方式,这里记录一下。 Pageable深度分页 Spring data实现接口接收Ma...

  • elastichsearch index template模板字

    索引模板(index template)是指,通过创建一些模板,使后续在创建索引时,若索引名符合模板中index_...

  • MyBatis之分页

    五、分页 目录:使用Limit分页、RowBounds分页、分页插件 1.使用Limit分页 语法: 使用MyBa...

  • JS的分页算法

    分页的总页数算法 分页算法 分页存储过程或者页面分页中的分页算法: int pagesize // 每页记录数 i...

  • WEB页面中几种常见的分页样式

    这里谈谈WEB页面中几种常见的分页样式 分页样式一:滚动翻页image 分页样式二:常规分页image 分页样式三...

  • 目录【Java分页(前台+后台)】

    SubList分页-001-分页概述 SubList分页-002-需求 SubList分页-003-中文处理 Su...

  • SSM框架-实现Mybatis分页功能-foreknow_cms

    分页处理 分页1、前台分页2、数据库(后台)分页3、存储过程 Orade (Rownum) Mysql(lim...

  • 2018-10-10:分页

    分页 真分页使用特定的sql语句,条件查询出指定内容 假分页数据全部取出,在页面分页显示 分页数据pageSize...

  • Springboot 分页

    //分页返回类 @ApiModel(value ="分页内容", description ="分页数据返回内容")...

  • 分页SQL

    分页 rownum,rowid 分页SQL

网友评论

      本文标题:Elastichsearch分页

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