elasticsearch 查询聚合结果排序

    一、查询结果按某个字段进行排序

{
  "size" : 5,
  "query" : {
    "bool" : {
      "filter" : [
        {
          "range" : {
            "startTime" : {
              "from" : 1517046960000,
              "to" : 1517048760000
            }
          }
        }
      ]
    }
  },
  "sort" : [{ "startTime" : { "order" : "desc"}}
  ]
}

//javaApi设置查询数量size和对orderstr进行正序
SearchRequestBuilder srb = this.createSearchRequestBuilder(new Date(begin), new Date(end));
srb.setQuery(queryBuilder).setSize(queryParam.getPageIndex() * queryParam.getPageSize())
									.addSort(orderStr, SortOrder.ASC);

   二、聚合结果进行排序

      1、根据查询到文档数量

聚合结果为查询到文档的数量倒序:"order" : {  "_count" : "desc" }
{"size": 0, 
  "query" : {
    "bool" : {
      "filter" : [
        { "range" : {
            "startTime" : {
              "from" : 1515655800000,
              "to" : 1516865400000
            }
          } },
        { "term" : {
            "type" : {
              "value" : "URL",
              "boost" : 1.0
            }
          } }
      ]
    }
  },
  "aggregations" : {
    "CATEGORY" : {
      "terms" : {
        "field" : "errorCode",
        "size" : 5,
        "order" : {
          "_count" : "desc"
        }
      }
    }
  }
}
//在java代码中不能直接使用“_count” 使用如下的方式查询
TermsAggregationBuilder termsAggBuilder=AggregationBuilders.terms(AggAlias.CATEGORY.getValue()).field(cateGoryFieldName);
termsAggBuilder.order(Terms.Order.count(false)).size(5);
		
     (2)、根据子聚合的结果进行排序
       
{
  "query" : {
    "bool" : {
      "filter" : [
        {
          "term" : {
            "type" : {
              "value" : "URL",
              "boost" : 1.0
            }
          }
        }
      ]
    }
  },
  "aggregations" : {
    "CATEGORY" : {
      "terms" : {
        "field" : "name",
        "size" : 5,
        "order" : {"responseTime.avg" : "asc" }
      },
      "aggregations" : {
        "responseTime" : {
          "extended_stats" : {
            "field" : "durationInMillis",
            "sigma" : 2.0
          }
        },
        "error" : {
          "sum" : {
            "script" : {
              "inline" : "def errorTemp=doc['status'].value; if(errorTemp=='0'){return 0;}else{return 1;}",
              "lang" : "painless"
            }
          }
        },
        "apdex" : {
          "avg" : {
            "script" : {
              "inline" : "def responseTemp=doc['durationInMillis'].value; if(responseTemp>params.threshold){return 0.5;}else{return 1;}",
              "lang" : "painless",
              "params" : {
                "threshold" : 20.0
              }
            }
          }
        },
        "errorRate" : {
          "percentile_ranks" : {
            "script" : {
              "inline" : "def errorTemp=doc['status'].value; if(errorTemp=='0'){return 1;}else{return 0;}",
              "lang" : "painless"
            },
            "values" : [
              0.0
            ],
            "keyed" : true,
            "tdigest" : {
              "compression" : 100.0
            }
          }
        }
      }
    }
  }
}
   
     
//注意根据上面的语句传入的参数应该是  orderStr===responseTime.avg   ascOrder=true  
AggregationBuilders.terms(AggAlias.CATEGORY.getValue()).field(categoryfieldName).order(Terms.Order.aggregation(orderStr,ascOrder)).size(size)
   小伙伴们,如果有其他的排序方式,欢迎一起讨论。

猜你喜欢

转载自blog.csdn.net/zhangkang65/article/details/79163005