Es id in 查询大量数据很慢

1. 运行环境

1). 当前使用的 Laravel 版本?

laravel: 10
//: <> (使用 php artisan --version 命令查看)

2). 当前使用的 php/php-fpm 版本?

PHP 版本:8.2

php-fpm 版本:8.2

3). 当前系统

4). 业务环境

本地docker环境
//: <> (期待信息 开发环境生产环境)
//: <> (是否使用负载均衡?请提供相关信息)

5). 相关软件版本

es:7.13

2. 问题描述?

es 查询 trems:{ “id”: [ 1,2…. ] } id 集合有 1w个, 查询要15秒
api datas/_search
Params:

{
    "query":{"terms":{"id":[2,3,4,5,6,7,8,9,10...]}},
    "_source":["id","updated_at"]
}

3. 您期望得到的结果?

希望能快速查出 1w 个数据

4. 您实际得到的结果?

实际耗时:14753 ms

es
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12

如果ID是ES中的主键,可以用 $params['body']['query']['ids'] = ['values' => array_values($ids)];

1年前 评论
狒狒达人 (楼主) 1年前

array_chunk 拆,再should

1年前 评论

1.数据量是不是太多了,1w条,什么场景下需要直接查这么多,有没有可能分批量查询

  1. 执行的适合有没有检查es上面的负载,如果负载不高,看看是不是网络问题。负载高的话建议还是拆出来分批

一般情况下如果查询,你不可能看那么多吧。导出的话,直接搞成异步就可以了

1年前 评论
狒狒达人 (楼主) 1年前
33qis (作者) 1年前
狒狒达人 (楼主) 1年前
33qis (作者) 1年前

ES 也没那么神奇,如果存储了大量的json 文本,其实这玩意查询范围大,也很慢

1年前 评论

]['query']['ids'] = ['values' => array_values ($ids)] 这种查主键还是很快的,我15亿级别的数据,查询100个id,基本也就是30MS

1年前 评论
狒狒达人 (楼主) 1年前

你先去确定100,或是300条,500条的这种效率, $chunks = array_chunk($ids, 500); foreach ($chunks as $chunk) { yield 获取IDs; }

[另:一次查询一万条ID,不是业务有坑,就是逻辑有坑]

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!