2012-08-22 87 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「函數。