我正在使用Elasticsearch - 盆景在我的其中一個Ruby on Rails項目。所以,事情進展得很順利。但是,當我們向最終用戶和人們開始使用該應用程序的那一刻,我們注意到一個彈性搜索查詢需要5-7秒的時間才能做出響應(對我們來說真的是糟糕的體驗) - 雖然,我們有8-2x Web Dynos到位。Rails - Elasticsearch(盆景)和Heroku - 性能問題
所以,我們決定升級盆景附加到盆景10也加入NewRelic的附加(留意在一個查詢需要多少時間作出迴應)
下面是我們的環境設置:
Ruby: 2.2.4
Rails: 4.2.0
elasticsearch: 1.0.15
elasticsearch-model: 0.1.8
所以,我們再次導入數據到Elasticsearch,這裏是我們的ElasticSearch集羣健康:
pry(main)> Article.__elasticsearch__.client.cluster.health
=> {"cluster_name"=>"elasticsearch",
"status"=>"green",
"timed_out"=>false,
"number_of_nodes"=>3,
"number_of_data_nodes"=>3,
"active_primary_shards"=>1,
"active_shards"=>2,
"relocating_shards"=>0,
"initializing_shards"=>0,
"unassigned_shards"=>0,
"delayed_unassigned_shards"=>0,
"number_of_pending_tasks"=>0,
"number_of_in_flight_fetch"=>0}
這表明一個很大的理由擔心NewRelic的數據。
我的模型下面article.rb:
class Article < ActiveRecord::Base
include Elasticsearch::Model
after_commit on: [:create] do
begin
__elasticsearch__.index_document
rescue Exception => ex
logger.error "ElasticSearch after_commit error on create: #{ex.message}"
end
end
after_commit on: [:update] do
begin
Elasticsearch::Model.client.exists?(index: 'articles', type: 'article', id: self.id) ? __elasticsearch__.update_document : __elasticsearch__.index_document
rescue Exception => ex
logger.error "ElasticSearch after_commit error on update: #{ex.message}"
end
end
after_commit on: [:destroy] do
begin
__elasticsearch__.delete_document
rescue Exception => ex
logger.error "ElasticSearch after_commit error on delete: #{ex.message}"
end
end
def as_indexed_json(options={})
as_json({
only: [ :id, :article_number, :user_id, :article_type, :comments, :posts, :replies, :status, :fb_share, :google_share, :author, :contributor_id, :created_at, :updated_at ],
include: {
posts: { only: [ :id, :article_id, :post ] },
}
})
end
end
現在,如果我看的盆景10計劃的Heroku,它給了我20碎片但隨着集羣的當前狀態,它僅使用1個活動主碎片和2個活動碎片。我的腦海中突然出現了一些問題:
- 增加碎片數量到20會有幫助嗎?
- 它可以緩存ES查詢 - 你也建議一樣嗎? - 它有沒有什麼優點和缺點?
請幫我找到減少時間和提高ES工作效率的方法。
UPDATE
這裏的一小段代碼https://jsfiddle.net/puneetpandey/wpbohqrh/2/,我創造了(作爲參考),以顯示究竟爲什麼我需要這麼多的呼叫ElasticSearch
在上面的例子中,我顯示幾個計數(在每個複選框元素的前面)。爲了顯示這些罪名,我需要通過敲擊ES
好了,看完意見後取的我得到的數字,在這裏找到了一個很好的文章:How to config elasticsearch cluster on one server to get the best performace on search我想我已經在
有足夠的重新構造最佳,
普尼特
感謝您的快速回復@尼克..我完全同意你,每個Web請求,我打ES超過100次以獲取頁面中每個屬性的記錄。減少通話總數當然有幫助,我也在考慮你的第三種選擇,其中我可以使用/調用AJAX請求 –
如果你曾經在數據庫調用中處理過「N + 1查詢」問題,這聽起來像你在Elasticsearch中爲自己創建了一個類似的情況:-) –
不幸的是@ nick-zadrozny,我沒有看到任何減少ES調用的選項。這是一小段代碼片段(https://jsfiddle.net/puneetpandey/wpbohqrh/2/)。因爲您會看到在高級搜索中顯示每個屬性的計數,所以我必須查詢ElasticSearch。讓我知道,如果解釋! –