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
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《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年前 评论