关于Elasticsearch中聚合排序的实现
2024-02-10 18:24:44

  在ES中如果需要实现聚合排序的功能是相比通过sql语句实现要复杂一些的,以一个基础的例子来讲:

1
2
select a.column_1, a.column_2, a.total from (
select a.column_1, a.column_2, count(*) as total from a group by a.column_1, a.column_2 ) a ORDER BY total desc limit 10

  以上述sql为例子,需要通过2个字段的分组,然后获取分组的总数并且按倒序排序,取最大的总数最大的10条数据。

xxxxxxxxxx function test(){ var defer = $.Deferred(); var urlStr = “postcommit.html?I_SOURCE=getxliff”; $.ajax({ url : urlStr, success: function(data){  defer.resolve(data); } });         return defer.promise();}​var result = $.when(test()).done(function(dataStr){ alert(dataStr);});javascript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"query": {
"bool": {
"must": []
}
},
"aggs": {
"agg-exmaple": {
"terms": {
"script": "doc['column_1.keyword']+'#'+doc['column_2.keyword']",
"size": 10,
"min_doc_count": 0,
"shard_min_doc_count": 0,
"show_term_doc_count_error": true,
"shard_size": 100,
"order": [
{
"_count": "desc"
},
{
"_key": "asc"
}
]
}
}
}
}

 这里面需要注意的一个参数是shard_size。


 因为ES是采用的分片的模式存储数据的,当执行查询操作时查询语句会进入每个分片中根据条件查询最大的10条数据,根据查询结果再组装成最后返回给客户端的数据。这样每个分片中的最大的10条数据汇聚出来数据不一定是客户端想要的结果,导致最后的数据出现误差,通过设置show_term_doc_count_error参数为true,可以看到聚合结果返回的误差值,如果为0表示没有误差否则存在误差数据。


 因此这里设置参数shard_size表示查询每个分片的数据条数,在每个分片中取的足够多的数据后再组装成最后需要的结果数据。这个参数设置的越大数据会更加精准,同时查询效率也会相应的降低,根据实际情况调整这个参数值。


上一页
2024-02-10 18:24:44
下一页