0

很抱歉交叉发布。以下问题也发布在 Elastic Search 的 google 组中。

简而言之,我试图找出为什么在对包含约 150 万条记录的 ES 索引进行搜索时无法获得最佳性能。

目前,我能够在 2 秒内获得大约 500-1000 次搜索。我认为这应该快几个数量级。目前我也没有使用节俭。

这是我检查性能的方式。

使用 0.19.1 版本的 pyes(从 gi​​thub 尝试了稳定版和开发版) 使用 0.13.8 版本的请求

conn = ES(['localhost:9201'],timeout=20,bulk_size=1000)
loop_start = time.clock()
q1 = TermQuery("tax_name","cellvibrio")
for x in xrange(1000000):
    if x % 1000 == 0 and x > 0:
        loop_check_point = time.clock()
        print 'took %s secs to search %d records' % (loop_check_point-loop_start,x)

    results = conn.search(query=q1)
    if results:
        for r in results:
            pass
#            print len(results)
    else:
        pass

感谢您提供的任何帮助,以帮助我扩大搜索范围。

谢谢!

4

2 回答 2

2

不就是并发的问题吗?

您正在按顺序执行所有查询。所以一个查询必须在下一个可以进入之前完成。如果你有一个 1 毫秒的 RTT 到服务器,这将限制你每秒 1000 个请求。

尝试并行运行脚本的几个实例,看看你得到了什么样的性能。

于 2012-08-26T16:27:43.950 回答
1

使用 pyes 有很多方法可以改善这一点。

  • 首先,尝试摆脱 DottedDict 类/对象,该类/对象用于为您获得的每个结果从每个 json/dict 生成一个对象。
  • 其次将json编码器切换到ujson。

这两件事带来了很多性能。这样做的缺点是您必须使用访问字典的方式而不是点版本(“result.facets.attribute.term”而不是您必须使用类似“result.facets['attribute']['term'] " 或 "result.facets.get('attribute', {}).get('term', None)" )

我通过扩展 ES 类并替换“_send_request”函数来做到这一点。

于 2013-06-04T23:41:16.037 回答