2012-08-22 89 views
0

对不起,您可以在Elastic Search的谷歌组发布以下问题。使用pyes的弹性搜索性能

总之,我试图找出为什么我不能在包含大约1.5万条记录的ES索引上进行搜索时获得最佳性能。

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

下面是我如何检查性能。

使用0.19.1版本pyes的(从GitHub试图稳定和开发版本) 使用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

是不是只是一个并发问题?

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

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

1

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

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

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

我通过扩展ES类并替换了”_send_request“函数。