我正在使用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。让我知道,如果解释! –