当前位置: 首页 > elasticsearch, 搜索 > 正文

elasticsearch查询优化案例

1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

应用场景:1.5亿条数据,10个分片(shard),3个复制(replicas),3台机器(8 core, 24GB RAM).查询时间在秒内返回,经常大于5秒。

curl -XGET http://188.165.222.156:9200/tweets/_search -d '{"query":{"filtered":{"query": {"match_all":{}}, "filter":{"term":{"text":"house"}}}}, "sort":{"created_at":{"order":"desc"}}}'
curl -XGET http://188.165.222.156:9200/tweets/_search -d '{"query":{"text":{"text":"house"}}, "sort":{"created_at":{"order":"desc"}}}'

分析原因:
1.你是否有足够的内存来运行elasticsearch集群。当排序的时候,它需要加载created_at值到内存中。我建议分配12gb内存给es使用。然后,你为什么需要10个分片(shard),3个复制(replicas),在3台机器上。首先,你最终得到每个分片的4份拷贝。我猜,3是每台机器分片的拷贝吧。在这种情况下,index.number_of_replicas设置为2.

2.在这种情况下,为什么你需要10个分片,特别是如果你想在每个节点拷贝一个副本,更少的分片意味着更少的内存被使用(现在你有10个分片的内存在每个节点上)。

3.你批量添加1.5亿条数据后,应该优化索引。这将优化es需要的内存需求,也就是降低对内存使用。优化下来~5段(max_num_segments in the optimize API)。注意,这是一个重操作,将花费一定时间。

esClient.admin().indices().prepareOptimize(indexName).setMaxNumSegments(5).execute().actionGet();

4.初始搜索请求将花费一些时间,因为它们需要加载created_at的值到内存中。应该将常用的搜索请求,加载进来,进行搜索预热。

本文固定链接: http://www.chepoo.com/elasticsearch-query-optimization-case.html | IT技术精华网

elasticsearch查询优化案例:等您坐沙发呢!

发表评论