600W 数据量存 ES, 64G 内存+机械盘, ES 占用 32G 内存,查询时间 300ms~400ms 正不正常?

2018-08-31 10:24:13 +08:00
 alwayshere
  1. 一个页面 300ms~400ms 的查询时间会不会影响 SEO ?
  2. 对于 text 字段我都设 fielddata:true,这样的话 600W 数据量应该全部在内存中吧,为什么在内存中查询时间还是这么慢?就不能控制在 100ms 以下?
  3. 既然已经设为 fielddata:true,在内存中搜索,同一个关键词第一次搜索 300~400ms,重新搜索该关键词,马上控制在 50ms 以下了?试了很多关键词都这样
3539 次点击
所在节点    程序员
12 条回复
Morriaty
2018-08-31 10:41:51 +08:00
1. 集群几个 nodes ?索引几个 shards ?什么样的 mapping ?什么样的 query ?
2. fielddata 是为了 text 类型做 agg 用的
3. es 有缓存
alwayshere
2018-08-31 11:13:57 +08:00
@Morriaty 就单机版,'number_of_shards' => 1,'number_of_replicas' => 1,就简单的在两个 text 字段中查询,然后按照一个 integer 字段进行 function score 排序,field_value_factor modifier 是 log1p,boost_mode 是 multiply
tongxiaomu
2018-08-31 11:19:43 +08:00
首次检索的时间用时有些不正常,600W 数据,简单的 query 查询应该在 100~200ms 左右,至于第二次查询为什么时间很低,基本上是 10+-ms 的级别,建议 lz 先了解下 es 的缓存机制,就类似于 mysql 查询其实也会有缓存的,多了解下这个对以后查询优化也是有帮助的。
Morriaty
2018-08-31 11:42:04 +08:00
@alwayshere 改成四个分片,over
alwayshere
2018-08-31 13:13:47 +08:00
@Morriaty 谢谢,刚刚研究了一下 ES 的文档,是不是可以猜想为 CPU 有多少个核,分片数就该有多少?比如我的服务器目前是 4 核 8 线程,是不是该设置成'number_of_shards' => 4,'number_of_replicas' => 1
alwayshere
2018-08-31 13:25:21 +08:00
@Morriaty 数据量不大,就 8G 左右的数据
misaka19000
2018-08-31 13:27:32 +08:00
单机可以把 R 分片设为 0
daigouspy
2018-08-31 13:28:38 +08:00
@alwayshere 才 8g 数据,全部扔内存里也不至于那么慢吧?
alwayshere
2018-08-31 17:28:06 +08:00
@daigouspy 我就是用 fielddata:true,这样把 text 字段全扔内存啊,有没有其他方式可以让 ES 将所有数据常驻内存?
owenliang
2018-08-31 20:14:05 +08:00
机械盘血亏
winglight2016
2018-08-31 21:00:52 +08:00
使用默认配置都不会这么慢啊,我在本地 pc 上默认安装,数据 800 多万条,3.6g ,随便条件查询一下只要 7ms,只有全匹配才会用到 400-500ms

另外,java 内存可以看看设置了多少,能不能调大一点
wsc449
2018-09-01 00:40:50 +08:00
客户数据 1 千万+,存储在单台 2 核 8g 内存下查询不超过 500 毫秒,3 台集群下并发查询和更新效率更好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/484812

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX