需求是这样的,有现在有千万条数据,以后会增加到上亿调,使用一些字段是文本。 检索的时候是所有字段的组合,而且会用大量的模糊检索。
找了个外包做这个,用 sphinx 做索引,在 50w 不到的数据中查询,复杂一些的查询会用到 40s ……,问一下这个是 sphinx 的极限了,还是外包不会优化………
出现的检索有可能是好几个字段都是模糊的,还有各种 and or 什么的……
1
laoyuan 2016-07-07 12:43:37 +08:00
文本你也说清楚是标题还是内容啊。上 SSD 了吧
|
2
br00k 2016-07-07 13:05:43 +08:00 via iPhone
可以试试 elasticsearch
|
3
coolloves 2016-07-07 13:12:02 +08:00
上 es 吧,以下是刚刚实测的,
111,130,586 hits 的数据,输入关键字也就几秒就检索完了. 三台 dell730 做成的集群 |
4
windfarer 2016-07-07 13:15:12 +08:00 via Android
elasticsearch 集群
|
5
notgod 2016-07-07 13:16:49 +08:00 via iPhone
es 首选 因为你要考虑后期扩容问题
|
6
xiasix 2016-07-07 13:21:54 +08:00
谁告诉你 sphinx 的极限了? 40 秒? 他蒙你的 千万级以内的 sphinx 比 solr 和 els 不管是建立索引还是查询速度都快不止一点半点
|
7
linoder 2016-07-07 13:24:58 +08:00
Apache Solr
|
8
JerryKwan 2016-07-07 13:49:13 +08:00
没有具体的数据,仅从描述中很难判断出是 Sphinx 的问题还是别的导致的,但基本可以肯定的是外包没把工作做好。
在做这类工作的时候,不是选择了某个技术框架就万事大吉了。要根据具体问题具体分析。数据量同查询性能并没有直接关系,要看查询语句是怎么组织的。 |
9
wander2008 2016-07-07 13:58:28 +08:00 via iPhone
明显是做的不好,不要怪 sphinx 。
|
10
zado 2016-07-07 14:04:09 +08:00
用工具什么还要看具体需求,你提供的信息太少。
|
11
islee 2016-07-07 14:17:15 +08:00
我去才 50W 都这样,明显不是 sphinx 的问题
|
12
gejigeji 2016-07-07 14:20:34 +08:00
看能不能按某些字段进行分表
|
13
3dwelcome 2016-07-07 14:28:56 +08:00 via Android
如果是 50w 篇很长文章的全文索引、那其实也正常。
优化的关键在于每个索引不能太小、也不能太大、保证引擎搜索 bloom filter 时、最大效率的命中潜在数据集。 |
14
slixurd 2016-07-07 14:37:27 +08:00
全文搜索的耗时和文章长度没有必然联系。文章长度只会减慢 indexing 时的速度,对于查询时来说没什么区别
SPHINX 没用过我就不说了,至于 LUCENE ,没有用 Bloom Filter ,用的一个 FST ,前缀树的状态机,复杂度是 O(len(query))。 然后说性能慢,不给 PROFILE 数据,不给查询样例都是坑好吧,怎么看得出来为什么慢.... |
15
lianyue 2016-07-07 15:16:03 +08:00
千万数据 mysql 的 like 也才 10 多秒
|
16
lecher 2016-07-07 15:28:44 +08:00 via Android
用 sphinx 建好词库了吗,词库决定了查询的精准度和性能。
单次查询四十多秒应该是不会用 sphinx 的锅,本质上 sphinx 还是聚合数据源的多条 SQL 语句,做缓存以供加速。如果单次查询需要那么久,说明对应的 SQL 语句执行更久,还可能没建好索引。 索引词库要维护一份精准的词库,这个最重要。 内存开了多大,如果内存里面缓存的索引数据足够完整,性能也可以提升很大。 其次数据源存储位置放 SSD 里面也有性能提升。 |
17
SlipStupig 2016-07-07 15:34:01 +08:00
mysql 4G 内存 4CORE CPU 查询在 10 亿数据 50 张表查询 100 个邮箱地址出来,实际就 7-8s 左右, splinx 明显被蒙了
|
18
realpg 2016-07-07 15:38:28 +08:00
我有一个 elasticsearch 集群 节点 100 多个 全是各种报废淘汰 PC 机……
丢在政府的仓库改造的机房里……反正电和网都不要钱 |
19
dong3580 2016-07-07 16:23:46 +08:00
Solr
|
20
isno 2016-07-07 16:33:49 +08:00
给你个数据参考:
单台 sphinx 的, 1 核 1G 内存, 虚拟机, 5~10 的指定属性和模糊, 500 万的数据量, 大概在 0.0xs |
21
qcloud 2016-07-07 17:35:22 +08:00
elasticsearch
|
22
strahe 2016-07-07 17:37:49 +08:00
蒙你的
|
23
yangyaofei OP @laoyuan 有标题也有内容,很多都是长文本
@br00k @coolloves @windfarer @notgod 好的,我去谷歌去了~ @qcloud @xiasix 那个外包比较水,他们根本不懂。。。。。 @linoder 好的,去谷歌了。。。话说这个和 es 区别是啥? @3dwelcome 哦~~关键是需求是前台可以利用基本上所有的类似 sql 的语句进行检索,所以很难去针对检索去优化 @slixurd 其实索引难可以忍受的,关键是建立完索引之后慢。。。还有就是外包更是不懂。我问他们这个问题(瓶颈在哪儿),他们表示不知道。。。。 @lecher 貌似他们用的是 sphinx for chinese 那个项目。。。我确实能确定是 sphinx 的,他们的查询基本上都是用 sphinx 查到 ID 再用 ID 从数据库中拿数据。。。 @SlipStupig 是么。。。。我准备明年有时间了自己重新做系统了已经。。。。 @realpg 这个可以 @strahe 啊?怎么讲? |
24
kn007 2016-07-07 20:52:22 +08:00
关注
|
25
Suclogger 2016-07-07 23:25:46 +08:00
虽然目前量级很小,还是要推荐 elasticsearch
|
26
lecher 2016-07-07 23:38:27 +08:00 via Android
要处理中文词组建索引,基本上都是 sphinx for Chinese 这个项目做的。
sphinx 查到 ID ,再根据 ID 去数据库取数据这个思路并没有大问题,上个内存缓存,按 ID 作为 key 存一下,可以节省一些重复查询的性能。 那你们的业务支持一次 sphinx 查询就取出这个分页的所有数据 ID 了吗? 再深入一点的调优,词库多大,查询的词在不在词库里面,你这次 40 秒的查询,对应的是 sphinx 的什么查询,这个查询出结果耗时多久。 最终根据 ID 去数据库取数据又耗时多久。 外包的团队能不能把执行时间和性能消耗量化出来。如果他们就知道搭个环境直接跑,不知道如何检测分析性能消耗在哪个阶段,那根本没法调优了。 |
27
yangyaofei OP @lecher 外包团队不幸是最后一种…………明年准备自己重做了………
|
28
yaodong 2016-07-08 10:11:56 +08:00
根据实际经验回答, sphinx 完全可以支持这个数据量,并且可以做到很快。
|
29
schoolers 2016-07-11 21:21:57 +08:00
elasticsearch 集群,可以交流一下
|