使用pyes的弹性搜索性能

时间:2012-08-22 18:21:20

标签: python elasticsearch pyes

抱歉交叉发布。以下问题也发布在Elastic Search的谷歌小组。

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

目前,我可以在2秒内获得大约500-1000次搜索。我认为这应该是更快的数量级。目前我还没有使用节俭。

以下是我检查效果的方法。

使用0.19.1版本的pyes(从github尝试了stable和dev版本) 使用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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

这不只是并发问题吗?

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

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

答案 1 :(得分:1)

使用染料有很多方法可以改善它。

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

这两件事带来了很多表现。 这有你的缺点 必须使用方法来访问dicts而不是点缀版本(“result.facets.attribute.term”而不是你必须使用像“result.facets ['attribute'] ['term']”或“result.facets”这样的东西。 .get('attribute',{})。get('term',None)“)

我是通过扩展ES类并替换“_send_request”函数来完成的。