elasticsearch5.6.6,java,RestHighLevelClient,使用路由(routing)后更慢了
Elasticsearch | 作者 xys2333 | 发布于2018年05月18日 | 阅读数:6702
ES5.6.6版本,使用RestHighLevelClient,java客户端,centOs6.5安装elasticsearch5.6.6
批量索引bulk
IndexRequest indexRequest = new IndexRequest("indexName", "type").source(indexJson).routing("user");
BulkRequest bulkRequest = new BulkRequest();
for (int i=0;i<5*10000;i++) {
bulkRequest.add(indexRequest);
}
hClient.bulk(bulkRequest);
***************************************************************************************************
查询时
BoolQueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("type", "type2"));
;
TermsAggregationBuilder aggregation3 = AggregationBuilders
.terms("by_column1").field("column1")
.subAggregation(
AggregationBuilders.topHits("top")
.sort("column2", SortOrder.DESC)
.size(1)
)
.subAggregation(
AggregationBuilders.min("maxcolumn2").field("column12")
)
.order(Order.aggregation("maxcolumn2", false))
.size(10000)
;
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(qb).aggregation(aggregation3);
for(int i=0;i<100;i++){
long start =System.currentTimeMillis();
SearchRequest searchRequest = new SearchRequest("indexName");
searchRequest.types("type");
searchRequest.source(sourceBuilder).routing("user");
SearchResponse response = client.search(searchRequest);
long end =System.currentTimeMillis();
System.out.println(end-start);
}
*****************************************************************************************
集群信息:
机器信息:2台机器,每台32G机器内存,ES内存已改16G,CPU4: E5 2630L v2 4核
2个节点,1master,1data
3个索引,索引A(3分片,1副本,没用路由),索引B(3分片,2副本,使用路由user),索引C(3分片,1副本,使用路由user)
索引A,B,C的mapping都一样,大概有25个字段,都是keyword,long,date类型。
查询效率:
在1000W数据时,连续查询100次,取平均值AVG
索引A 257.31ms,索引B 728.09ms,索引C 721.54ms
在1亿数据时,连续查询100次,取平均值AVG
索引A 2419.13ms,索引B 6693.77ms,索引C 6678.25ms
总结:
不是副本数量越大,查询效率越高吗?但是为什么现在实验结果是相反的。
另外添加路由后,不是查询会更快了吗?
批量索引bulk
IndexRequest indexRequest = new IndexRequest("indexName", "type").source(indexJson).routing("user");
BulkRequest bulkRequest = new BulkRequest();
for (int i=0;i<5*10000;i++) {
bulkRequest.add(indexRequest);
}
hClient.bulk(bulkRequest);
***************************************************************************************************
查询时
BoolQueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("type", "type2"));
;
TermsAggregationBuilder aggregation3 = AggregationBuilders
.terms("by_column1").field("column1")
.subAggregation(
AggregationBuilders.topHits("top")
.sort("column2", SortOrder.DESC)
.size(1)
)
.subAggregation(
AggregationBuilders.min("maxcolumn2").field("column12")
)
.order(Order.aggregation("maxcolumn2", false))
.size(10000)
;
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(qb).aggregation(aggregation3);
for(int i=0;i<100;i++){
long start =System.currentTimeMillis();
SearchRequest searchRequest = new SearchRequest("indexName");
searchRequest.types("type");
searchRequest.source(sourceBuilder).routing("user");
SearchResponse response = client.search(searchRequest);
long end =System.currentTimeMillis();
System.out.println(end-start);
}
*****************************************************************************************
集群信息:
机器信息:2台机器,每台32G机器内存,ES内存已改16G,CPU4: E5 2630L v2 4核
2个节点,1master,1data
3个索引,索引A(3分片,1副本,没用路由),索引B(3分片,2副本,使用路由user),索引C(3分片,1副本,使用路由user)
索引A,B,C的mapping都一样,大概有25个字段,都是keyword,long,date类型。
查询效率:
在1000W数据时,连续查询100次,取平均值AVG
索引A 257.31ms,索引B 728.09ms,索引C 721.54ms
在1亿数据时,连续查询100次,取平均值AVG
索引A 2419.13ms,索引B 6693.77ms,索引C 6678.25ms
总结:
不是副本数量越大,查询效率越高吗?但是为什么现在实验结果是相反的。
另外添加路由后,不是查询会更快了吗?
2 个回复
yayg2008
赞同来自: medcl
routing 的作用是让ES使用我们提供的标志去hash,将数据存储到哪个分片,此处你使用的是user,那么你去查看你的data分布,应该会集中在1个分片中,而不是均衡分布。routing的好处是查询时,可以通过routing告诉ES直接去哪个分片获取数据,而不用查询所有分片,然后再进行汇总。
xys2333 - 90
赞同来自:
A索引(没路由,3分片,1副本),数据总量:3000W,其中要查询的数据有1000W(分散在3个分片里)
B索引(指定路由,3分片,1副本),数据总量:3000W,其中要查询的数据有1000W(都在一个分片里)
注:A,B索引的每个分片的数据都是1000W
查询语句同上,时间:
A:328.22ms
B:816.96ms
总结:
同样在一个索引的3000W数据里找1000W数据,使用了路由比没使用路由更慢。
在第一次的ABC,3个索引的案例里,索引使用路由,都是数据集中在一个分片,其他分片数据量为0的情况下测试。
现在在同样的数据量分布情况下,使用路由还是更慢了。
有人能告诉我是什么原理吗?