由于公司需求,要我通过es去帅选数据,公司也没人会,只好自己慢慢摸索,期间碰到不少坑,现在记录下来:
1:分组查询(比如按字段:orderId)时报:
java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default. Set fielddata=true on [orderid] in order to load fielddata in memory by uninverting the inverted index.
这是因为5.x+版本默认关闭了文本字段,防止占用过多空间,需开启fielddata:
{
"properties": {
"interests": {
"type": "text",
"fielddata": true //不建议
}
}
}
现在我们是用的Java操作,只需在你需要分组的字段后面加上 .keyword 就可以了。如
.addAggregation(AggregationBuilders.terms("orderId_Term").field("orderid.keyword")
2:es默认只显示10条记录的问题
我们查找出的数据默认只显示10条,要想显示所有的呢?1·可以设置size,不灵活。2·通过scroll,即游标。代码如下:
SearchResponse response = client.prepareSearch("responseqrcodes") .setScroll(new TimeValue(60000)).get();
也就是说在在1min内保持scroll打开状态,setScroll("1m")参数也可这样写,即1分钟。最后获取的时候就可以:
do {
for (SearchHit hit : scrollResp.getHits().getHits()) {
//Handle the hit...
}
response = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
} while(scrollResp.getHits().getHits().length != 0); //所有数据读取完毕则退出循环。
---------------------------------------------------------------------------------------------------------------------------
下面贴一段完整代码:
private static void executeSearch(TransportClient client) { SearchResponse response = client.prepareSearch("index") .setScroll(new TimeValue(60000)) .setTypes("type") .setQuery(QueryBuilders.matchAllQuery()) .setPostFilter(QueryBuilders.rangeQuery("money").gt(1).lt(100)) //金额大于1小于100 // .setQuery(QueryBuilders.matchQuery("id", "1")) //id等于1 .addAggregation(AggregationBuilders.terms("c_term").field("country.keyword") //按国家分组 // .order(Terms.Order.aggregation("moneySum", false)) //按总金额降序排序 true:升序 .subAggregation(AggregationBuilders.sum("moneySum").field("money")) //对应的总金额 .subAggregation(AggregationBuilders.avg("moneyAvg").field("money")) //平均金额 ) // .setFrom(0).setSize(20) //分页,20条 .addSort("id", SortOrder.ASC) //按id升序排序 .get(); Terms terms = response.getAggregations().get("c_term"); List<Terms.Bucket> buckets = terms.getBuckets(); for (Terms.Bucket bucket : buckets) { Sum salarySum = bucket.getAggregations().get("moneySum"); Avg moneyAvg = bucket.getAggregations().get("moneyAvg"); System.out.println(bucket.getKey() + "----" + salarySum.getValue() + "=======" + moneyAvg.getValue()); System.out.println(bucket.getKey() + "--->" + bucket.getDocCount()); } SearchHits hits = response.getHits(); long totalHits = hits.getTotalHits(); System.out.println("总数:" + totalHits); SearchHit[] searchHits = hits.hits(); do { for (SearchHit searchHit : searchHits) { System.out.println(searchHit.getSourceAsString()); } response = client.prepareSearchScroll(response.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); } while (response.getHits().getHits().length != 0); //零点击标记滚动结束和while循环。 }